Java基礎之子類父類屬性覆蓋


當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)]

驗證了我們的猜測,可見屬性是綁定類型的,而方法是綁定對象的。

或者說屬性是在編譯器就確認的,而方法是動態綁定(多態)。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM