Java中子類能繼承父類的私有屬性嗎?


前段時間去聽老師講課的時候,老師告訴我子類是可以繼承父類所有的屬性和方法的。當時我是極其疑惑的,因為之前學校考試時這個考點我記得很清楚:子類只能繼承父類的非私有屬性和方法。老師給我的解釋是這樣的——先看下面一段代碼

/**
 * 定義父類
 * @author CBS
 */
public class Father {
    private String name;//私有屬性
    private char sex;
    
    public void tell(){
        System.out.println(name+sex);
    }
    
    private void speak(){
        System.out.println(name+"is speaking!");
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public char getSex() {
        return sex;
    }

    public void setSex(char sex) {
        this.sex = sex;
    }

}
/** * 定義子類,子類中什么都不寫。 * @author CBS */ public class Child extends Father { }
/** * 定義測試類 * @author CBS */ public class Test { public static void main(String[] args) { Child c=new Child(); c.tell();//tell方法是可以用的 //c.speak();//報錯,父類的私有方法不可見 } }

我們可以看到測試類中即使沒有給Child類對象的屬性進行賦值,tell方法依舊是可用的。如果Child類中沒有繼承父類的私有屬性,那么tell方法應該會報錯。由此得出的結論是,子類會繼承父類的所有東西,而修飾符只是影響屬性或者方法對外是否可見。

但是個人比較同意Java官方文檔的解釋:子類不能繼承父類的私有屬性,但是如果子類中公有的方法影響到了父類私有屬性,那么私有屬性是能夠被子類使用的。

Java中修飾符的作用是封裝類中的屬性和方法使其對外不可見,官方文檔的解釋很好的兼顧了Java的繼承和封裝。繼承是為了更好的提高代碼的重用性,封裝則保護了代碼的不可見部分。在編寫代碼的過程中,我們顯然即想提高代碼的重用性,也不希望類中的某些域被隨意修改。那么這樣的繼承機制就很合理了。另外就生活中的例子來說,Java官方文檔的解釋也很契合。比如,我們不可能完全繼承父母的一切(如性格等),但是父母的一些無法繼承的東西卻仍會深刻的影響着我們。

當然以上的這些理由並不充分,只是筆者的個人見解。關於繼承的問題,知乎對此也有討論,下面這個帖子總結的比較全面,證據也很充足,大家可以去看看:

鏈接:https://www.zhihu.com/question/51345942/answer/145388196  作者:Robin




免責聲明!

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



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