java 多态问答

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

我建立了两个类

子类为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占用的内存

 

 

 

posted @ 2020-08-08 15:14  酷酷的城池  阅读(110)  评论(0编辑  收藏  举报