1.一个对象的编译类型和运行类型可以不一致
2.编译类型在定义对象时,就确定了,不能改变
3.运行类型时可以变化的
4编译类型看定义时 = 号的左边,运行类型看 = 号的右边
Animals animals=new Dog();
animals编译类型是Animals,运行类型是animals
多态的向上转型
多态的前提:两个对象(类)存在继承关系
(1)本质:父类的引用指向子类的对象
(2)语法:父类类型 引用名 = new 子类类型();
(3)特点:编译类型看左边,运行类型看右边;
可以调用父类中所有成员(对象,方法…)(需要遵守访问权限)
不能调用子类中特有的成员
最终运行效果看子类的具体体现
package Poly_.detail;
public class PolyDetail {
public static void main(String[] args) {
//向上转型
Animal animal=new Cat();
System.out.println("ok~~");
//因为在编译阶段,即调用哪些成员,是由编译类型决定的
//animals.catchMouse()错误
//最终运行效果看子类的具体实现,即调用方法时,按照从子类开始查找方法
//然后调用,规则同前面讲的方法调用一致
animal.eat();
animal.run();
animal.show();
}
}
package Poly_.detail;
public class Animal {
String name="动物";
int age=10;
public void sleep(){
System.out.println("睡");
}
public void run(){
System.out.println("跑");
}
public void eat(){
System.out.println("吃");
}
public void show(){
System.out.println("hello ,你好");
}
}
package Poly_.detail;
import Super.A;
public class Cat extends Animal {
public void eat(){
System.out.println("猫吃鱼");
}
public void catMouse(){
System.out.println("猫抓老鼠+");
}
}
多态的向下转型
(1)语法 :子类类型 引用名 = (子类类型) 父类引用
(2) 只能强转父类的引用,不能强转父类的对象
(3)要求父类的引用必须指向当前目标类型的对象
(4)当向下转型后,可以调用子类类型中所有成员
//多态的向下转型
//语法:子类类型 引用名=(子类类型) 父类引用;
//cat的编译类型Cat,运行类型是Cat
Cat cat=(Cat) animal;
cat.catMouse();
}
}