java 父类的引用指向子类对象时 为什么不能调用子类特有的方法?

JAVA

SEMPER_FI 2015-04-18 15:10:47

我建立了两个类

子类为airplane 拥有一个fly()方法

而父类transportation则没有这个方法

package com.ljx;
public class initial {
         public static void main(String[] args) {
                 airplane obj = new airplane();
                 obj.fly();
          }
}

这样的话 程序无误

但如果把airplane obj = new airplane()改成transportation obj = new airplane();就是父类的引用指向子类的对象

再运行 系统会提示 没有为类型transportation定义方法fly

父类的引用指向子类对象时的确不能调用子类方法 那父类的引用指向子类对象这种方式的存在岂不是多余的?

或者是我根本就没理解什么是对象。。什么是引用。。。

求高人解答

 

 

匡璐

当然不是多余了。首先说你的理解没什么问题。父类的引用指向子类的对象,要调用的就是父类的方法而不是子类的方法,比如说定义一个父类animal类,一个子类 鸟类,鸟类有个独有的方法飞行。现在的情况是 Animal animal = new Bird    (); 你要调用 animal.fly();这是不符合逻辑的,因为动物不是都会飞。那多态到底有什么用!现在在Animal里定义一个方法eat,在Animal里定义的意思就是所有的动物都有吃这个方法对吧,那你在定义bird的时候可能就会重写这个方法

public void eat(){System.out.println("吃虫子"); 同理你定义一个猴子类让它吃香蕉,这个时候你的animal指向不同的子类调用eat方法得到的结果是不一样的。Animal animal = new bird    (); animal.eat();  输出的是吃虫子。

Animal animal = new Monkey(); animal.eat();  输出的是吃香蕉。 这就是多态的用法!可能又有人会问了,就算是这样,我想输出吃虫子的时候,可以直接用 Bird bird = new Bird(); bird.eat(); 为什么搞那么复杂呢! 如果真有人这么问,我再回答这个问题,打这么多字给个采纳吧

 


1.Animal animal = new bird(); 2.Bird bird = new Bird(); 1和2有什么不同点,如果你认真看我上面的回答就会知道, animal.fly()是不行的编译不能通过,只能 bird.fly() 所以如果你要调用fly方法只能用 2 这个写法. 但是如果你只需要调用eat方法 输出吃虫子,1和2都可以满足,这个时候就优先选择1写法,因为1中的animal对象占用的内存小于bird对象占用的内存,如果继承树非常的复杂,并且每次继承都会增加很多的代码,那么animal占用的内存会远远小于bird占用的内存