日期:2011-03-22 16:17:00 来源:本站整理
构建器的调用次序[Java编程]
本文“构建器的调用次序[Java编程]”是由七道奇为您精心收集,来源于网络转载,文章版权归文章作者所有,本站不对其观点以及内容做任何评价,请读者自行判断,以下是其具体内容:
构建器调用的次序已在第4章举行了扼要阐明,但那是在担当和多形性问题引入之前说的话.
用于底子类的构建器必定在一个衍生类的构建器中调用,并且渐渐向上链接,使每个底子类利用的构建器都能得到调用.之所以要这样做,是由于构建器负有一项特别任务:查抄对象能否得到了精确的构建.一个衍生类只能拜候它自己的成员,不能拜候底子类的成员(这些成员普通都具有private属性).只有底子类的构建器在初始化自己的元素时才知道精确的办法以及拥有得当的权限.所以,必须令全部构建器都得到调用,不然整个对象的构建便大概不精确.那恰是编译器为什么要逼迫对衍生类的每个部份举行构建器调用的缘由.在衍生类的构建器主体中,若我们没有明确指定对一个底子类构建器的调用,它就会“默默”地调用默许构建器.假如不存在默许构建器,编译器就会报告一个错误(若某个类没有构建器,编译器会自动组织一个默许构建器).
下面让我们看看一个例子,它展示了按构建次序举行合成、担当以及多形性的效果:
//: Sandwich.java // Order of constructor calls class Meal { Meal() { System.out.println("Meal()"); } } class Bread { Bread() { System.out.println("Bread()"); } } class Cheese { Cheese() { System.out.println("Cheese()"); } } class Lettuce { Lettuce() { System.out.println("Lettuce()"); } } class Lunch extends Meal { Lunch() { System.out.println("Lunch()");} } class PortableLunch extends Lunch { PortableLunch() { System.out.println("PortableLunch()"); } } class Sandwich extends PortableLunch { Bread b = new Bread(); Cheese c = new Cheese(); Lettuce l = new Lettuce(); Sandwich() { System.out.println("Sandwich()"); } public static void main(String[] args) { new Sandwich(); } } ///:~
这个例子在其他类的外部成立了一个复杂的类,并且每个类都有一个构建器对自己举行了公布.此中最重要的类是Sandwich,它反映出了三个级别的担当(若将从Object的默许担当算在内,就是四级)以及三个成员对象.在main()里成立了一个Sandwich对象后,输出后果以下:
Meal() Lunch() PortableLunch() Bread() Cheese() Lettuce() Sandwich()
这意味着关于一个复杂的对象,构建器的调用遵循下面的次序:
(1) 调用底子类构建器.这个步骤会不断反复下去,首先得到构建的是分级构造的根部,然后是下一个衍生类,等等.直到到达最深一层的衍生类.
(2) 按声明次序调用成员初始化模块.
(3) 调用衍生构建器的主体.
构建器调用的次序是非常重要的.举行担当时,我们知道关于底子类的一切,并且能拜候底子类的任何public和protected成员.这意味着当我们在衍生类的时刻,必须能假定底子类的全部成员都是有效的.采取一种尺度办法,构建行动已经举行,所以对象全部部份的成员均已得到构建.但在构建器内部,必须保证利用的全部成员都已构建.为到达这个要求,唯一的办法就是首先调用底子类构建器.然后在进入衍生类构建器今后,我们在底子类可以拜候的全部成员都已得到初始化.此外,全部成员对象(亦即通过合成办法置于类内的对象)在类内举行定义的时刻(比方上例中的b,c和l),由于我们应尽大概地对它们举行初始化,所以也应保证构建器内部的全部成员均为有效.若保持按这一法则行事,会有助于我们肯定全部底子类成员以及当前对象的成员对象均已得到精确的初始化.但不幸的是,这种做法并不实用于全部情形,这将在下一节具体阐明.
以上是“构建器的调用次序[Java编程]”的内容,如果你对以上该文章内容感兴趣,你可以看看七道奇为您推荐以下文章:
本文地址: | 与您的QQ/BBS好友分享! |
- ·上一篇文章:<b>java承当和finalize()</b>
- ·下一篇文章:为什么要用内部类:掌握框架
- ·中查找“构建器的调用次序”更多相关内容
- ·中查找“构建器的调用次序”更多相关内容
评论内容只代表网友观点,与本站立场无关!
评论摘要(共 0 条,得分 0 分,平均 0 分)
查看完整评论