Java的初始化观察

package cn.net.cdsz.ccb.test;
class T1 {
    public T1() {
        System.out.println("T1");
    }
}
class T2 {
    public T2() {
        System.out.println("T2");
    }
}
public class Test {

    static T1 t1 = new T1();
    static int x = set(1);
    T2 t2 = new T2();
    int y = set(5);
    static int set(int i) {
        System.out.println(i);
        return i;
    }
    public static void main(String[] args) {

        System.out.println("main");

    }
}

提供的代码中,输出的结果是:

T1

1

main

这是因为在Java类加载和初始化的过程中,静态成员变量和静态初始化块会在类加载阶段被依次执行,而实例成员变量和实例初始化块会在创建对象时执行。让我们来分析一下你的代码的执行流程:

  1. 静态成员变量 static T1 t1 = new T1(); 会被初始化,从而打印出 "T1"。
  2. 静态方法 static int set(int i) 被调用,参数为 1,打印出 "1",然后返回 1。
  3. 静态成员变量 static int x = set(1); 被初始化,调用了静态方法,打印出 "1",然后将返回值 1 赋值给变量 x。
  4. 类的 main 方法被执行,打印出 "main"。

注意,在类加载和初始化过程中,实例成员变量和实例初始化块是在创建对象时执行的。因此,实例成员变量 T2 t2 = new T2(); 以及实例成员变量 int y = set(5); 在创建对象时才会被初始化,而你的 main 方法中并没有创建对象,所以实例成员相关的初始化代码并没有被执行,因此没有打印出 "T2" 和 "5"。

如果在 main 方法中创建一个 Test 类的对象,那么实例相关的初始化代码会被执行,你会看到 "T2" 和 "5" 的输出。例如:

package cn.net.cdsz.ccb.test;
class T1 {
    public T1() {
        System.out.println("T1");
    }
}
class T2 {
    public T2() {
        System.out.println("T2");
    }
}
public class Test {

    static T1 t1 = new T1();
    static int x = set(1);
    T2 t2 = new T2();
    int y = set(5);
    static int set(int i) {
        System.out.println(i);
        return i;
    }
    public static void main(String[] args) {
        Test test = new Test(); // 创建对象  就这里加了一行
        System.out.println("main");
    }
}

输出的结果是:

T1
1
T2
5
main

你可能感兴趣的:(杂说,.net,java,算法)