標籤:成員 -- test 異常 資料 屬性 nbsp 子類 類重寫
為了保證父類有良好的封裝性,不會被子類隨意修改,設計父類通常應該遵循以下規則:
1、盡量隱藏父類的內部資料,盡量把父類的所有成員變數設定為 private 訪問類型,不要讓子類直接存取父類的成員變數;
2、不要讓子類可以隨意訪問和修改父類方法,父類中僅為輔助其他工具的方法,應該使用private 存取控制符修飾,讓子類無法訪問該方法;如果父類中的方法需要被外部類調用,則必須設定為 public 修飾,但不希望子類重寫該方法,可以使用final修飾符來修飾該方法;如果希望父類的某個方法被子類重寫,但不希望被其他類自由訪問,則可以使用protected來修飾該方法。
3、盡量不要在父類構造器中調用將要被子類重寫的方法。
package test_Java;class Base { public Base() { test(); } public void test()//1 { System.out.println("將被子類重寫的方法"); } }public class Sub { private String name; public void test()//2 { System.out.println("子類重寫父類的方法, "+"其name字串的長度"+name.length()); } public static void main(String[] args) { // TODO Auto-generated method stub Sub s = new Sub(); s.test();//null 指標異常 }}
產生null 指標異常的原因:當系統試圖建立Sub對象時,同樣會先執行其父類構造器,如果父類構造器調用了被其子類重寫的方法,則變成調用被子類重寫後的方法,當建立Sub對象時,會先執行Base類中的Base構造器,而Base構造器中調用test()方法-----並不是1而是2,此時的Sub對象的name執行個體變數是null,因此將引發null 指標異常。
到底何時需要從父類派生出新的子類,具備以下條件:
- 子類需要額外增加屬性,不僅僅是屬性值的改變。
- 子類需要增加自己專屬的行為方式,
如果只是出於類複用的目的,並不一定需要使用繼承,完全可以使用組合來實現。
Java繼承和組合