多态:子类的对象可以代替父类的对象使用
在多态情况下, 一个引用类型的变量如果声明为父类的类型, 但实际引用的是子类对象,则该变量就不能访问子类中添加的属性和方法。
可是如果此时调用的是父类中声明过,且在子类中又重写过的方法,情况又将如何?
1.创建Animal父类
public class Animal {
//成员属性
public String name;
//构造器
public Animal() {
System.out.println("---------animal构造器--------");
}
//成员方法
public void fly(){
System.out.println("---animal----fly---");
}
}
2.创建Bird子类
public class Bird extends Animal{
public String sex;
public Bird() {
System.out.println("----Bird构造器----------");
}
@Override
public void fly() {
//super.fly();
System.out.println("----Bird----fly---");
}
public void fly(float speed){
}
}
3.创建测试类
public class TestDemo {
public static void main(String[] args) {
// 在实例化子类的对象时,必须先实例化祖先
/*
* Bird b = new Bird();
*
* b.fly();//调用的是Bird的方法
*/
/*
* Animal animal = new Animal();
*
* animal.fly();//调用的是Animal的方法
*/
// 调用子类中的重写方法
/*
* Bird bird = new Bird();
*
* if(bird instanceof Animal){
Animal animal = bird; animal.fly();
}
*/
// 父类的对象不能当作是一个子类的对象来使用
/*
* Animal animal = new Animal();
* Bird bird = (Bird) animal;
*/// 从父类到子类
// bird.fly();
// 声明的是一个Animal对象,但是实际引用的是Bird的对象
Animal animal = new Bird();
// 把animal对象转换成 Bird对象的时候,需要强制造型的.
Bird bird = (Bird) animal;
bird.fly();
}
}