一、繼承可以打破父類原有的封裝
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參數(shù)的構(gòu)造函數(shù)Body()
這是為什么呢? 咱們沒有調(diào)用Body()呀
只是直接調(diào)用的ChildBody()構(gòu)造函數(shù),而這個應(yīng)該是由編譯器提供的呀?
為什么這次它沒有提供呢?傻了嗎?
可是
究竟為什么呢?困惑中
其實 ,事實不像看到的那樣
1 類如果沒構(gòu)造方法,編譯器會嘗試給創(chuàng)建一個默認的
2 但是子類構(gòu)造方法要用父類的構(gòu)造方法來初始化其父類的東西
3 這時候,編譯器就疑惑了,不能幫你合成了
需要你顯示的來寫構(gòu)造方法
所以看出一個問題:
繼承雖然提高代碼復(fù)用,但是子類的編寫者需要了解父類的設(shè)計細節(jié),因此,繼承某種程度上
打破了封裝
我們對子類做一下修改,
class ChildBody extends Body
{
private int age;
public ChildBody(String name){
super(name);
}
}
而現(xiàn)在就應(yīng)該可以通過編譯了
我的分析是
我們用了super()句子,就是調(diào)用了父類的構(gòu)造方法
而父類的此構(gòu)造方法,則要調(diào)用它自己的父類無參構(gòu)造函數(shù)
大家知道類Body 隱式的繼承于Object
也就是說,調(diào)用了Object的無參構(gòu)造函數(shù)
自然是可以成功編譯了