java构造器的调用顺序

基类的构造器总是在导出类的构造过程中被调用,而且按照继承层次逐渐向上链接,以使每个基类的构造器都能得到调用.
这样做是有意义的,因为构造器有一项特殊的任务:检查对象是否被正确的构造.导出类只能访问它自己的成员,不能访问基类的成员(基类成员通常是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()"
                });
        }
}















评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值