Question

Voici une partie de mon code pour un projet:

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

Je suis vite rendu compte que faire cela va créer deux variables dans la classe du corps appelé x et deux autres variables dans le corps appelé y. Comment est-ce possible, et pourquoi diable ne Java permet même pas?

Je suppose que c'est le code correct du corps de la classe:

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

Merci pour votre temps

Était-ce utile?

La solution

Dans un sens, vous surchargez les champs de la super classe. Mais il est beaucoup plus facile de le faire accidentellement parce qu'il n'y a pas de surcharge des champs (vous avez seulement une variable d'un nom donné, le type n'a pas d'importance). Ceci est appelé variable « cacher » ou « shadowing ». Donc, vous avez raison, vous vous retrouverez avec deux champs avec le même nom.

Votre deuxième exemple est correcte. Ils sont hérités de la super-classe et car ils ne sont pas déclarés privés, ils sont visibles à la sous-classe. Il est pratique généralement mauvais de se référer directement aux champs d'un super-classe, et à moins d'une bonne raison, ils devraient déclaré privés. Votre exemple d'invoquer le constructeur super est la meilleure approche.

En outre, si vous cachez un champ avec un autre du même nom, vous pouvez toujours les consulter comme super.x, super.y, contre this.x, this.y, vous devriez éviter cette situation si tout possible.

Autres conseils

Oui, vous aurez deux variables, avec un cache l'autre. Il est logique de permettre pour deux raisons:

  1. Supposons que vous avez une classe de base Base et une Derived de classe dérivée que l'auteur de Base n'a aucune idée. l'auteur de Base ne doit jamais être en mesure d'ajouter des champs, juste parce qu'une classe dérivée peut partager les champs? Ou devrait Derived arrêter la compilation lorsque le changement de Base n'affecte pas vraiment l'exactitude?
  2. Vos champs doivent presque toujours être privé, à quel point il n'a pas d'importance si les noms sont dupliquées ou non - ni « côté » va connaître les variables de l'autre
  3. .

Suite à ce que les autres ont dit: Est-ce Body un Point? Non, Body a une propriété de position de type Point. Donc Body ne devrait probablement pas étendre Point. Si vous vous débarrasser de l'héritage (de mise en œuvre), alors vous débarrasser de beaucoup de problèmes. Cela et l'utilisation private (non protected!) Et final généreusement.

  

Je suis vite rendu compte que faire cela va créer deux variables dans la classe du corps appelé x et deux autres variables dans le corps appelé y. Comment est-ce possible, et pourquoi diable ne Java permet même pas?

En fait non, vous n'êtes pas en train de créer deux variables avec le même nom, évidemment un compilateur ne doit pas et ne permettrait pas à ce sujet.

Qu'est-ce que vous sont faire est shadowing les variables existantes définies comme x et y, ce qui signifie que Body.x et Body.y sont essentiellement chevauchent les noms des Point.x et Point.y, ce qui rend la Ces deux derniers variables totalement inaccessible de la classe du corps ( lien vers la définition spécification du langage Java de "shadowing" ).

shadowing Nom perçoit généralement comme une mauvaise pratique et une cause de bugs, et si vous mettez en place les avertissements du compilateur javac, le compilateur docilement vous avertir à ce sujet.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top