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