簡體   English   中英

在子類之外訪問 Java 超類變量?

[英]Java super class variable accessed outside of subclass?

如果我有以下三個類:

package com.Bob.Marley;
public class SuperClass{
     protected int x = 0;
}

package com.Bob.Marley;
public class SubClass extends SuperClass{
    protected int x = 1;
}

package com.Bob.Marley;
public class TestClass{
    public static void main (String[] args){
        SubClass s = new SubClass();
        //print 1
        System.out.println(s.x);
        //how do I print the superclass variable?
        //I know inside SubClass I can access it with plain old super.x
        //but what about outside the subclass with a new object. 
    }
}

所以問題是我如何從在單獨的類中創建的新對象的超類打印出 0。 System.out.println(s.super.x); 不起作用。 我認為它不會改變任何東西,但我使用的是 java 8。

表達式s.super.x在這里無效。 每當你給super.x加前綴時,它應該是一個類型名,而不是一個變量名,例如SuperClass.super.x 但是,這僅在訪問封閉類的超類的子類內部有效,此處不存在。

x轉換為SuperClass以便您可以訪問在Superclass聲明的x

System.out.println( ((SuperClass) s).x);

或者

SuperClass sc = (SuperClass) s;
System.out.println(sc.x);

這是有效的,因為變量訪問是靜態綁定的。 變量或表達式的類型決定了搜索變量訪問的范圍。

TL;DR:如果您在子類中引入新字段,請不要重復使用父類中的字段名稱。 你一無所獲,只有困惑和問題。

如果我理解正確,您希望SubClass實例有兩個字段,一個從SuperClass繼承(為了討論,讓我們將其重命名為superX以使事情更清楚),另一個來自子類本身(讓我們將其重命名為subX )。

對於給定的SubClass實例,您希望能夠訪問superXsubX這兩個字段(當然,使用不同的表達式)。 在您的代碼示例中使事情變得困難的是,您選擇為它們提供相同的名稱x

因此,如果您真的希望您的實例同時攜帶這兩個字段,我建議您重命名它們,這樣您就不必使用諸如強制轉換為SuperClass類的丑陋技巧。

public class SuperClass{
     protected int superX = 0;
}

public class SubClass extends SuperClass{
    protected int subX = 1;
}

但是,如果x代表相同的屬性,對於父類和子類具有相同的含義,只是具有不同的初始值,那么擁有兩個不同的字段是沒有意義的,您應該將代碼更改為:

public class SuperClass{
     protected int x = 0;
}

public class SubClass extends SuperClass{
    // constructor initializes the x field with 1.
    public SubClass(){
        x = 1;
    }
}

當然,那么不可能從SubClass的單個實例中獲得兩個不同的值。

暫無
暫無

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

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