3278 7840

1100111010001110 1001010010001010

打破封装的种类之一 :继承

一、继承可以打破父类原有的封装

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的无参构造函数

自然是可以成功编译了

posted on 2009-06-15 16:06 逍遥晨空 阅读(212) 评论(0)  编辑  收藏


只有注册用户登录后才能发表评论。


网站导航: