Domanda

A seguito è una parte del mio codice per un progetto:

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

Ho subito capito che facendo questo creerà due variabili all'interno della classe corpo chiamati x e altre due variabili nel corpo chiamati a. Come è ancora possibile, e perché sulla terra si fa Java anche lo permettono?

Suppongo che questo è il codice corretto di Classe corpo:

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

Grazie per il vostro tempo

È stato utile?

Soluzione

In un certo senso, modo si sostituisce i campi della classe eccellente. Ma è molto più facile da fare per sbaglio perché non c'è un sovraccarico di campi (si dispone di una sola variabile di un dato nome, il tipo non importa). Questo è indicato come variabile 'nascondere' o 'shadowing'. Quindi, siete sulla strada giusta, ci si ritroverà con due campi con lo stesso nome.

Il secondo esempio è corretto. Essi sono ereditati dalla super-classe e dal momento che non sono dichiarati private, sono visibili alla sottoclasse. E 'generalmente cattiva pratica di rivolgersi direttamente ai campi di un super-classe, e se non c'è una buona ragione, dovrebbero dichiarata private. Il vostro esempio di invocare il costruttore eccellente è l'approccio migliore.

Inoltre, se si nasconde un campo con un altro con lo stesso nome, è ancora possibile fare riferimento a loro come super.x, super.y, contro this.x, this.y, si dovrebbe evitare questa situazione se non del tutto possibile.

Altri suggerimenti

Sì, avrete due variabili, con uno che nasconde l'altra. Ha senso per consentire per due motivi:

  1. Supponiamo che hai un Base classe base e la classe derivata Derived cui l'autore di Base non ha alcuna idea circa. Qualora l'autore di Base mai in grado di aggiungere tutti i campi, solo perché una classe derivata potrebbe condividere i campi? O dovrebbe Derived fermare la compilazione quando il cambiamento di Base in realtà non pregiudica la correttezza?
  2. I tuoi campi dovrebbe quasi sempre essere privata, a quel punto non importa se i nomi sono duplicati o no - né "lato" saprà sulle variabili dell'altra
  3. .

A seguito di ciò che altri hanno detto: È un Body Point? No, Body ha una proprietà di posizione di tipo Point. Quindi Body probabilmente non dovrebbe estendersi Point. Se sbarazzarsi di eredità (di implementazione), allora a sbarazzarsi di un sacco di problemi. Questo, e l'uso private (non protected!) E final liberamente.

  

Ho subito capito che facendo questo creerà due variabili all'interno della classe corpo chiamati x e altre due variabili nel corpo chiamati a. Come è ancora possibile, e perché sulla terra si fa Java anche lo permettono?

In realtà no, non state creando due variabili con lo stesso nome, ovviamente, un compilatore non deve e non consentirebbe questo.

Quello che sono facendo è shadowing le variabili esistenti definite come x e y, il che significa che Body.x e Body.y sono essenzialmente sovrappongono i nomi per Point.x e punto.Ý, rendendo la queste ultime due variabili completamente inaccessibile dalla classe corpo ( link per Java Language Specification definizione di "pedinamento" ).

Nome shadowing è generalmente percepire come una cattiva pratica e una causa di bug, e se si alza gli avvertimenti javac compilatore, il compilatore doverosamente si mettere in guardia su questo.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top