Java基础--成员变量初始化顺序

 实例一:在一个类中,没有使用到继承,成员、static成员、方法、构造函数执行顺序

public class Test {
	
	public static void main(String[] args) {
		prt("Test constructor");
		Test b = new Test();
	}

	Test() {
		prt("k = " + k);
	}

	static {
		prt("static code block initialized");
	}

	static int x2 = prt("static Test.x2 initialized");

	static int prt(String s) {
		System.out.println(s);
		return 63;
	}

	final int f = prt("final Test.k initialized");

	int k = prt("Test.k initialized");
}

执行顺序结果:
static code block initialized
static Test.x2 initialized
Test constructor
final Test.k initialized
Test.k initialized
k = 63
通过上面的结果,我们可以看出,static 代码块和static方法,如果跟换顺序他们的执行顺序与代码从上到下的顺序有关
但是,成员(k),无论放置在哪里,他都在构造方法之前执行
———————————————————————————————————————————————————————
官方解释:
初始化的顺序是由变量在类内的定义顺序决定的。即使变量定义大量遍布于方法定义的中间,那些变量仍会在调用任何方法之前得到初始化——甚至在构建器调用之前,static,永远是在类初始化之前执行,包括类的变量列表。
static(代码块) static(成员) 根据代码定义顺序决定
 --> static(方法)
--> 成员变量(根据类成员定义顺序决定)
--> 构造方法
所以在调用类构造方法之前,类中的所有成员变量都得到正常初始化,
实例二:通过继承示例,static成员,类成员列表,构造方法执行顺序
 

class SuppTest {
	int i = 9;
	int j;

	SuppTest() {
		prt("i = " + i + ", j = " + j);
		j = 39;
	}

	static int x1 = prt("static SuppTest.x1 initialized");

	static int prt(String s) {
		System.out.println(s);
		return 47;
	}
}

public class Test extends SuppTest {
	
	public static void main(String[] args) {
		prt("Test constructor");
		Test b = new Test();
	}

	Test() {
		prt("k = " + k);
		prt("j = " + j);
	}

	static {
		prt("static code block initialized");
	}

	static int x2 = prt("static Test.x2 initialized");

	static int prt(String s) {
		System.out.println(s);
		return 63;
	}

	final int f = prt("final Test.k initialized");

	int k = prt("Test.k initialized");
}

执行结果:
static SuppTest.x1 initialized
static code block initialized
static Test.x2 initialized
Test constructor
i = 9, j = 0
final Test.k initialized
Test.k initialized
k = 63
j = 39
       我们发现程序执行的第一件事情就是类的装载,在装载的过程中,装载类发现它(Test)存在一个基类(SuppTest),所以随之将其载入。无论是否准备生成那个基础类的一个对象,这个过程都会发生(请试着将对象的创建代码当作注释标注出来,自己去证实)。若基础类含有另一个基础类,则另一个基础类随即也会载入,以此类推。
       所以结果就会先执行(superTest)类中的static成员,在执行衍生类中的static,当执行到衍生类(Test)构造方法中,存在一个缺省super()调用。

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值