java构造器的初始化与运行顺序

程序的运行顺序
我们都知道java程序是一门面向对象的语言。也就是说每创建一个对象时我们可能并不去关心他的初始化与运行的顺序,因为java尽力保证所有变量在使用前都能得到恰当的初始化。对于方法的局部变量,java已编译时错误的形式来贯彻这种保证。
你确定你明白了吗?
话不多说我们先来看一下代码,让我们来猜测一下他的运行顺序

class Window{
	Window(int marker){
		System.out.println("Window("+marker+");");
	}
}
class House{
	Window w1=new Window(1);//在构造器之前
	public House() {
		System.out.println("House()");
		w3=new Window(33);
	}
	Window w2=new Window(2);//在构造器之后
	void f() {
		System.out.println("f()");
	}
	Window w3=new Window(3);//在最后
}
public class Run{
	public static void main(String[] args) {
		House h=new House();
		h.f();
	}
}

运行结果:
Window(1);
Window(2);
Window(3);
House()
Window(33);
f()
和大家想的有不同么?我觉得这段代码很简单,应该都能理解。
在House类中,故意将Window对象的定义放在各处,可以看到在方法调用之前都得到了初始化。
再来看一段静态数据的代码

class Bowl{
	Bowl(int marker){
		System.out.println("Bowl("+marker+");");
	}
	void f1(int marker) {
		System.out.println("f1("+marker+");");
	}
}
class Table{
	static Bowl bowl1=new Bowl(1);
	Table(){
		System.out.println("Table();");
		bowl2.f1(1);
	}
	void f2(int marker) {
		System.out.println("f2("+marker+");");
	}
	static Bowl bowl2=new Bowl(2);
}
class Cupboard{
	Bowl bowl3=new Bowl(3);
	static Bowl bowl4=new Bowl(4);
	public Cupboard() {
		System.out.println("Cupboard();");
		bowl4.f1(2);
	}
	void f3(int marker) {
		System.out.println("f3("+marker+");");
	}
	static Bowl bowl5=new Bowl(5);
}
public class Run{
	public static void main(String[] args) {
		System.out.println("Create new Cupboard() in main");
		new Cupboard();
		System.out.println("Create new Cupboard() in main");
		new Cupboard();
		table.f2(1);
		cupboard.f3(1);
	}
	static Table table=new Table();
	static Cupboard cupboard=new Cupboard();
}

运行结果
Bowl(1);
Bowl(2);
Table();
f1(1);
Bowl(4);
Bowl(5);
Bowl(3);
Cupboard();
f1(2);
Create new Cupboard() in main
Bowl(3);
Cupboard();
f1(2);
Create new Cupboard() in main
Bowl(3);
Cupboard();
f1(2);
f2(1);
f3(1);
代码看着可能有点长,慢慢来。
我们可以看到初始化的顺序是先从静态对象(如果他们尚未因前面的对象创建过程而被初始化),而后是非静态对象。从输出结果可以看到这一点。要执行main()方法,必须加载这个Run类,然后其静态域初始化,导致他们对应的类也被加载。当然实际情况并非如此。因为在典型的程序中并不会这样做。
文章不完善,后面还有继承的构造初始化,与常量的一些初始化,看似简单,其实东西比较多,后面会慢慢添加,文章出处thiking of java。如有异议欢迎提议。谢谢!

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值