2015-10-05 58 views
0

我想從子類訪問在Superclass中聲明爲protected的變量。繼承的子類中的Java public/protected變量值爲空

該值在子類中顯示爲null,儘管它在超類中正確顯示。如果超類變量是靜態的,它可以工作,但是循環值不會被正確採用。

我的代碼:

public class App { 
    public String var ; 

    public static void main(String[] args) {  
     App ap = new App(); 
     ap.fromt(); 
    } 

    public void fromt() { 
     Sub s = new Sub(); 
     for(int i = 0; i <= 5; i++) { 
      var = "Test" + i; 
      System.out.println("Hello World!" + var); 
      s.testtt(); 
     } 
    } 
} 

//**Inherited Class**// 
public class Sub extends App { 
    public void testtt() { 
     String var2 = super.var; 
     System.out.println("Hello World! Subclass" + var2); 
    } 
} 

輸出:

Hello World!Test0 
Hello World! Subclassnull 
Hello World!Test1 
Hello World! Subclassnull 
Hello World!Test2 
Hello World! Subclassnull 
Hello World!Test3 
Hello World! Subclassnull 
Hello World!Test4 
Hello World! Subclassnull 
Hello World!Test5 
Hello World! Subclassnull 
+0

我不是java的專家......但你必須使用'this'關鍵字來使它工作。例如'this.var =「Test」+ i;'而不是'var =「Test」+ i;' –

+1

在調用's.testtt()'之前,您沒有將var設置爲任何值。可能你想這樣做,'s.var =「Test」+ i;' – Codebender

+1

因爲在你的App類中,你還沒有定義var。當你調用你的Sub構造函數時,它將採用該未定義的變量。在靜態情況下,由於所有聲明的對象都共享相同的靜態變量,所以一旦您稍後定義變量,則從該類構造的所有其他對象都可以使用該變量 – SerMintt

回答

0

你這裏處理的範圍的問題。您有正在運行的應用程序的實例,並且在該實例中,您正在運行循環並在此特定實例中設置變量的值。然後,您將創建一個Sub實例,該實例目前在其本身中維護其自己的var實例。現在

,如果你想VAR的單一實例跨應用程序/分的所有實例共享,那麼你將使它:

public static String var ; 

我假設這是一個家庭作業,所以我不會進入這個優點和缺點,但只知道靜態變量是你真的必須考慮的任何類型的應用程序之一。

+0

謝謝Michael,我正在做一個單元測試(代碼在這裏),以便在我的實際項目中實現for循環值(來自excel表單)。不幸的是,我將無法使用public static String,是否還有其他我可以正確地獲取值? – Shanti

+0

正如前面提到的,只需向類中添加構造函數就可以傳遞值。或者你可以添加一個setter/getter。不知道爲什麼你要擴展App來保存變量聲明。 – Michael

1

類別SubApp確實獲取了自己在超類中定義的成員變量var的副本。 他們是2個不同的副本。 對其中一個副本所做的任何更改將與另一個副本保持互斥。當使用靜態成員時,事情會改變。在類實例化時不應該混淆繼承中成員數據的共享。

要回答您的疑問,String var不會在任何地方初始化,因此默認情況下會採用空值。如果在聲明超類App的構造函數時或初始化該值時,該值也將反映在Sub的實例中。

+0

謝謝Deepak澄清。我嘗試使用一個構造函數,但沒有得到我的預期結果:(。如果我給,保護字符串var =「」;,它會顯示空白,沒有NULL.Is有任何方法來獲取值在子類中,從超類共享變量值? – Shanti