前段時間去聽老師講課的時候,老師告訴我子類是可以繼承父類所有的屬性和方法的。當時我是極其疑惑的,因為之前學校考試時這個考點我記得很清楚:子類只能繼承父類的非私有屬性和方法。老師給我的解釋是這樣的——先看下面一段代碼
/**
* 定義父類
* @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官方文檔的解釋也很契合。比如,我們不可能完全繼承父母的一切(如性格等),但是父母的一些無法繼承的東西卻仍會深刻的影響著我們。
當然以上的這些理由并不充分,只是筆者的個人見解。關于繼承的問題,知乎對此也有討論,下面這個帖子總結的比較全面,證據也很充足,大家可以去看看:
Java 繼承問題 -- 子類是否繼承父類的私有屬性
理解一: 子類會繼承父類的所有屬性和方法,至于能不能直接訪問,那就是訪問權限的問題了. 例如:父類有個private String name; 屬性.子類會繼承下來,但子類訪問不了,因為是privat ...
java中子類會繼承父類的構造方法嗎?
參考: https://blog.csdn.net/wangyl_gain/article/details/49366505
javascript中子類如何繼承父類
參考阮一峰的文章:http://javascript.ruanyifeng.com/oop/inheritance.html#toc4 function Shape() { this.x = 0; t ...
JAVA中子類會不會繼承父類的構造方法
聲明:剛剛接觸java不久,如果理解有錯誤或偏差望各位大佬強勢批判 java中子類能繼承父類的構造方法嗎? 父類代碼: class Father { String name ; //就不set/get ...
轉:Java中子類是否可以繼承父類的static變量和方法而呈現多態特性