多态对象特性

来源:10-1 Java 中的多态

Levin2016

2016-07-23 13:55

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

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

Traveltool obj3 = new Taxi();

System.out.println(obj3.site);

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

写回答 关注

5回答

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

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

    Smile丶... 回复Levin2...

    当调用Taxi中的site时可以先将Traveltool obj强制转换成Taxi类型Taxi obj2 = (Taxi)obj;不过出于封装的考虑,一般情况下是不会将类中的成员变量设置为public,而是通过适当的方法来调用,当子类想要调用父类变量或者方法时使用super,输出本身的变量时则用this,这样就既可以得到父类的变量又可以输出自己的变量。不过子类如果拥有与父类同名的变量时,表示子类的新特性,一般情况不会再去调用父类的同名变量。

    2016-07-25 11:00:27

    共 8 条回复 >

  • 南山至南
    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是一个方法?)根据多态性,编译器在编译的时会通过动态绑定生成一个方法表,如果方法中,有同样的签名,会自动调用一个最合适的方法。

    Levin2...

    public class Initial { public static void main(String[] args) { Traveltool obj = new Taxi(); System.out.println(obj.site); 为什么结果是0而不是5?因为我创建的是子类的对象,为什么不调用子类的site值呢

    2016-07-23 16:11:41

    共 2 条回复 >

Java入门第二季 升级版

课程升级!以终为始告别枯燥,在开发和重构中体会Java面向对象编程的奥妙

530656 学习 · 6091 问题

查看课程

相似问题