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方法應該會報錯。由此得出的結論是,子類會繼承父類的全部東西,而修飾符只是影響屬性或者方法對外是否可見。this

可是我的比較贊成Java官方文檔的解釋:子類不能繼承父類的私有屬性,可是若是子類中公有的方法影響到了父類私有屬性,那麼私有屬性是可以被子類使用的。spa

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

固然以上的這些理由並不充分,只是筆者的我的看法。關於繼承的問題,知乎對此也有討論,下面這個帖子總結的比較全面,證據也很充足,你們能夠去看看:對象

連接:https://www.zhihu.com/question/51345942/answer/145388196  做者:Robinblog

相關文章
相關標籤/搜索