问答详情
源自:10-1 Java 中的多态

多态对象特性

当创建一个父类的引用指向本类的对象时,如何使用这个对象调取本类的特性?例如:

父类:Traveltool;本类:Taxi;他们的特性:int site;如何调用对象obj3来调用Taxi里面的site值?

Traveltool obj3 = new Taxi();

System.out.println(obj3.site);

这个命令输出的是Traveltool中的site值。为什么obj3是Taxi的对象,却调用了父类的特性?

提问者:Levin2016 2016-07-23 13:55

个回答

  • Smile丶微冷
    2016-07-24 15:20:42
    已采纳

    由于你声明成员变量是都是public,导致Taxi类中实际上存在两个site,两个way变量,当对象为Traveltool时条用的则是父类的site(没有初值默认为零),就是你的这种情况。想要输出5则要创建一个子类的对象,如Taxi taxi = (Taxi)obj;System.out.println(taxi.site);结果就是5.

  • 南山至南
    2016-08-06 15:05:00

    这个通过存储地址很好解释,比如创建一个类A占用1.0M内存,类B继承类A ,创建类B 则占用1.5M内存(即类B内存大小0.5M),当我们new B();时,编译器为我们分配1.5M内存,分别为(A+B),当我们对象类型是类A时,类A对象就只指向1.0M内存中的数据,所以输出0,当我们调用方法时,因为B继承A,并且B类重写了A的方法,所以我们看到是调用B中的方法。当然,对象类型为B时,对象指向1.5M的内存,我们输出 site的值也就是B中的数值!(注:个人理解)

  • Levin2016
    2016-07-24 18:25:40

    谢谢,我还是没理解透彻。语句:Traveltool obj = new Taxi(); ,实际创建的是Traveltool的对象还是Taxi的对象呢?

    如果是Traveltool的对象,为什么调用的是Taxi的方法?

    如果是Taxi的对象,为什么调用的是Traveltool的变量值呢?

  • Levin2016
    2016-07-23 16:06:43

    package com.imooc;

    //父类

    public class Traveltool {

    public String way = "Traveltoll can travel!" ;

    public int site;

    public void canDo(){

    System.out.println("Traveltool can travel fast on road! " + "Bike can take " + site + " people!");

    }

    }

    package com.imooc;

    //子类

    public class Taxi extends Traveltool {

    String way = "Taxi travel by road";

    int site = 5;

    public void canDo(){

    System.out.println("Taxi can travel fast on road! " + "Bike can take " + site + " people!");

    }

    }

    package com.imooc;

    //初始化类

    public class Initial {

    public static void main(String[] args) {

    // TODO Auto-generated method stub

    Traveltool obj = new Taxi();

    System.out.println(obj.site);

    }

    }

    结果为什么是0而不是5?

  • _追梦者
    2016-07-23 15:05:01

    (我不太清楚你的意思,你是指父类和子类都定义了site这个数据吗?额,还有,site这个数据你不封装起来吗?或者是site是一个方法?)根据多态性,编译器在编译的时会通过动态绑定生成一个方法表,如果方法中,有同样的签名,会自动调用一个最合适的方法。