先上结论,后面有代码示例
总结:
1、当初始化一个类的时候,如果父类没有初始化,则会触发父类的初始化,并且只会初始化一次。
2、new 一个对象的执行顺序:
父类静态代码块(按照代码顺序)-》子类静态代码块(按照代码顺序)-》父类属性赋值-》父类构造块(按照构造块顺序)-》父类构造方法-》子类属性赋值-》子类构造块(按照构造块顺序)-》子类构造方法。
3、引用常量不会触发初始化。
代码示例:
public class LoaderTest1 {
public static void main(String[] args){
try {
//System.out.println(Parent.value);
System.out.println("------------------------");
//System.out.println(Child.cValue);
System.out.println("------------------------");
//System.out.println(new Child());
System.out.println("------------------------");
//System.out.println(new Child());
System.out.println("------------------------");
//System.out.println(Child.class);
System.out.println("------------------------");
//Class.forName("com.licy.question.loader.Child");
System.out.println("------------------------");
System.out.println(Child.cont);
}catch (Exception e){
e.printStackTrace();
}
}
}
class Parent{
public static String value = "父类";
public static String value1 = "父类";
public C c = new C();
static{
System.out.println("父类第一个静态代码块");
}
{
System.out.println("父类构造方法前的构造块");
}
public Parent(){
System.out.println("父类构造方法");
}
static {
System.out.println("父类第二个静态代码块");
}
{
System.out.println("父类构造方法后的构造块");
}
}
class Child extends Parent{
public static String value = "子类";
public static String cValue = "子类自己";
public final static String cont = "常量";
public A a = new A();
public B B = new B();
static {
System.out.println("子类第一个静态代码块");
}
public Child(){
System.out.println("子类构造方法");
}
static {
System.out.println("子类第二个静态代码块");
}
{
System.out.println("子类构造块");
}
}
class A {
public A(){
System.out.println("这是A");
}
}
class B {
public B(){
System.out.println("这是B");
}
}
class C {
public C(){
System.out.println("这是C");
}
}