Java中初始化块和静态初始化块的区别
在Java中,有两种初始化块:静态初始化块和非静态初始化块.
静态初始化块:使用static定义,当类装载到系统时执行一次.若在静态初始化块中想初始化变量,那仅能初始化类变量,即static修饰的数据成员.
非静态初始化块:在每个对象生成时都会被执行一次,可以初始化类的实例变量.
非静态初始化块会在构造函数执行时,且在构造函数主体代码执行之前被运行.
括号里的是初始化块,这里面的代码在创建java对象时执行,而且在构造器之前执行!
其实初始化块就是构造器的补充,初始化块是不能接收任何参数的,定义的一些所有对象共有的属性、方法等内容时就可以用初始化块了初始化!!
好处是可以提高初始化块的复用,提高整个应用的可维护性。--《疯狂java讲义》
1 class Parent { 2 public static String p_StaticField = "父类--静态变量"; 3 public String p_Field = "父类--变量"; 4 //父类的静态初始化块 5 static { 6 System.out.println(p_StaticField); 7 System.out.println("父类--静态初始化块"); 8 } 9 //父类的非静态初始化快 10 { 11 System.out.println(p_Field); 12 System.out.println("父类--初始化块"); 13 } 14 //父类的构造函数 15 public Parent() { 16 System.out.println("父类--构造器"); 17 } 18 } 19 public class SubClass extends Parent { 20 public static String s_StaticField = "子类--静态变量"; 21 public String s_Field = "子类--变量"; 22 // 子类的静态初始化块 23 static { 24 System.out.println(s_StaticField); 25 System.out.println("子类--静态初始化块"); 26 } 27 //子类的非静态初始化快 28 { 29 System.out.println(s_Field); 30 System.out.println("子类--初始化块"); 31 } 32 //子类的构造函数 33 public SubClass() { 34 System.out.println("子类--构造器"); 35 } 36 public static void main(String[] args) { 37 new Parent(); 38 System.out.println("-------------------"); 39 new SubClass(); 40 System.out.println("-------------------"); 41 new SubClass(); 42 } 43 }
运行结果:
程序的运行结果为:
父类--静态变量
父类--静态初始化块
子类--静态变量
子类--静态初始化块
父类--变量
父类--初始化块
父类--构造器
-------------------
父类--变量
父类--初始化块
父类--构造器
子类--变量
子类--初始化块
子类--构造器
-------------------
父类--变量
父类--初始化块
父类--构造器
子类--变量
子类--初始化块
子类--构造器
分析:
父类--静态变量
父类--静态初始化块
子类--静态变量
子类--静态初始化块
首先java虚拟机加载这两个类,静态块(类块)执行(只执行一次),随后如果产生实例就执行变量块(实例块),再构造方法
如果在Parent类中
public static void main(String[] args) {
Parent p;
}
执行:
结果:
父类--静态变量
父类--静态初始化块
如果在Parent类中
public static void main(String[] args) {
new Parent();
}
父类--静态变量
父类--静态初始化块
父类--变量
父类--初始化块
父类--构造器
若果在SubClass中
public static void main(String[] args) {
new Parent();
}
执行:
结果:因为Java虚拟机加载了两个类(main方法在子类中执行)没有产生子类
父类--静态变量
父类--静态初始化块
子类--静态变量
子类--静态初始化块
父类--变量
父类--初始化块
父类--构造器
在Subclass类中
public static void main(String[] args) {
new Parent();
System.out.println("-------------------");
new SubClass();
}
执行
结果:new子类首先执行父类的实例块和父类的构造方法,然后是子类的实例块和构造方法
父类--静态变量
父类--静态初始化块
子类--静态变量
子类--静态初始化块
父类--变量
父类--初始化块
父类--构造器
-------------------
父类--变量
父类--初始化块
父类--构造器
子类--变量
子类--初始化块
子类--构造器