JAVA构造方法和属性初始化顺序

在一个小问题上折腾了半天,刚开始感觉很奇怪怎么会这样,最后想想确实是这样,只是自己把基础忘记了皱眉

 

 

public class ClassA {

	public ClassA(int v){
		init(v);
	}
	
	public void init(int v){};
}

 

 

 

public class ClassB extends ClassA {

	int v = 1;
	
	public ClassB(){
		super(2);
	}
	
	@Override
	public void init(int v) {
		this.v = v;
		System.out.println("set v = "+v);
	}

	public static void main(String[] args) {
		ClassB c = new ClassB();
		System.out.println("main v = "+c.v);
	}
}

 

 

输出

 

set v = 2
main v = 1

 

 

原因:

int v = 1; 的顺序是 先定义一个变量v,然后执行父类的构造方法,构造方法返回后设置v的值为1。所以在父类的构造方法内设置变量的值是无效的。

你可能感兴趣的:(JAVA构造方法和属性初始化顺序)