2012-06-25 63 views
-2

我遇到類的繼承問題。 這裏是我的Java代碼:Java打印中的繼承null

public class spaarRekening extends rekening{ 
    private double rente; 
    public double getRente(){ 
     return rente; 
    } 
    spaarRekening(String rN, int s, double d){ 
     super(rN, s); 
     rente = d; 
    } 
    spaarRekening sR = new spaarRekening("456", 999999, 2.5); 
} 

public static class rekening implements rekeningIF{ 
    int saldo; 
    static String rekeningNummer; 
    rekening(String rN, int s){ 
     rekeningNummer = rN; 
     saldo = s; 
    } 
    public static String getRekeningNummer(){ 
     return rekeningNummer; 
    } 
    public int getSaldo(){ 
     return saldo; 
    } 
} 

我想讓spaarRekening被打印出來:

System.out.printf("Uw rekeningnummer is: %s\n", spaarRekening.getRekeningNummer()); 

但它打印出空。 這是爲什麼?

謝謝。

+2

在構造函數中初始化一個靜態var很可能是一個bug。在極少數情況下,這可能是合理的。此外,您的代碼非常混亂,因爲每個Java-Developer在閱讀'spaarRekening.getRekeningNummer()'時都會考慮一個實例。事實上,這是一個靜態調用'spaarRekening'類型。類型以Java中的大寫字母開頭! –

+1

「rekeningNummer」爲靜態的任何特定原因?看起來很奇怪,因爲你會認爲真實世界的系統會有很多(可能是獨特的)rekeningNummers。 – maksimov

+0

實例化自己內部的spaarRekening實例嗎? – didxga

回答

0

您的rekeningNummer是一個靜態變量,類型爲Object並在您的代碼中。該變量尚未初始化,因此它打印了null

你必須在使用前初始化靜態變量:

public static class Rekening implements RekeningIF{ 
    int saldo; 
    static String rekeningNummer = ""; // initialized to empty String 

    Rekening(String rN, int s){ 
     rekeningNummer = rN; 
     saldo = s; 
    } 

    public static String getRekeningNummer(){ 
     return rekeningNummer; 
    } 

    // Provide method for setting value of rekeningNumber 
    public static void setRekeningNumber(String number) { 
     rekening.rekeningNummer = number; 
    } 

    public int getSaldo(){ 
     return saldo; 
    } 
} 
+0

不會在構造函數中初始化它嗎?就像int saldo;沒有使用int saldo = 0進行初始化; –

+1

@EricRobinson他在構造函數中初始化,但他從不調用構造函數。他正在調用'spaarRekening'類型的靜態方法。由於OP的類型以小寫字母開頭,因此非常令人困惑。 –

+1

公平地說,這裏有一行'spaarRekening sR = new spaarReckinging(「456」,999999,2.5);'。這有點錯了,但給了你一個想法。 – maksimov

0

你永遠不會初始化rekeningNummer,默認值爲null。

1

由於您永遠不會創建spaarRekeningrekening類型的任何對象,所以變量rekeningNummer永遠不會被初始化,因爲您在構造函數中執行初始化。

當您在構造函數中初始化它時,最有可能想讓您的rekeningNummer非靜態。

當你真的希望它是靜態的,那麼你也應該以靜態的方式初始化它。因此,從構造函數中刪除代碼並在聲明時立即對其進行初始化。

public class SpaarRekening extends Rekening{ 
    private double rente; 

    SpaarRekening(String rN, int s, double d){ 
     super(rN, s); 
     rente = d; 
    } 

    public double getRente(){ 
     return rente; 
    } 

    public static void main(String[] args) { 
      SpaarRekening sR = new SpaarRekening("456", 999999, 2.5d); 
      System.out.println(sR.getRekeningNummer()); 
    } 

} 

public class Rekening implements RekeningIF{ 
    protected int saldo; 
    protected String rekeningNummer; 

    Rekening(String rN, int s){ 
     rekeningNummer = rN; 
     saldo = s; 
    } 

    public String getRekeningNummer(){ 
     return rekeningNummer; 
    } 

    public int getSaldo(){ 
     return saldo; 
    } 
} 
0

你永遠不會初始化rekeningNummer,你可能會認爲你spaarRekening類中聲明spaarRekening sR = new spaarRekening("456", 999999, 2.5);將初始化它,但你把它類定義中,你實際上並沒有任何實例的實例spaarRekening。刪除該語句,並在您的代碼中的其他地方實例化它

3

請勿使用static。直到你明白它是如何工作的以及它適用於何處。

+0

不是一個真正的答案,但+1,因爲它非常適合。 –