interface A{
public void eat();
}
class Person implements A{
public void eat(){
System.out.println("人吃饭");
}
public void person(){
System.out.println("人是属于高级动物");
}
}
class Dog implements A{
public void eat(){
System.out.println("狗吃狗粮");
}
public void kan(){
System.out.println("狗还会看家");
}
}
public class DuoTai{
public static void main(String[] args){
//向上转型,将子类类型隐藏,或不用使用子类的特有方法。
A a = new Dog(); //自动类型提升,但是子类特有功能无法访问
fun(a);
// Person p = (Person) a;//向下转型
// p.person();//现在就可以访问Person类中的特有方法了
}
public static void fun(A a){
a.eat();
if(a instanceof Person){//instanceof:用于判断对象的具体类型,只能用于引用数据类型判断。
//通常在向下转型前用于健壮性的判断。
Person p = (Person) a;
p.person();
}
else if(a instanceof Dog){
Dog d = (Dog) a;
d.kan();
}
}
}
/*
如果要想访问子类特有功能必须使用向下转型,向下转型的目的就是为了使用子类的特有方法
ClassCastException(类型转换异常)
注意:对于转型,自始至终都是子类对象在做着类型的变化。
多态时,
成员的特点:
1,成员变量:
编译时:参考引用型变量所属的类中的是否有调用的成员变量,有编译通过,没有,编译失败。
运行时,参考引用型变量所属的类中的是否有调用的成员变量,并运行该所属类中的成员变量。
简单说,编译和运行都参考左边。
2,成员函数(非静态):
编译时,参考引用型变量所属的类中是否有调用的函数。有,编译通过,没有,编译失败。
运行时:参考的时对象所属的类中是否有调用的函数。
简单说:编译看左边运行看右边。
3,静态函数:
编译时:参考引用型变量所属的类中是否有调用的静态方法。
运行时:参考引用型变量所属的类中是否有调用的静态方法。
简单说,编译和运行都看左边。
其实对于静态方法,是不需要对象的,直接用雷鸣调用即可。
*/
Java中的多态
最新推荐文章于 2022-10-05 07:30:46 发布