簡體   English   中英

繼承的子類中的Java公共/受保護的變量值為Null

[英]Java public / protected variable values inside inherited subclass is Null

我想從子類訪問在超類中聲明為受保護的變量。

值在子類中顯示為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

SubApp類確實獲得了自己在超類中定義的成員變量var的副本。 它們是2個不同的副本。 對其中一份副本所做的任何更改將始終與另一份副本互斥。 使用靜態成員時情況會發生變化。 在實例化類時,不要混淆繼承中的成員數據共享。

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

您在這里處理范圍問題。 您有正在運行的App實例,並且在該實例內您正在運行循環並在此特定實例內設置變量的值。 然后,您將創建Sub的實例,該實例當前在其內部維護自己的var實例。

現在,如果要在App / Sub的所有實例之間共享var的單個實例,則可以這樣做:

public static String var ;

我假設這是用於家庭作業的,所以我不會去討論它的利弊,但只知道靜態var是您對於任何類型的應用程序都必須考慮的事情之一。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM