當(dāng)java的子類和父類具有相同名字的屬性時(shí),到底java是怎么處理的。
先看代碼:
package com.joyfulmath.study.field;public class Person { public String name; public String getName() { return name; } }
package com.joyfulmath.study.field;public class Student extends Person { public String name; public Student(String name) { this.name = name; super.name = "Man-Person";//從此處可以看出,java可以通過(guò)this,已經(jīng)super來(lái)區(qū)分子類和父類。 } @Override public String getName() { return name; } }
package com.joyfulmath.study.factory;import com.joyfulmath.study.field.Person;import com.joyfulmath.study.field.Student;import com.joyfulmath.study.utils.TraceLog;public class FieldMethod implements IWorkMethod { @Override public void startWork() { Student st = new Student("Mark-Student"); Person p = st; TraceLog.v(p.name+" "+st.name); TraceLog.v(p.getName()+" "+st.getName()); }}
其實(shí)st.name不用懷疑,肯定是Mark-Student
但是p.name,已經(jīng)p.getName()呢?
我們先來(lái)看p.getName(),雖然P是person,但是它實(shí)際代表的地址里面存的是Student,所以
p.getName()實(shí)際的調(diào)用結(jié)果是st.getName()一樣的,也就是student的getname方法。
那p.name呢?
我們?cè)赟tudent里面添加一個(gè)屬性,level。
public class Student extends Person { public String name; public int level; public Student(String name) { this.name = name; super.name = "Man-Person"; } @Override public String getName() { return name; } }
然后還是在startwork中,用p.level,結(jié)果編譯器不認(rèn)識(shí)?
對(duì)呀,p是person的對(duì)象,它怎么會(huì)認(rèn)識(shí)呢。
所以很顯然,p只認(rèn)識(shí)Person中的name,而不是Student中的name.
我們看下運(yùn)行結(jié)果:
startWork: Man-Person Mark-Student [at (FieldMethod.java:13)]startWork: Mark-Student Mark-Student [at (FieldMethod.java:14)]
驗(yàn)證了我們的猜測(cè),可見屬性是綁定類型的,而方法是綁定對(duì)象的。
或者說(shuō)屬性是在編譯器就確認(rèn)的,而方法是動(dòng)態(tài)綁定(多態(tài))。
新聞熱點(diǎn)
疑難解答
圖片精選
網(wǎng)友關(guān)注