- Java繼承
java中繼承是一個重要的特性,使用繼承可以大大提升開發的效率。子類繼承父類的所有屬性和方法,我個人的理解:子類實際上就是在父類基礎上進行封裝而得到的一個新類。所以子類應該是繼承了父類所以的屬性和方法,包括父類的私有屬性和私有方法。但是在我周圍的一些小夥伴和一些網上科普,卻因爲子類的實例化對象無法直接調用父類的私有屬性和私有方法,認爲子類只能繼承父類的非私有屬性和非私有方法。所以我們來用代碼看看實際情況到底是怎樣的。
- 父類
首先創建一個父類,父類中有一個私有屬性和一個私有方法,一個公有屬性和三個公有方法。其中的兩個公有方法一個能夠調用父類的私有方法,一個能夠調用父類的私有屬性。
package extens;
public class Father {
private String fprivate = "這是父類的私有屬性";
public String fpublic = "這是父類的公用屬性";
public Father() {
}
public Father(String fprivate) {
this.fprivate = fprivate;
}
public String getFprivate() {
return fprivate;
}
private void fpprint(){
System.out.println("這是父類的私有方法");
}
public void usePrivate(){
this.fpprint();
}
public void fbprint(){
System.out.println("這是父類的公有方法");
}
}
- 子類
子類比較簡單,繼承了父類,子類中就只有兩個構造方法。
package extens;
public class Son extends Father{
public Son() {
}
public Son(String fprivate) {
super(fprivate);
}
}
- 測試
父類和子類準備好後,我們來創建一個測試類來測試一下子類到底是否繼承了父類的私有屬性和私有方法。
package extens;
public class Solution {
public static void main(String[] args) {
Son son = new Son();
// 子類擁有父類的公有屬性,並且可以調用父類的公有方法
System.out.println(son.fpublic);
son.fbprint();
// 嘗試打印父類的私有屬性,並且調用父類的私有方法
System.out.println(son.fprivate);//子類對象無法調用父類的私有屬性
son.fpprint;//子類對象無法調用父類私有方法
//使用getter方法調用父類私有屬性,使用子類對象可調用的父類公有方法調用父類私有方法
// System.out.println(son.getFprivate());
// son.usePrivate();
}
}
我們創建一個子類的實例化對象,對象調用父類的私有屬性和私有方法。
可以看到子類對象調用父類的私有屬性和父類的私有方法這條語句被標紅了,無法進行編譯,這是因爲在子類是沒有權限訪問這個私有屬性和私有方法。我們在來調用父類的公有方法,來訪問私有屬性和私有方法試試。
package extens;
public class Solution {
public static void main(String[] args) {
Son son = new Son();
// 子類擁有父類的公有屬性,並且可以調用父類的公有方法
System.out.println(son.fpublic);
son.fbprint();
// 嘗試打印父類的私有屬性,並且調用父類的私有方法
// System.out.println(son.fprivate);//子類對象無法調用父類的私有屬性
// son.fpprint;//子類對象無法調用父類私有方法
//使用getter方法調用父類私有屬性,使用子類對象可調用的父類公有方法調用父類私有方法
System.out.println(son.getFprivate());
son.usePrivate();
}
}
看看結果:
可以看到,程序編譯無問題並且成功調用了父類的私有屬性和私有方法。在整個程序中,我們並沒有實例化過父類對象,只實例化了一個子類對象。由此可見,子類是繼承了父類的私有屬性和私有方法,只是子類沒有權限直接訪問父類的私有屬性和私有方法。
如果文中有說的不對或不好的地方,歡迎大家指正。