Java基础之子类父类属性覆盖

王朝学院·作者佚名  2016-08-27  
宽屏版  字体: 小 | 中 | 大 | 超大  

当java的子类和父类具有相同名字的属性时,到底java是怎么处理的。

先看代码:

packagecom.joyfulmath.study.field;publicclassPerson {publicString name;publicString getName() {returnname;

}

}

packagecom.joyfulmath.study.field;publicclassStudentextendsPerson {publicString name;publicStudent(String name)

{this.name =name;super.name = "Man-Person";//从此处可以看出,java可以通过this,已经super来区分子类和父类。

}

@OverridepublicString getName() {returnname;

}

}

packagecom.joyfulmath.study.factory;importcom.joyfulmath.study.field.Person;importcom.joyfulmath.study.field.Student;importcom.joyfulmath.study.utils.TraceLog;publicclassFieldMethodimplementsIWorkMethod {

@OverridepublicvoidstartWork() {

Student st=newStudent("Mark-Student");

Person p=st;

TraceLog.v(p.name+" "+st.name);

TraceLog.v(p.getName()+" "+st.getName());

}

}

其实st.name不用怀疑,肯定是Mark-Student

但是p.name,已经p.getName()呢?

我们先来看p.getName(),虽然P是person,但是它实际代表的地址里面存的是Student,所以

p.getName()实际的调用结果是st.getName()一样的,也就是student的getname方法。

那p.name呢?

我们在Student里面添加一个属性,level。

publicclassStudentextendsPerson {publicString name;publicintlevel;publicStudent(String name)

{this.name =name;super.name = "Man-Person";

}

@OverridepublicString getName() {returnname;

}

}

然后还是在startwork中,用p.level,结果编译器不认识?

对呀,p是person的对象,它怎么会认识呢。

所以很显然,p只认识Person中的name,而不是Student中的name.

我们看下运行结果:

startWork: Man-Person Mark-Student [at (FieldMethod.java:13)]

startWork: Mark-Student Mark-Student [at (FieldMethod.java:14)]

验证了我们的猜测,可见属性是绑定类型的,而方法是绑定对象的。

或者说属性是在编译器就确认的,而方法是动态绑定(多态)。

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
© 2005- 王朝网络 版权所有