继承类中的静态成员变量

时间:2015-04-18 11:46:25

标签: java oop java-ee

我有一个继承自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的构造函数中选择它的值?

3 个答案:

答案 0 :(得分:1)

当编译器即将完成其工作时,如果没有添加任何人,它将代表您引入对超类构造函数的调用。

规则是任何类构造函数中的第一条指令必须是对同一类的no-arg构造函数的调用,即使用this()或使用super()关键字调用超类构造函数

因此,在编译时,您Class_B(请注意,由于他们不遵守Java命名约定,我对您的班级名称不太满意),您的类构造函数将如下所示:

Class_B(){
  super();
  check_static = check_static + 1;    
}

这将导致调用超类构造函数,即Class_A(),流程如下:

  1. 致电Class_B()将致电Class_A()
  2. 调用Class_A()后,类成员变量check_static的值将分配给 3
  3. 现在回到Class_B()构造函数,check_static将增加 1
  4. 将值打印到控制台将产生 4 的总和。

答案 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实例化之前执行。