2017-06-06 117 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