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的对象,却调用了父类的特性?
由于你声明成员变量是都是public,导致Taxi类中实际上存在两个site,两个way变量,当对象为Traveltool时条用的则是父类的site(没有初值默认为零),就是你的这种情况。想要输出5则要创建一个子类的对象,如Taxi taxi = (Taxi)obj;System.out.println(taxi.site);结果就是5.
这个通过存储地址很好解释,比如创建一个类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中的数值!(注:个人理解)
谢谢,我还是没理解透彻。语句:Traveltool obj = new Taxi(); ,实际创建的是Traveltool的对象还是Taxi的对象呢?
如果是Traveltool的对象,为什么调用的是Taxi的方法?
如果是Taxi的对象,为什么调用的是Traveltool的变量值呢?
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?
(我不太清楚你的意思,你是指父类和子类都定义了site这个数据吗?额,还有,site这个数据你不封装起来吗?或者是site是一个方法?)根据多态性,编译器在编译的时会通过动态绑定生成一个方法表,如果方法中,有同样的签名,会自动调用一个最合适的方法。
Java入门第二季 升级版
530656 学习 · 6091 问题
相似问题