java构造块与静态块

最近,在面试题或者面试上老是,提到静态块,静态变量,就仔细了解了下。

Java类里普遍存在静态快,构造块,构造函数,具体什么关系呢?

静态块:用static申明,JVM加载类时执行,仅执行一次

构造块:类中直接用{}定义,每一次创建对象时执行

public class Study_static {
	public static char text = 'a';  //静态对象
	
	public Study_static(){         //构造函数
		System.out.println('c');
	}
	
	{                              //构造块
		System.out.println('b');
	}
	
	static{                         //静态块
		System.out.println(text);
	}
	public static void main(String[] args){
		Study_static a = new Study_static();
		
	}
}

输出结果:

执行顺序优先级:静态块>main()>构造块>构造方法

所以先执行静态块,再tudy_static a = new Study_static();该语句创建对象,则又会调用构造块,输出构造块,再执行构造函数。

然而,这里的静态块,并不是仅仅静态块,而是静态域,包含了静态变量,静态块,这两者的执行顺序就是按照位置顺序进行。

扫描二维码关注公众号,回复: 1807797 查看本文章

总结:

1.静态块其实就是给类初始化的,而构造代码块是给对象初始化的。

2.静态代码块只会运行一次

3.静态块中的变量是局部变量,与普通函数中的局部变量性质没有区别。
一个类中可以有多个静态代码块,执行顺序按照位置决定。

那么对于继承情况呢?

public class Study_static {
	public static char text = 'a';  //静态对象
	
	public Study_static(){         //构造函数
		System.out.println('c');
	}
	
	{                              //构造块
		System.out.println('b');
	}
	
	static{                         //静态块
		System.out.println(text);
	}
}
public class Study_static2 extends Study_static{
	public static String text2 = "a1";
	
	public Study_static2(){
		System.out.println("c2");
	}
	
	{
		System.out.println("b2");
	}
	
	static{
		System.out.println(text2);
	}
	public static void main(String[] args){
		Study_static2 a = new Study_static2();
		
	}
}

结果:

当涉及到继承时,按照如下顺序执行:

  1. 执行父类的静态代码块,并初始化父类静态成员变量
  2. 执行子类的静态代码块,并初始化子类静态成员变量
  3. 执行父类的构造代码块,执行父类的构造函数,并初始化父类普通成员变量
  4. 执行子类的构造代码块, 执行子类的构造函数,并初始化子类普通成员变量








猜你喜欢

转载自blog.csdn.net/zzzzzztt/article/details/79839914
今日推荐