當java的子類和父類具有相同名字的屬性時,到底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可以通過this,已經super來區分子類和父類。 } @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()); }}
其實st.name不用懷疑,肯定是Mark-Student
但是p.name,已經p.getName()呢?
我們先來看p.getName(),雖然P是person,但是它實際代表的地址里面存的是Student,所以
p.getName()實際的調用結果是st.getName()一樣的,也就是student的getname方法。
那p.name呢?
我們在Student里面添加一個屬性,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,結果編譯器不認識?
對呀,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)]
驗證了我們的猜測,可見屬性是綁定類型的,而方法是綁定對象的。
或者說屬性是在編譯器就確認的,而方法是動態綁定(多態)。
新聞熱點
疑難解答