Animal a1 = new Dog();
父类型引用==>指向 子类型引用
引用==>对象
自动类型转换(向下转换)用抽象转向更具体。
只有在继承的情况下,栈堆类型可以不一致且产生关系。栈中是父类,堆中是子类。
方法有没有实现调用取决于有没有重写该方法,如果该方法不在子类中出现就调用父类方法,如果出现就调用子类方法。
@Override重写
1.只发生在继承中。
2.方法头一定不能变(Copy)【只改变逻辑体内容,其他一律不变】
编译时,编译器只看a1有没有eat()方法,有:pass;没有:报错。
绑定父类eat()方法。静态绑定
运行时,先看子类中有没有该方法,有:实现;没有:从父类中调用该方法。动态绑定
多态是指一个方法的两种形态,编译和运行中是两种形态
Dog wc = (Dog)a1;
wc.guard();
//((Dog)a1).guard;
//wc比a1更大 强制类型转换(向上转型)
public class test00{
public static void main(String[] args){
Animal a1 = new Dog();//a1是Animal类型的Dog
a1.eat();
((Dog)a1).guard();//强转
//Dog wc = (Dog)a1; 旺财
//wc.guard();
}
}
class Animal{
private int id;
private String name;
public Animal(){}
public Animal(int id,String name){
this.id = id;
this.name = name;
}
public void eat(){
System.out.println("Animal eat food");
}
public void eat(String food){
System.out.println("Animal eat"+food);
}
}
class Dog extends Animal{
//Dog is a Animal
private int id;
private String name;
public Animal(){}
public Animal(int id,String name){
this.id = id;
this.name = name;
}
public void eat(){
System.out.println("Dog eat bone");
}
public void guard(){
System.out.println("Dog guard gate");
}
}