初始化块和静态初始化块的区别?
先看代码:
class Parent {
public static String p_StaticField = "父类--静态变量";
public String p_Field = "父类--变量";
// 下面这些是干什么的?解释以下,不是很明白
static {
System.out.println(p_StaticField);
System.out.println("父类--静态初始化块");
}
// 下面这是干什么的?不明白?为什么这么写
{
System.out.println(p_Field);
System.out.println("父类--初始化块");
}
public Parent() {
System.out.println("父类--构造器");
}
}
public class SubClass extends Parent {
public static String s_StaticField = "子类--静态变量";
public String s_Field = "子类--变量";
// 静态初始化块
static {
System.out.println(s_StaticField);
System.out.println("子类--静态初始化块");
}
{
System.out.println(s_Field);
System.out.println("子类--初始化块");
}
public SubClass() {
System.out.println("子类--构造器");
}
public static void main(String[] args) {
new Parent();
System.out.println("-------------------");
new SubClass();
System.out.println("-------------------");
new SubClass();
}
}
程序的运行结果为:
父类--静态变量
父类--静态初始化块
子类--静态变量
子类--静态初始化块
父类--变量
父类--初始化块
父类--构造器
-------------------
父类--变量
父类--初始化块
父类--构造器
子类--变量
子类--初始化块
子类--构造器
-------------------
父类--变量
父类--初始化块
父类--构造器
子类--变量
子类--初始化块
子类--构造器
不明白为什么是这样的结果?把详细的执行过程讲下好吗?谢谢了
------解决方案--------------------我理解的也不知道确切不
父类--静态变量
父类--静态初始化块
子类--静态变量
子类--静态初始化块
首先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子类首先执行父类的实例块和父类的构造方法,然后是子类的实例块和构造方法
父类--静态变量
父类--静态初始化块
子类--静态变量
子类--静态初始化块
父类--变量
父类--初始化块
父类--构造器
-------------------
父类--变量
父类--初始化块
父类--构造器
子类--变量
子类--初始化块
子类--构造器
------解决方案--------------------1.静态初始化块只在某个类第一次装入内存时才执行,这就是为什么只有第一次new Parent()才有“静态初始化块”输出,而后面却不执行输出的原因。
2.初始化块在某个对象生成时(被new)执行。所以两次new SubClass()都执行初始化块。因为SubClass也是Parent类,所有new SubClass()时也执行Parent的初始化块
------解决方案--------------------