2 Variablen mit demselben Namen in einer Klasse haben, die eine andere Klasse in Java erweitert

StackOverflow https://stackoverflow.com/questions/772663

Frage

Im Folgenden ist ein Teil meines Code für ein Projekt:

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;
    }
}

Mir wurde schnell klar, dass dies erzeugt wird zwei Variablen in der Körperklasse, die X und zwei andere Variablen im Körper bezeichnet werden, namens Y. Wie ist das überhaupt möglich und warum um alles in der Welt lässt Java überhaupt zugelassen?

Ich gehe davon aus, dass dies der richtige Code des Klassenkörpers ist:

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;
    }
}

Vielen Dank für Ihre Zeit

War es hilfreich?

Lösung

In gewissem Sinne überschreiben Sie Felder der Superklasse. Es ist jedoch viel einfacher, versehentlich zu tun, da es keine Überladung von Feldern gibt (Sie haben nur eine Variable eines angegebenen Namens, der Typ spielt keine Rolle). Dies wird als Variable "Versteck" oder "Schatten" bezeichnet. Sie haben also Recht, Sie werden zwei Felder mit demselben Namen haben.

Ihr zweites Beispiel ist korrekt. Sie werden von der Superklasse geerbt und da sie nicht privat erklärt werden, sind sie für die Unterklasse sichtbar. Es ist im Allgemeinen eine schlechte Praxis, sich direkt auf die Felder einer Superklasse zu beziehen, und es sei denn, es gibt einen guten Grund, sollten sie privat erklären. Ihr Beispiel für das Aufrufen des Superkonstruktors ist der beste Ansatz.

Wenn Sie ein Feld mit einem anderen gleichnamigen Namen verbergen, können Sie sie immer noch als Super.x, Super.y, gegen This.x, this.y, diese Situation vermeiden, wenn dies überhaupt möglich ist, vermeiden.

Andere Tipps

Ja, Sie werden zwei Variablen haben, wobei einer die andere versteckt. Es ist sinnvoll, es aus zwei Gründen zuzulassen:

  1. Angenommen, Sie haben eine Basisklasse Base und eine abgeleitete Klasse Derived was der Autor von Base Hat keine Ahnung davon. Sollte der Autor von Base NIEMALS in der Lage sein, Felder hinzuzufügen, nur weil eine abgeleitete Klasse könnte die Felder teilen? Oder sollte Derived Hören Sie auf, zu kompilieren, wenn die Änderung zu Änderung Base Wirkt sich nicht die Richtigkeit aus?
  2. Ihre Felder sollten fast immer privat sein. An diesem Punkt spielt es keine Rolle, ob die Namen dupliziert sind oder nicht - weder "Seite" wissen über die Variablen des anderen.

Weiter zu dem, was andere gesagt haben: ist Body a Point? Nein, Body hat eine Positionseigenschaft vom Typ Point. So Body Wahrscheinlich sollte sich nicht ausdehnen Point. Wenn Sie die Erbschaft (der Implementierung) loswerden, werden Sie viele Probleme los. Das und benutze private (nicht protected!) und final großzügig.

Ich erkannte schnell, dass dies zwei Variablen in der Körperklasse, die X und zwei andere Variablen im Körper namens Y namens Y erzeugt. Wie ist das überhaupt möglich und warum um alles in der Welt lässt Java überhaupt zugelassen?

Eigentlich nein, Sie erstellen nicht zwei Variablen mit demselben Namen, offensichtlich sollte ein Compiler dies nicht zulassen und nicht.

Was du sind Das Schatten der vorhandenen Variablen, die definiert als x und y, was bedeutet, dass body.x und body.y im Wesentlichen die Namen für point.x und point.y überlappen, wodurch die beiden letzteren Variablen aus der Körperklasse vollständig unzugänglich machen (Link zur Java -Sprachspezifikation Definition von "Schatten").

Das Schattieren des Namens wird im Allgemeinen als schlechte Praxis und Ursache für Käfer wahrnimmt. Wenn Sie die Warnungen für Javac -Compiler aufdrehen, warnen Sie der Compiler Sie pflichtbewusst davor.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top