标签:自动 sub null this调用 顺序 构造 成员变量 jvm 选项
Java为对象初始化提供了多种选项。
当new一个对象的时候,对象初始化开始:
1.首先,JVM加载类(只加载一次,所以,即使多次new对象,下面的代码也只会在第一次new的时候执行一次),此时,
静态字段默认初始化
声明为static的静态字段会被初始化为默认值:数字为0,布尔值为false,对象为null
静态字段显式初始化
如果statis字段有显式赋值,就执行显式初始化
静态代码块
静态代码块可以有任意多个,它们的执行顺序就是在类中声明的顺序
2.类加载完毕,然后以下代码(每次new对象都会执行),
默认字段初始化
成员变量首先会自动地的被初始化为默认值:数字为0,布尔值为false,对象为null。
局部变量不会被自动初始化,使用前必须先进性赋值。
显式字段初始化
初始化块
初始化块可以有任意多个,其执行顺序就是它们在类中声明的顺序
3.构造器初始化
如果在构造器中使用this调用了另一个构造器,就执行被调用的构造器
然后,执行构造器中的代码
4.如果一个类继承了另一个类(当然,任意类都直接或间接的继承自Object),在构造器初始化时,有所不同
如果派生类中的构造器使用super调用了超类中的构造器,
首先会先加载超类(只会加载一次),执行静态字段初始化与静态初始化块;
然后,执行超类中的字段初始化与初始化块;
接着,执行被调用的超类构造器中的代码;
最后,执行当前类构造器中的代码。
如果没有使用super调用超类中的构造器,JVM会调用超类中的默认(无参)构造器,其执行顺序同上。
所以,如果超类中没有无参构造器(定义了有参构造器),并且子类构造器中没有使用super调用超类中的有参构造器,编译器会报错。
演示代码
public class MyClass {
private int i=0;
private String s=null;
private static int id=0;
static {
System.out.println("静态初始化块 1");
}
static {
System.out.println("静态初始化块 2");
}
{
System.out.println("初始化块 1");
}
{
System.out.println("初始化块 2");
}
public MyClass() {
this(0,"");
System.out.println("MyClass()");
}
public MyClass(int i, String s) {
System.out.println("MyClass(int,String)");
this.i = i;
this.s = s;
}
public static void main(String[] args) {
new MyClass();
}
}
public class MySubClass extends MyClass
{
private int b=0;
public MySubClass()
{
System.out.println("MySubClass()");
}
public MySubClass(int i,String s,int b)
{
super(i,s);
this.b = b;
System.out.println("MySubClass(int,String,int)");
}
public static void main(String[] args)
{
new MySubClass();
new MySubClass(0,"",0);
}
}
标签:自动 sub null this调用 顺序 构造 成员变量 jvm 选项
原文地址:https://www.cnblogs.com/lypzzzzz/p/14947931.html