一、继承可以打破父类原有的封装
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的无参构造函数
自然是可以成功编译了