Java对象初始化

最近刷面试题发现关于java 中new对象时构造函数,构造代码块等的调用顺序是常考点,下面的一些总结:


请看下面的demo程序:

public class Father {

	
	
	public static Variable a=new Variable();
	public  Variable b=new Variable(1);
	static{
		System.out.println("父类静态代码块1");
	}
	
	static{
		System.out.println("父类静态代码块2");
	}
	{
		System.out.println("父类构造代码块1");
	}
	{
		System.out.println("父类构造代码块2");
	}
	public Father(){
		System.out.println("父类构造函数");
	}
	
}


public class Sun extends Father {
	
	public static Variable c=new Variable();
	public Variable d=new Variable(1);
	static{
		System.out.println("子类静态构造代码块1");
	}
	static{
		System.out.println("子类静态构造代码块2");
	}
	{
		System.out.println("子类构造代码块1");
	}
	{
		System.out.println("子类构造代码块2");
	}
	public Sun(){
		System.out.println("子类构造函数");
	}
}


public class Variable {

	public Variable(){
		System.out.println("静态变量初始化");
	}
	public Variable(int i){
		System.out.println("一般变量初始化");
	}
}

public class Main {
	
	public static void main(String[] args) {
		Sun s=new Sun();
	}
}
以下是输出:
静态变量初始化
父类静态代码块1
父类静态代码块2
静态变量初始化
子类静态构造代码块1
子类静态构造代码块2
一般变量初始化
父类构造代码块1
父类构造代码块2
父类构造函数
一般变量初始化
子类构造代码块1
子类构造代码块2
子类构造函数


可以看到初始化顺序是:父类静态初始化(执行静态变量初始化,静态构造代码初始化,这里的顺序跟他们在代码中的顺序一样)——>>子类静态初始化(跟父类情况一样)——>>父类一般变量,构造块执行(他们的顺序也和代码中的顺序一样)----->>父类构造函数——>>子类一般变量,构造块执行(同父类一样)——>>子类构造函数。


另外这里再说一个易于搞混的地方:我们知道子类和父类之间的方法覆盖,如果子类对象赋值给父类引用,在调用覆盖的方法时会调用子类的方法,这是所谓的动态绑定。但对于变量而言是不存在动态绑定的,当子类与父类有相同名字的变量时,如果子类对象赋值给父类引用,那么变量的值是等于父类的变量的值而不是子类。


public class Father {

	
	public static int static_a=1000;
	public int notStatic_b=20000;
}

public class Sun extends Father {
	
	public static int static_a=10;
	public int notStatic_b=20;
}
public class Main {
	
	public static void main(String[] args) {
		Sun s=new Sun();
		Father f=s;
		System.out.println(s.static_a+"  "+s.notstatic_b);
		System.out.println(f.static_a+"  "+f.notstatic_b);
	}
}
结果是:

10  20
1000  20000



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值