调用构造方法的顺序

来源:百度知道 编辑:UC知道 时间:2024/05/08 14:43:28
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()");}}
public class Sandwich extends PortableLunch
{
private Bread b= new Bread();
private Cheese c=new Cheese();
private Lettuce l=new Lettuce();
public Sandwich()
{ System.out.println("Sandwich()");}
public static void main(String[] args)
{ new Sandwich();}
}
运行结果:
Meal()
Lunch()
PortableLunch()
Bread()
Cheese()
Lettuce()
Sandwich()

为什么不是:
Meal()
Lunch()
Po

首先编译程序会自动寻找main方法
(这就是为什么一个JAVA文件只有一个MAIN方法的原因),
它发现main方法在class Sandwich中,
那它就会进入class Sandwich中,
在进入之前,
//他会调用class Sandwich的构造函数,
//在它调用class Sandwich的构造函数之前,
它发现class Sandwich是继承自class PortableLunch,
那它就会进入class PortableLunch中,
在进入之前,
//那它会先调用class PortableLunch的构造函数,
//在它调用class PortableLunch的构造函数之前,
它又发现class PortableLunch是继承自class Lunch,
那它就会进入class Lunch中,
在进入之前,
//那它会先调用class Lunch的构造函数,
//在它调用class Lunch的构造函数之前,
它再次发现class Lunch是继承自class Meal,
那它就会进入class Meal中,
调用class Meal的构造函数,
这时会输出 :Meal()
往下依次
进入class Lunch中调用class Lunch的构造函数,
输出:Lunch()
进入class PortableLunch中调用class PortableLunch的构造函数,
PortableLunch()
这时该进入class Sandwich中了,
class Sandwich中的第一条语句是:private Bread b= new Bread();
他就会调用相应的方法,
之后也是一样
所以最后调用class Sandwich的构造函数,
才会输出:Sandwich()
总结:初始化的顺序为:
=====================================================