Java继承:静态变量混淆

时间:2017-06-06 07:33:32

标签: java inheritance static

我有两节课。 Class2和Class3。 Class2是子类Class3的父类。

package package1;

public class Class2 {

public static int a, b;

public void add() {
    System.out.println("the sum is =" + (a + b));

}

public void product() {
    System.out.println("the product is " + (a * b));
}

public Class2() {
    System.out.println("class 2 constructor");

}

public Class2(int a, int b) {

    this.a = a;
    this.b = b;


}

}

Class3的代码是

package package2;
import package1.*;

public class Class3 extends Class2 {

public Class3(){
    //super(3,4);
    call();
    System.out.println(super.a);
    System.out.println(b);
    System.out.println("class 3 constructor");



}

public void call(){
    Class2 c=new Class2(3,4);
    super.add();
    super.product();



}
public void add(){
    System.out.println("child class add method");


}

}

上面的代码工作正常,输出是

class 2 constructor
the sum is =7 
the product is 12 
3 
4
class 3 constructor

问题:当我使父类变量非静态时,则该值未初始化,结果看起来像这样

class 2 constructor ,
the sum is =0
the product is 0 
0 
0 
class 3 constructor.

但是如果我使用super()调用子类中的父类构造函数,那么保持变量是非静态的,那么它会给出结果。 这个问题的原因是什么,我该如何解决?

1 个答案:

答案 0 :(得分:0)

static variables是那些值对于该类的所有对象都是常量的。它们的任何变化也会反映在其他对象中。

对于非静态变量,对象c将具有int aint b,即c.a将为3c.b将是4。但这些值属于c;而super(Class2的另一个对象)的值为ab,即super.asuper.b0和{{1 }}

使用静态变量时,在创建对象0时,会将ca初始化为b3,但现在,每个4 的单个对象(包括Class2)将supera初始化为b3