2017-06-06 118 views
-4

我有两个类。 Class2和Class3。 Class2是子类Class3的父类。Java继承:静态变量混淆

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)值。 – Eran

+0

我认为你错过的一点是,虽然'Class3'对象***是***'Class2'对象,在'call'方法中创建了完全不同的'Class2'对象。因此,如果这些字段不是“静态”,那么您在该创建的对象中获得的副本与您在其中调用该方法的“Class3”对象中的副本不同。 –

+0

[Java中的静态变量]的可能重复(https://stackoverflow.com/questions/12506082/static-variable-in-java) –

回答

0

static variables是那些对于该类的所有对象而言其值都是常数的那些值。它们中的任何更改都会反映在其他对象中。

对于非静态变量,对象c将具有其int aint bc.a3,和c.b4。但是这些值属于c;而super(Class2的另一个对象)将具有其值ab,即super.asuper.b,作为00

使用静态变量,当您创建对象c,你初始化ab34,但现在,Class2(包括super)每一个对象将拥有ab初始化为34