Java中的类初始化过程

时间:2018-04-10 01:18:53

标签: java class initialization

我有两个类:TestClass2和TestClass3。 TestClass3扩展了TestClass2。

    public class TestClass2 {
    static int i=10;
    static int k=TestClass3.j+100;
}


public class TestClass3 extends TestClass2{    
    static  int j=20;
}

现在我在另一个班上打印时:

public static void main(String[] args) {
    System.out.println(TestClass3.j);
   System.out.println(TestClass2.k);
}

我得到 20 100

的结果

但是当我打印TestClass2.K(如下所示)时,我得到的结果为120.

 public static void main(String[] args) {
        System.out.println(TestClass2.k);
    }

有人可以解释为什么会发生这种情况吗?

3 个答案:

答案 0 :(得分:1)

让我们在java中看到以下程序。

public class Inheritance {
    static class TestClass2 {
        static int i=10;
        static int k=TestClass3.j+100;

        static
        {
            System.out.println("TestClass2 class : " + k);
            System.out.println("TestClass3 j : " + TestClass3.j);
        }

    }

    static class TestClass3 extends TestClass2{    
        static  int j=20;

        static
        {
            System.out.println("TestClass3 class : " + j);
        }


    }

    public static void main(String[] args) {
       System.out.println(TestClass3.j);
       System.out.println(TestClass2.k);
    }

}

输出类似于:

TestClass2 class : 100
TestClass3 j : 0
TestClass3 class : 20
20
100

当调用TestClass3时,TestClass2将首先被初始化, TestClass2继承。

正如您可以看到控制台消息,我们有一个这样的继承树:

TestClass2> TestClass3

因此,TestClass3的static / class变量j将为零作为默认值,因此输出必须为100.

在main方法中注释第一行代码,然后我们可以看到下一个结果;

TestClass3 class : 20
TestClass2 class : 120
TestClass3 j : 20
120

在这种情况下,TestClass 2中的类变量k和TestClass 3中的j都是单独初始化的。 所以,现在我们有120作为输出。

答案 1 :(得分:0)

如果您的Print(int a)方法定义只是System.out.println(a),那么实际结果是20和120.因为TestClass3需要在TestClass2之前初始化。所以TestClass3.j是20.然后TestClass2初始化k,即20 + 100,120。

为了帮助您,请同时附上Print()方法正文。

答案 2 :(得分:0)

我确信tommybee的回答错过了这一点。

情况1:

public static void main(String[] args) {
    System.out.println(TestClass3.j);
    System.out.println(TestClass2.k);
}

当您打开TestClass3.j时,在TestClass3初始化之前,您将初始化TestClass2,因为它是TestClass3的超类。这意味着TestClass2中的k比TestClass3中的j更早地初始化,并且在那时j默认分配为零。所以你得到:

k = TestClass3.j + 100 = 0 + 100 = 100; 

然后返回TestClass3以将j初始化为20。

情况2

public static void main(String[] args) {
    System.out.println(TestClass2.k);
}

在这种情况下,您打印TestClass2.k,它按顺序运行代码。

static int k=TestClass3.j + 100;

你得到TestClass3.j,它被初始化为20(此时不考虑k,因为k正在增长),然后你让k得到120.