我有一个继承自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的主方法访问不同的值?
第二种情况是因为我没有在Class_B中实例化Class_A,所以它从Class_A中选择成员值(10),但我不确定案例2是如何工作的。
为什么Class_B的构造函数从Class_A的构造函数中选择它的值?
答案 0 :(得分:1)
当编译器即将完成其工作时,如果没有添加任何人,它将代表您引入对超类构造函数的调用。
规则是任何类构造函数中的第一条指令必须是对同一类的no-arg构造函数的调用,即使用this()
或使用super()
关键字调用超类构造函数
因此,在编译时,您Class_B
(请注意,由于他们不遵守Java命名约定,我对您的班级名称不太满意),您的类构造函数将如下所示:
Class_B(){
super();
check_static = check_static + 1;
}
这将导致调用超类构造函数,即Class_A()
,流程如下:
Class_B()
将致电Class_A()
Class_A()
后,类成员变量check_static
的值将分配给 3 Class_B()
构造函数,check_static
将增加 1 。答案 1 :(得分:0)
System.out.println(check_static); //case 1 --- it calls the variable from class A
Class_B class_b=new Class_B(); -- as you are calling the constructor, the value changes
System.out.println(check_static);//case 2 -- prints the updated value
答案 2 :(得分:0)
因为当你打电话
Class_B class_b=new Class_B();
首先是新的Class_B的超类Class_A,所以Class_A的构造函数将在Class_B实例化之前执行。