Java基础-子父类构造函数、静态变量(代码块)、普通变量的调用顺序

子父类构造函数、静态变量(代码块)、普通变量的调用顺序

   创建子类的时候,先检查父类是否有静态的属性,如果有,则先调用静态属性的语句,然后检查子类是否也有静态类型属性,有,则调用子类的静态类型,然后在调用父类普通变量,构造函数,然后才是子类的普通属性,构造函数。
顺序是:
父类静态
子类静态
父类属性
父类构造函数
子类属性
子类构造函数

  注意:如果父类是个抽象类,而这时候父类构造函数调用到子类里的函数,而且需要引用子类的某个属性,这时候这个属性输出多少呢?答案从上面的构造顺序知道,因为父类构造函数运行的时候子类的属性还没有被初始化(准确说应该是没有被用户初始化,但是编译器已经初始化为0) 所以,输出的结果是0。
   因此,编写构造器时有一条有益的规则:
“用尽可能简单的方法使对象进入正常状态;如果
可以的话,
避免调用其他方法” 在构造器内唯一能够安全调用的那些方法是基类中的 final方法(也适用于 private 方法,它们自动属于 final 方法)。这些方法不能被重载,因此也就不会出现上述令人惊讶的问题。

单步跟踪一下代码可验证结果:
class BB{
	static int m = 4;
	private int st = 3;
	BB(){
		System.out.println("father constractor");
	}
}


public class staticTest extends BB{
	static int a = 4;
	private int sy = 3;
	staticTest(){
		System.out.println("son constractor");
	}
	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub
//		BB b = new BB();
		staticTest bb = new staticTest(); 
		System.out.println("static test");
	}

}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值