Java 构造函数,匿名构造函数,静态代码块加载顺序学习

156 阅读3分钟

在做京东笔试的时候,有几道涉及到类加载机制的题,目前结果大概搞明白了,但是原理没有搞明白。先把结果放在这,等搞明白了原理再来修改。 程序代码大概是这样的:

  1. public static final String str = "Base";
public class ClassLoadTest {
    public static void main(String[] args) {
        // new Child();
        System.out.println(Child.str);
        //new Child();

    }
}
class Base {
    // public static String str = "Base";
    public static final String str = "Base";
    public Base() {
        System.out.println("Base Construct Statement");
    }

    {
        System.out.println("Base Normal Statement");
    }

    static {
        System.out.println("Base Static Statement");
    }
}
class Child extends Base {
    // public static String str = "Child";
    // public static final String str = "Child";
    public Child() {
        System.out.println("Child Construct Statement");
    }

    {
        System.out.println("Child Normal Statement");
    }

    static {
        System.out.println("Child Static Statement");
    }
}

将会输出:

Base

可以看出并没有加载父类 Base 与子类 Child

  1. public static String str = "Base";
package exam.jingdong180909;

public class ClassLoadTest {
    public static void main(String[] args) {
        // new Child();
        System.out.println(Child.str);
        //new Child();

    }
}
class Base {
     public static String str = "Base";
//    public static final String str = "Base";
    public Base() {
        System.out.println("Base Construct Statement");
    }

    {
        System.out.println("Base Normal Statement");
    }

    static {
        System.out.println("Base Static Statement");
    }
}
class Child extends Base {
    // public static String str = "Child";
    // public static final String str = "Child";
    public Child() {
        System.out.println("Child Construct Statement");
    }

    {
        System.out.println("Child Normal Statement");
    }

    static {
        System.out.println("Child Static Statement");
    }
}

将会输出:

Base Static Statement
Base

可以看出并没有加载子类 Child

  1. public static final String str = "Child";
public class ClassLoadTest {
    public static void main(String[] args) {
        // new Child();
        System.out.println(Child.str);
        //new Child();

    }
}
class Base {
//     public static String str = "Base";
//    public static final String str = "Base";
    public Base() {
        System.out.println("Base Construct Statement");
    }

    {
        System.out.println("Base Normal Statement");
    }

    static {
        System.out.println("Base Static Statement");
    }
}
class Child extends Base {
    // public static String str = "Child";
     public static final String str = "Child";
    public Child() {
        System.out.println("Child Construct Statement");
    }

    {
        System.out.println("Child Normal Statement");
    }

    static {
        System.out.println("Child Static Statement");
    }
}

将会输出:

Child
  1. public static String str = "Child";
public class ClassLoadTest {
    public static void main(String[] args) {
        // new Child();
        System.out.println(Child.str);
        //new Child();

    }
}
class Base {
//     public static String str = "Base";
//    public static final String str = "Base";
    public Base() {
        System.out.println("Base Construct Statement");
    }

    {
        System.out.println("Base Normal Statement");
    }

    static {
        System.out.println("Base Static Statement");
    }
}
class Child extends Base {
     public static String str = "Child";
//     public static final String str = "Child";
    public Child() {
        System.out.println("Child Construct Statement");
    }

    {
        System.out.println("Child Normal Statement");
    }

    static {
        System.out.println("Child Static Statement");
    }
}

将会输出:

Base Static Statement
Child Static Statement
Child
  1. 同时添加 public static String str = "Base";public static String str = "Child";
public class ClassLoadTest {
    public static void main(String[] args) {
        // new Child();
        System.out.println(Child.str);
        //new Child();

    }
}
class Base {
     public static String str = "Base";
//    public static final String str = "Base";
    public Base() {
        System.out.println("Base Construct Statement");
    }

    {
        System.out.println("Base Normal Statement");
    }

    static {
        System.out.println("Base Static Statement");
    }
}
class Child extends Base {
     public static String str = "Child";
//     public static final String str = "Child";
    public Child() {
        System.out.println("Child Construct Statement");
    }

    {
        System.out.println("Child Normal Statement");
    }

    static {
        System.out.println("Child Static Statement");
    }
}

Child 将会覆盖 Basestr 属性,将会输出:

Base Static Statement
Child Static Statement
Child
  1. 同时添加 public static final String str = "Base";public static final String str = "Child";
public class ClassLoadTest {
    public static void main(String[] args) {
        // new Child();
        System.out.println(Child.str);
        //new Child();

    }
}
class Base {
//     public static String str = "Base";
    public static final String str = "Base";
    public Base() {
        System.out.println("Base Construct Statement");
    }

    {
        System.out.println("Base Normal Statement");
    }

    static {
        System.out.println("Base Static Statement");
    }
}
class Child extends Base {
//     public static String str = "Child";
     public static final String str = "Child";
    public Child() {
        System.out.println("Child Construct Statement");
    }

    {
        System.out.println("Child Normal Statement");
    }

    static {
        System.out.println("Child Static Statement");
    }
}

Child 将会覆盖 Basestr 属性,将会输出:

Child
  1. 添加 new Child()
public class ClassLoadTest {
    public static void main(String[] args) {
        // new Child();
        System.out.println(Child.str);
        new Child();

    }
}
class Base {
//     public static String str = "Base";
    public static final String str = "Base";
    public Base() {
        System.out.println("Base Construct Statement");
    }

    {
        System.out.println("Base Normal Statement");
    }

    static {
        System.out.println("Base Static Statement");
    }
}
class Child extends Base {
//     public static String str = "Child";
     public static final String str = "Child";
    public Child() {
        System.out.println("Child Construct Statement");
    }

    {
        System.out.println("Child Normal Statement");
    }

    static {
        System.out.println("Child Static Statement");
    }
}

将会输出:

Child
  1. 若给 Main添加静态语句块,构造函数,匿名构造函数:
public class ClassLoadTest {
    static {
        System.out.println("Main Static Statement");
    }
    {
        System.out.println("Main Normal Statement");
    }
    public ClassLoadTest() {
        System.out.println("Main Construct Statement");
    }
    public static void main(String[] args) {
        // new Child();
        System.out.println(Child.str);
        new Child();

    }
}
class Base {
//     public static String str = "Base";
    public static final String str = "Base";
    public Base() {
        System.out.println("Base Construct Statement");
    }

    {
        System.out.println("Base Normal Statement");
    }

    static {
        System.out.println("Base Static Statement");
    }
}
class Child extends Base {
//     public static String str = "Child";
     public static final String str = "Child";
    public Child() {
        System.out.println("Child Construct Statement");
    }

    {
        System.out.println("Child Normal Statement");
    }

    static {
        System.out.println("Child Static Statement");
    }
}

则输出:

Main Static Statement
Child
Base Static Statement
Child Static Statement
Base Normal Statement
Base Construct Statement
Child Normal Statement
Child Construct Statement