基类的构造器总是在导出类的构造过程中被调用,而且按照继承层次逐渐向上链接,以使每个基类的构造器都能得到调用.
这样做是有意义的,因为构造器有一项特殊的任务:检查对象是否被正确的构造.导出类只能访问它自己的成员,不能访问基类的成员(基类成员通常是private类型的).只有基类的构造器才具有恰当的知识和权限对自己的元素进行初始化.因此必须要令所有构造器都得到调用,否则所有的对象就不能保证被正确构造.这就是为什么要强制每个导出类部分都必须调用构造器的原因.
以一个例子说明复杂对象调用构造器要遵照的顺序:
1.调用基类构造器.
这个步骤会不断反复递归下去,首先是构造这种层次结构的根,然后是下一层导出类,等等.知道对底层的导出类.
2.按照声明顺序调用成员的初始化状态设置模块.
3.调用导出类构造器的主体.
import com.bruceeckel.simpleteset.*;
class Meal
{
Meal(){System.out.printIn("Meal()");}
}
class Bread
{
Bread(){System.out.printIn("Bread()");}
}
class Cheese
{
Cheese(){System.out.printIn("Cheese()");}
}
class Lettuce
{
Lettuce(){System.out.printIn("Lettuce()");}
}
class Lunch extends Meal
{
Lunch(){System.out.printIn("Lunch()");}
}
class PortableLunch extends Lunch
{
PortableLunch(){System.out.printIn("PortableLunch");}
}
public class Sandwich extends PortableLunch
{
private static Test monitor = new Test();
private Bread b = new Bread();
private Cheese c = new Cheese();
private Lettuce l = new Lettuce();
public Sandwich()
{
System.out.printIn("Sandwich()");
}
pbulic static void main(String[] args)
{
new Sandwich();
monitor.expect(new String[]
{
"Meal()",
"Lunch()",
"PortableLunch()",
"Bread()",
"Cheese()",
"Lettuce()",
"Sandwich()"
});
}
}

364

被折叠的 条评论
为什么被折叠?



