java多态父类引用指向子类对象为什么不能调用子类特有的方法?
我们在学习java面向对象时都会发现当父类引用指向子类对象不能调用子类特有的方法
首先我们需要了解一下java多态的具体体现
1.一个对象的编译类型和运行类型可以不一致
2.编译类型在定义对象时就确定了,无法改变
3.编译类型看定义时候 =等于号的左边 运行类型看等号右边
下面举一个例子来说明:
在这里定义一个动物类,再定义一个鸟类继承自动物类
public class Anmial { //定义一个动物类
int age = 10;
String name = "1234";
public String getName(){
return this.name;
}
public String getAge() {
return age;
}
}
public class Bird extends Anmial {
int age = 20;
String name = "Bird name";
public String getName() {
return name;
}
public String getAge() {
return age;
}
public void fly(){ //bird
System.out.println("鸟会飞");;
}
}
public class Test {
public static void main(String[] args) {
Anmial anmial = new Bird();
System.out.println(anmial.age); //20
anmial.fly(); //报错
}
}
这是因为在javac编译时发现anmial这个父类中并没有fly这个方法
代码执行是先编译后运行虽然运行类型是Bird但是在编译已经没法通过了
举一个生活中的例子,猫狗鸟都是动物 鸟会飞是一个独特的不能说动物类都会飞
可以稍微改一下
public static void main(String[] args) {
Anmial anmial = new Bird();
System.out.println(anmial.age); //20
((Bird) anmial).fly(); //鸟会飞
}
}
什么意思呢? (向下转型 ) 把anmial这个父类指向强制转为Bird类
而刚刚 下面这段代码就是典型的向上转型
Anmial anmial = new Bird();
相关文章
暂无评论...