父类引用指向子类对象:假设我有一个Animal类,和一个Dog类,则:Animal animal = new Dog();此为父类引用指向子类对象
1.为什么要用父类的引用指向子类的对象?
有句话我觉得很精辟:现在写的代码,被将来的代码调用,这都不算事。现在写的代码,能调用将来的代码,这才牛逼勒。
具体来说:假如有一个类,这个类需要实现吃各种水果的方法。那如果我们在类里面定义方法:
public void eat(Banana banana) { }
public void eat(Apple apple) { }
。。。。。。
这样就显得很麻烦,但要是我要是把这个方法写成: public void eat(Fruit fruit){} 这样只要继承Fruit或者实现Fruit接口,就都可以作为eat的参数。这样就简化了程序。
再比如:
写一个画图程序的时候,你想画方,画圆,画线。方,圆,线都属于Shape类型。那么就应该有
class Shape{}
class Fang extends Shape{}
class Yuan extends Shape{}
class Xian extends Shape{}
然后把他们画出来的方法在某个类里,这个方法接收一个图形,不管是什么样的形状,你只要给我一个图形,我就可以把它画出来,public void draw();
子类里面重写这个方法。如果你的参数定义成Shape s,那么就可以接受继承Shape的所有实际形状 public void draw(Shape s);这就实现了多态的概念。
2.这样做有什么意义?
子类是对父类的一个改进和扩充,所以一般子类在功能上较父类更强大,属性较父类更独特, 定义一个父类类型的引用指向一个子类的对象既可以使用子类强大的功能,又可以抽取父类的共性。
3为什么父类引用子类对象时,不能调用子类特有的方法?
比如说:
定义一个父类Animal,一个子类Bird,Bird有个独有的方法:飞行。我现在 Animal animal = new Bird (); 你要调用 animal.fly();这是不符合逻辑的,因为动物不是都会飞。这就要回归到问题2:定义一个父类类型的引用指向一个子类的对象既可以使用子类强大的功能,又可以抽取父类的共性。
4.这样做的好处是什么?
总的来说有三方面:一,实现多态。二,减小耦合。三,增加了程序的可移植性。
5.子类能覆盖父类的变量吗(父类引用指向子类对象时)?答案是不能
比如我在Animal中:int i =1; 在Dog中: int i = 1000 ;
然后 Animal animal = new Dog();
输出animal.i,结果为1.