zoukankan      html  css  js  c++  java
  • 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占用的内存

     

  • 相关阅读:
    [主席树][学习笔记]
    [bzoj2588][ Count on a tree]
    [bzoj3524][Couriers]
    [luogu3834][可持久化线段树 1(主席树)]
    [luogu3810][bzoj3262][陌上花开]
    [树套树][学习笔记]
    [luogu4556][Vani有约会]
    [线段树合并][学习笔记]
    [hdu6183][Color it]
    [动态开点线段树][学习笔记]
  • 原文地址:https://www.cnblogs.com/chengfengchi/p/13457905.html
Copyright © 2011-2022 走看看