我有两个类: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);
    }


有人可以解释为什么会这样吗?

最佳答案

让我们看一下下面的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的静态/类变量j作为默认值将为零,因此输出必须为100。

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

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


在这种情况下,分别对TestClass 2的类变量k和TestClass 3的类变量j进行初始化。
因此,现在我们有120个输出。

09-28 09:04