目录
1(多态polymorphic)
1.1(基本介绍)
1.2(多态的具体体现)
animal对象引用最开始指向的对象是Dog,当new一个猫之后,animal就指向了cat,所以运行类型就变成了猫
1.3(注意事项与细节)
1.3.1(细节1---向上转型)
1.3.1.1
父类的父类也是子类的父类
1.3.1.3
catchMouse是子类cat的特有成员,所以不可调用
1.3.2(细节2---向下转型)
(2)详解1.3.1.1图 --> animal原本指向cat(其目标类型的对象)(animal编译类型是animal但运行类型是cat,相当于是披着狼皮的羊,其本质就是cat),但是不能调用cat的特有成员catchMouse,所以将其向下转型成cat就可以访问catchMouse了。--> 下一句话Dog dog = (Dog) animal,就相当于让一个“猫”(animal)变成一只狗,这是不可能的,两个子类是没有任何关系的
1.3.3(细节3)
1.3.4(细节4)
public class detail_ {
public static void main(String[] args) {
BB bb = new BB();
System.out.println(bb instanceof BB); //true
System.out.println(bb instanceof AA); //true
//aa 的编译类型是AA, 运行类型是BB
AA aa = new BB();
System.out.println(aa instanceof AA); //true
System.out.println(aa instanceof BB); //true
Object obj = new Object();
System.out.println(obj instanceof AA); //false
String str = "hallo";
//System.out.println(str instanceof AA); //直接报错,二者无关
System.out.println(str instanceof Object); //true
}
}
class AA {} //父类
class BB extends AA {} //子类
1.4(练习题)
最后两行分析
- b.count ---> 成员变量(属性)---> 看b的编译类型
- b.display() ---> 成员方法 ---> 方法调用 ---> 看b的运行类型(看b实际指向哪个空间,b指向s,s指向sub)
- 总结:属性(成员变量)不具备多态性,方法具备多态性
1.5(动态绑定机制)
java中超级无敌重要的的特性
首先:如图片简单看到可知,答案为40和30
然后:注释掉B中的sum和sum1,结果为什么呢?30和20
解释:a的编译类型是A,运行类型是B
- 调a.sum(),先去看运行类型B,B类没有,所以去找父类A。A中有sum(),其return getI() + 10的getI()方法会和运行类型B绑定,(即:java的动态绑定机制因为a的运行机制是B,所以调用子类B的getI()方法),B的getI()返回属性i(属性没有动态绑定机制所以返回子类i的20)。所以return 的 getI() + 10 = 20 + 10 = 30。
- 调a.sum1(),先去看运行类型B,B类没有,所以去找父类A。A中有sum1(),其返回属性i + 10,属性没有动态绑定机制,所以结果是 10 + 10 = 20。
- 注:属性没有动态绑定机制,哪里声明就去哪里找,如果没有就继承机制去找。