Avoir 2 variables avec le même nom dans une classe qui étend une autre classe en Java
Qui suit est 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 me suis vite rendu compte que ceci vous permettra de créer deux variables à l'intérieur du Corps de classe appelé x et deux autres variables dans le Corps appelé y. Comment est-ce même possible, et pourquoi sur la terre, n'est Java, même le permet-il?
Je suppose que c'est le bon code de classe Corps:
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
source d'informationauteur Martin Andersson
Vous devez vous connecter pour publier un commentaire.
Dans un sens, vous personnalisez les champs de la super-classe. Mais il est beaucoup plus facile de faire accidentellement, car il n'y a pas de surcharge de champs (vous n'avez qu'une variable d'un nom, le type n'a pas d'importance). Cette fonction est appelée variable "cacher" ou "observation". Donc, vous avez raison, vous vous retrouverez avec deux champs portant le même nom.
Votre deuxième exemple est correct. Ils sont hérités de la super-classe et depuis ils ne sont pas déclarées privées, elles sont visibles à la sous-classe. C'est généralement une mauvaise pratique de se référer directement à une super-classe les champs, et à moins d'une bonne raison, ils devraient déclaré privé. Votre exemple de l'invocation de la super constructeur est la meilleure approche.
Aussi, si vous masquez un champ par un autre du même nom, vous pouvez toujours vous référer à eux comme super.x, super.y contre cette.x, cette.y, vous devriez éviter cette situation, si possible.
Oui, vous aurez deux variables, l'une en masquant les autres. Il est logique d'autoriser, pour deux raisons:
Base
et une classe dérivéeDerived
que l'auteur deBase
a aucune idée à ce sujet. Si l'auteur deBase
de ne jamais être en mesure d'ajouter des champs, juste parce que une classe dérivée pourrait partager les champs? Ou devraitDerived
arrêter la compilation lorsque le changement deBase
n'est pas réellement une incidence sur l'exactitude?En outre à ce que les autres ont dit: Est -
Body
unPoint
? Non,Body
a une position propriété de typePoint
. DoncBody
probablement ne devrait pas s'étendrePoint
. Si vous débarrasser de l'héritage de la mise en œuvre), alors vous débarrasser d'un lot de problèmes. Et à utiliserprivate
(pasprotected
!) etfinal
généreusement.En fait non, vous n'êtes pas la création de deux variables avec le même nom, évidemment un compilateur ne doit pas et ne permettrait pas à cette.
Ce que vous sont faire est l'occultation de l'existant, les variables définies comme
x
ety
ce qui signifie que le Corps.x et le Corps.y sont essentiellement recouvrent les noms pour le Point.x et le Point.y, faire les deux derniers variable complètement inaccessibles à partir du Corps de la classe (lien vers le Langage Java la définition de la Spécification de "shadowing").Nom l'observation est généralement percevoir comme une mauvaise pratique et une cause de bugs, et si vous tournez les avertissements du compilateur javac, le compilateur doit vous avertir à ce sujet.