JAVA多态的理解

面向对象的三大特性:封装、继承、多态,其中最难理解的就是多态

以下是网上某大神给的一个例子:

1.继承关系

class A {
         public String show(D obj){
                return ("A and D");
         }   
         public String show(A obj){
                return ("A and A");
         }
}
class B extends A...{
         public String show(B obj){
                return ("B and B");
         }
         public String show(A obj){
                return ("B and A");
         }
}  
class C extends B {}   
class D extends B {}

2. 测试

public class Test {
    public static void main(String[] args) {
        A a1 = new A();
        A a2 = new B();
        B b = new B();
        C c = new C();
        D d = new D();
        System.out.println(a1.show(b));    //1
        System.out.println(a1.show(c));    //2
        System.out.println(a1.show(d));    //3
        System.out.println(a2.show(b));    //4
        System.out.println(a2.show(c));    //5
        System.out.println(a2.show(d));    //6
        System.out.println(b.show(b));    //7
        System.out.println(b.show(c));    //8
        System.out.println(b.show(d));    //9
    }
}

3. 输出结果

A and A    //1
A and A    //2
A and D    //3
B and A    //4,这是要理解的重点
B and A    //5,这是要理解的重点
A and D    //6
B and B    //7
B and B    //8
A and D    //9

4. 理解

    class A{}
    class B extends A{}
    A a = new B();
    /*
     * 1. 上面的结果是产生了一个 A 类对象,虽然实际上传递过来的是 B 类对象(向上转型)
     * 2. 此时 a 只能调用 A 类中的方法,而看不到B类中的【特有】方法
     * 3. 如果 B 中复写了 A 类中的某些方法,那么此时 a 能调用到的都是被复写的方法
     *
     * 形象一点就是 B 偷偷换了 A 中的一些方法,此时的 a 并不知道!
     */
时间: 2024-10-05 05:05:53

JAVA多态的理解的相关文章

对java多态的理解

java多态,如何理解父类引用指向子类对象 要理解多态性,首先要知道什么是"向上转型". 我定义了一个子类Cat,它继承了Animal类,那么后者就是前者是父类.我可以通过 Cat c = new Cat(); 实例化一个Cat的对象,这个不难理解. 但当我这样定义时: Animal a = new Cat(); 表示定义了一个Animal类型的引用,指向新建的Cat类型的对象.由于Cat是继承自它的父类Animal,所以Animal类型的引用是可以指向Cat类型的对象的. 那么这样做

考考你对java多态的理解

请看如下代码, 如果你能不运行得出正确答案, 那你真的超过99%的java程序员了. [本人属于最大头的那部分] public class A{ public String s = "A"; public void setS(String s){ this.s = s; } public String getS(){ return this.s; } } public class B extends A{ public String s = "B"; public

Java中的继承、封装、多态的理解

Java中的继承.封装.多态 继承的理解: 1.继承是面向对象的三大特征之一,也是实现代码复用的重要手段.Java的继承具有单继承的特点,每个子类只有一个直接父类. 2.Java的继承通过extends关键字来实现,实现继承的类被称为子类,被继承的类称为父类(有的也称其为基类.超类),父类和子类的关系,是一种一般和特殊的关系.就像是水果和苹果的关系,苹果继承了水果,苹果是水果的子类,水果是苹果的父类,则苹果是一种特殊的水果. 3.Java使用extends作为继承的关键字,extends关键字在

java中对于多态的理解

面向对象: 类:具体的对象抽象而来,可以抽象的表示一类具有相同特征和行为的对象 对象:是由类的实例化而来,对象是类的一个实例 java中关于多态的理解 打个比方 父亲person有行为这个方法,里面包括几个动作:吃饭,睡觉,走路 父亲有三个儿子,三个儿子都继承了父亲的行为方法,所以三个儿子都有吃饭,睡觉,走路这些动作,但是三个儿子又分别有自己的动作--大儿子A会弹吉他,二儿子B会唱歌,三儿子C会打鼓 ... 1.Person person = new A(); 不是父类对象指向子类引用而是父类引

关于java的this、继承、多态的理解

今天主要学习的内容是关于this.继承.多态的理解,并对其作出总结. 1.This 就目前来说,从个人的实验来看,this主要是对于一个类的对象的引用.它出现的位置主要是以它出现的形式决定的. ①.this(参数类型)这是在在构造方法中调用重写的构造方法. ②.作为某个类的对象来调用类中属性或方法.(用在某个类中的成员方法,因为某个类的对象就可以通过.来调用) 2.extends 继承之前已经了解了一些,接下来就是进一步的总结. ①.protected类型的变量是适合子类和父类之间的使用的,即使

深入理解Java多态机制

从字节码层面来看,Java中的所有方法调用,最终无外乎转换为如下几条调用指令. invokestatic: 调用静态方法. invokespecial: 调用实例构造器<init>方法,私有方法和父类方法. invokevirtual: 调用所有的虚方法. invokeinterface: 调用接口方法,会在运行时再确定一个实现此接口的对象. invokedynamic: 调用动态方法.JDK 7引入的,主要是为了支持动态语言的方法调用. JVM提供了上述5条方法调用指令,所以不妨从字节码层面

Java入门——深入理解Java三大特性

Java入门——深入理解Java三大特性 本Blog内容: 封装 继承 多态 封装 封装把一个对象的属性私有化,同时提供一些可以被外界访问的属性的方法(getter,setter),如果不想被外界方法,我们大可不必提供方法给外界访问. 封装确实可以使我们容易地修改类的内部实现,而无需修改使用了该类的客户代码. 可以对成员变量进行更精确的控制.(在setter方法中进行实际意义的校验) 总结:控制属性访问权限,不是你想改就能改.容易修改属性类型.精确控制属性的取值范围. 继承 继承是使用已存在的类

Java多态的学习

首先,我要说明的是,继承.封装.多态并不是针对JAVA,c#或者其他某种语言产生的,它是面向对象思想下产生的一个概念. 让我自己说的话,我只能用三句话来描述(不知道对不对,请高手指点): * 继承:使得子类继承父类的属性和方法,也可以使用父类的功能. * 封装:将具体实现隐藏,只留给用户使用的接口. * 多态:相似类型在使用同一基类方法时,可以表现出与基类不同的行为. 一直记不住这些概念,百度了下,放在这供参考: 1.继承(inheritance)     继承是使用已存在的类的定义作为基础建立

多态的理解

今天有开始对多态的理解加深了,基础不好的话看别人的程序很麻烦了,要不断地测试,测试--然后想想为什么,为什么--等过了一两年再看原来的基础代码的时候友开发犯迷糊了,又开始犯迷糊,然后测试测试--回忆一下为什么这样那样--     Father{      视察(){          System.out.println("大家好好工作啊,你们辛苦了!");          System.out.println("基层的每个官员给我贿赂300块大洋,我保你们平安"