Java — Initialisation de la superclasse des variables dans les sous-classes?
Ok, donc, pour l'exemple, disons que j'ai une classe abstraite appelée "Véhicule". La classe de Véhicule, a, entre autres choses, une variable statique appelé roues, ce qui n'est pas initialisé. Ce que je veux faire est d'avoir d'autres sous-classes s'étendant à partir de la classe de Véhicule, comme "Moto", et le "Camion", et dans ces sous-classes, ont les roues initialisé.
Code:
public abstract class Vehicle {
static int wheels; //number of wheels on the vehicle
}
Mais la ci-dessous ne fonctionne pas:
public class Motorcycle extends Vehicle {
wheels = 2;
}
Est-il un moyen de le faire efficacement?
EDIT:
Merci à toutes les personnes qui ont répondu jusqu'à présent. J'obtiens que des décisions des instances est sans doute une meilleure façon d'y aller que de les mettre tous dans des classes séparées, mais je n'ai pas la partie "statique" de java parfaitement, j'ai donc besoin d'un peu d'aide ici.
Ce que j'essaie de faire de mon programme est de séparer les sprites pour la Moto et le Camion de classes, et je veux qu'ils soient statiques pour ne pas avoir à recharger l'image à chaque fois que je crée une instance d'une Moto ou d'un Camion. Autre que cela, cependant, ils ont des propriétés presque identiques les uns aux autres, c'est pourquoi ils vont tous les deux être s'étendant à partir du Véhicule de la superclasse.
Le seul autre moyen que je peux voir ce qui est fait est simplement en ne déclarant pas les sprite variable à la catégorie de Véhicule, mais à la Moto/Camion classe, comme ci-dessous:
public abstract class Vehicle {
//Other coding
}
public class Motorcycle extends Vehicle {
static BufferedImage sprite = //initialize image
//Other coding
}
public class Truck extends Vehicle {
static BufferedImage sprite = //initialize image
//Other coding
}
Vous pourriez développer votre affirmation qu'il "ne fonctionne pas."
De Jeu De Mots?
OriginalL'auteur user1935527 | 2012-12-28
Vous devez vous connecter pour publier un commentaire.
Si 'roues' est statique, il est seul et il s'appliquera à tous les véhicules en même temps. Donc, tricycle, une moto, un de 18 wheeler truck et une Ford ont tous le même nombre de roues.
Qui n'a pas de sens pour moi. Il serait préférable d'avoir 'roues' être une variable d'instance qui est dans la classe parente, mais chaque sous-classe définit de façon appropriée.
Mais vous pouvez essayer
NOTE: je vais ajouter à ma réponse depuis que vous avez ajouté à votre question.
J'aime bien ton idée d'avoir statique dans chacune des sous-classes. Mais vous devez les rendre privés. Ensuite, mettre une méthode abstraite dans la classe parent (Véhicule) comme
Puis chaque sous-classe doit avoir la même méthode, et il peut renvoyer le privé variable statique.
Faire de la variable statique de sorte que vous n'avez qu'à charger une fois. Rendre privé de sorte que le code en dehors de la classe elle-même ne peut pas tromper avec elle et introduire des bogues. Vous pourriez faire leur "finale", si possible, de sorte que le code dans la classe elle-même ne peut pas être modifiée après le fait et introduire des bogues. (Une "finale" de la variable ne peut pas avoir sa valeur a changé mais le contenu de sa valeur peut changer. Donc "final" n'est-ce pas un merveilleux comme elle pourrait l'être.)
OriginalL'auteur Lee Meador
Ce que vous essayez de faire est fondamentalement vicié. Vous pourrait faire
Motorcycle
initialiserwheels
une fois:... ou à chaque fois qu'une instance a été créée:
Mais il y a juste une variable - pas un seul pour
Motorcycle
, un pourTruck
etc. Si vous avez fait la même chose pour les deuxTruck
etMotorcycle
, alors quel est initialisé dernier permettrait de "gagner".Il n'est pas clair comment vous voulez utilisation ce domaine de toute façon - mais si vous avez juste un seul champ statique, alors que va juste avoir une valeur unique - pas l'un par sous-classe.
OriginalL'auteur Jon Skeet
Membres statiques ne sont définis une fois pour toutes et qui sont communs à toute l'extension de la classe. La modification de la valeur dans l'un d'eux aura une incidence sur toutes les autres.
C'est ce que je crois que vous voulez vraiment atteindre:
OriginalL'auteur João Simões
Je pense qu'il y a beaucoup plus élégante façon de le faire
Ce que je suis sur le point de proposer souffre encore de la limitation que vous avez besoin d'une instance. Je ne vois pas de moyen de contourner cela parce que vous voulez
wheels
d'être exposés dans le cadre de la super-classe, mais la valeur dewheels
dépend de la sous-classe et à l'intérieur deVehicle
il n'y a pas de notion de sous-classe du type sans une instance.À mon avis, roues in ce cas n'est ni statique ou de la non-propriété statique. Il est classe métadonnées. Et la Java de manière à spécifier les métadonnées de la classe est via des annotations.
Ce que vous avez besoin est un utilisateur défini par l'annotation comme ceci:
Vous ensuite annoter Moto comme suit:
Dans la superclasse vous fournir un accesseur qui obtient la valeur de l'annotation de la propriété. Je vous recommande d'utiliser un "paresseux" évaluation des approche de sorte que vous n'utilisez pas la réflexion à chaque fois que vous avez besoin de la valeur.
Notez l'utilisation de
this
pour obtenir l'instance:À mon avis, c'est la solution la plus élégante.
OriginalL'auteur DaBlick
L'original de la déclaration de la classe:
ne fonctionne pas car la variable statique s'en va avec la classe à laquelle il a été déclaré dans. Statique de la classe de variables de créer une mémoire de stockage pour une seule instance de la variable par catégorie et non par la classe de l'objet. Lorsque le compilateur (jvm) voit la variable static dans la classe de Véhicule, il alloue de la mémoire pour cette variable et que la localisation de la mémoire statique (ne change pas). Chaque utilisation ultérieure de la catégorie de Véhicule, si elle est prolongée ou instancié comme un objet pointe vers le même emplacement en mémoire pour la variable statique.
Afin d'utiliser la variable statique dans les classes enfant que vous avez à l'utiliser à l'intérieur d'une méthode. Donc, vous pouvez en essence de ré-écrire votre Moto de la classe comme ceci:
et compiler; toutefois, vous ne pouvez pas obtenir les résultats que vous attendez. Par exemple si vous faites cela dans votre code (en supposant que le Camion classe est déclarée comme la Moto de classe et attribue à 4 roues et il y a une méthode de lecture pour retourner la valeur de roues).
sera d'impression:
Moto a 4 roues.
OriginalL'auteur alaniane
Peut-être que vous souhaitez réfléchir sur les constructeurs que vous utilisez.
La Moto utilise le super constructeur qui sait quoi faire avec le paramètre. Il définit automatiquement les roues à 2.
OriginalL'auteur helsont
Si vous faites une variable statique dans vos objets, il sera le même pour chaque catégorie de Véhicule vous permettra de faire, même quand vous en faire une autre sous-classe pour votre résumé catégorie de Véhicule. Ceci en raison de la "nature" de toute variable statique.
Je pense que vous voulez utiliser une variable non statique, de sorte que pour chaque instance d'une sous-classe de l'abstrait catégorie de Véhicule, vous pouvez déterminer la valeur de roues et qui est effectué comme suit:
et toute sous-classe:
Vous pourriez aussi le faire pour la variable statique, mais alors vous devrez le changer pour chaque instance d'une sous-classe de Véhicule
Espère que je vous ai aidé à
OriginalL'auteur Funonly