簡體   English   中英

在一個擴展Java中另一個類的類中有兩個具有相同名稱的變量

[英]Having 2 variables with the same name in a class that extends another class in Java

以下是我的項目代碼的一部分:

public class Body extends Point{
    public double x, y, mass;

    public Body() {
        x = y = mass = 0;
    }

    public Body(double x, double y, double mass) {
        this.mass = mass;
        this.x = x;
        this.y = y;
    }
}

public class Point {
    public double x;
    public double y;

    public Point(double x, double y) {
        this.x = x;
        this.y = y;
    }
}

我很快意識到這樣做會在Body類中創建兩個名為x的變量,在Body中創建另外兩個名為y的變量。 這怎么可能,以及為什么Java甚至允許它呢?

我假設這是類Body的正確代碼:

public class Body extends Point{
    public double mass;

    public Body() {
        super();
        mass = 0;
    }

    public Body(double x, double y, double mass) {
        super(x,y);
        this.mass = mass;
    }
}

謝謝你的時間

從某種意義上說,你是超越超級階級的領域。 但是由於沒有字段超載(你只有一個給定名稱的變量,類型無關緊要),因此意外地做起來要容易得多。 這被稱為變量'隱藏'或'陰影'。 所以,你是對的,你最終會得到兩個同名的字段。

你的第二個例子是正確的。 它們是從超類繼承的,因為它們不是私有的,所以它們對子類是可見的。 直接引用超類的字段通常是不好的做法,除非有充分的理由,否則它們應該被聲明為私有。 調用超級構造函數的示例是最好的方法。

此外,如果您使用同名的另一個字段隱藏字段,您仍然可以將它們稱為super.x,super.y,而不是this.x,this.y,如果可能的話,您應該避免這種情況。

是的,你將有兩個變量,一個隱藏另一個。 允許它有兩個原因:

  1. 假設你有一個基類Base和派生類DerivedBase的作者根本不知道。 Base的作者是否應該能夠添加任何字段,只是因為派生類可能共享字段? 或者,當對Base的更改實際上不影響正確性時, Derived是否應該停止編譯?
  2. 你的字段幾乎總是私有的,此時名稱是否重復並不重要 - “side”都不會知道另一個的變量。

繼其他人所說的: Body是一個Point嗎? 不, Body具有Point類型的位置屬性。 所以Body可能不應該擴展Point 如果你擺脫繼承(實現),那么你擺脫了很多問題。 那和使用private (不受protected !)和final自由。

我很快意識到這樣做會在Body類中創建兩個名為x的變量,在Body中創建另外兩個名為y的變量。 這怎么可能,以及為什么Java甚至允許它呢?

實際上不,你沒有創建兩個具有相同名稱的變量,顯然編譯器不應該也不允許這樣做。

正在做的是遮蔽定義為xy的現有變量,這意味着Body.x和Body.y基本上與Point.x和Point.y的名稱重疊,使得后兩個變量完全無法從Body類中訪問( 鏈接到Java語言規范定義的“陰影” )。

名稱陰影通常被認為是一種不良做法和錯誤原因,如果你打開javac編譯器警告,編譯器將盡職盡責地警告你。

暫無
暫無

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

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