多态:子类的对象可以代替父类的对象使用
在多态情况下, 一个引用类型的变量如果声明为父类的类型, 但实际引用的是子类对象,则该变量就不能访问子类中添加的属性和方法。
可是如果此时调用的是父类中声明过,且在子类中又重写过的方法,情况又将如何?
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(); } }
原文:http://blog.csdn.net/u011263966/article/details/19994185