我有两个类: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);
}
有人可以解释为什么会发生这种情况吗?
答案 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的回答错过了这一点。
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。
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.