我有一个继承自Class_A的Class_A和Class_B:
public class Class_A {
public static int check_static = 10;
Class_A() {
check_static = 3;
}
public static void main(String... args) {
System.out.println(check_static);
}
}
public class Class_B extends Class_A {
Class_B() {
check_static = check_static+1;
}
public static void main(String... args) {
System.out.println(check_static); // case 1
Class_B class_b = new Class_B();
System.out.println(check_static); // case 2
}
}
为什么Class_B的构造函数访问check_static
的值和Class_B的main方法访问不同的值?
第二种情况是因为我没有在 Class_B 中实例化 Class_A,因此它从 Class_A 中选择成员值 (10),但我不确定情况 2 是如何工作的。
为什么Class_B的构造函数从Class_A的构造函数中选取它的值?
最佳答案
当编译器即将完成其工作时,如果尚未添加父类(super class)构造函数,它将代表您引入对父类(super class)构造函数的调用。
规则是,任何类构造函数中的第一条指令必须是对同一类的无参数构造函数的调用,即使用 this()
或使用 super()
关键字。
因此,编译后,您的 Class_B
(请注意,我对您的类名不太满意,因为它们不遵守 Java 命名约定),您的类构造函数将如下所示:
Class_B(){
super();
check_static = check_static + 1;
}
这将导致调用父类(super class)构造函数,即Class_A()
,流程如下:
- 调用
Class_B()
将导致调用Class_A()
- 调用
Class_A()
后,类成员变量check_static
的值将赋给 3 - 现在回到
Class_B()
构造函数,check_static
将增加 1。 - 将值打印到控制台将得出总和 4。
关于java - 继承类中的静态成员变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29716880/