打破封裝的種類之一 :繼承
一、繼承可以打破父類原有的封裝
class Body
{ String name;
public Body(String name)
{this.name=name;}
}
class ChildBody extends Body
{
private int age;
}
public class Test
{ public static void main(String[] args)
{
Body Tom=new ChildBody();
}
}
看看這段代碼,有沒有問題呢?能不能通過編譯呢?
父類,沒有錯誤。子類繼承了父類,并添加了私有成員變量age
看似沒有錯誤。
編譯錯誤,沒有找到0參數的構造函數Body()
這是為什么呢? 咱們沒有調用Body()呀
只是直接調用的ChildBody()構造函數,而這個應該是由編譯器提供的呀?
為什么這次它沒有提供呢?傻了嗎?
可是
究竟為什么呢?困惑中
其實 ,事實不像看到的那樣
1 類如果沒構造方法,編譯器會嘗試給創建一個默認的
2 但是子類構造方法要用父類的構造方法來初始化其父類的東西
3 這時候,編譯器就疑惑了,不能幫你合成了
需要你顯示的來寫構造方法
所以看出一個問題:
繼承雖然提高代碼復用,但是子類的編寫者需要了解父類的設計細節,因此,繼承某種程度上
打破了封裝
我們對子類做一下修改,
class ChildBody extends Body
{
private int age;
public ChildBody(String name){
super(name);
}
}
而現在就應該可以通過編譯了
我的分析是
我們用了super()句子,就是調用了父類的構造方法
而父類的此構造方法,則要調用它自己的父類無參構造函數
大家知道類Body 隱式的繼承于Object
也就是說,調用了Object的無參構造函數
自然是可以成功編譯了