Au sujet du casting de la sous-classe de super-classe en JAVA
public class Car {
String color;
public void thisIs(){
System.out.println("Calling method from Car: the color is " + color);
}
public String getColor() {
return color;
}
public void setColor(String color) {
this.color = color;
}
}
public class BMW extends Car {
public void thisIs(){
System.out.println("Calling method from BMW: the color is " + color);
}
public Car toCar(){
Car newCar = new Car();
newCar.setColor(this.color);
return newCar;
}
}
public class AbstractTest {
public static void main(String args[]){
Car aCar = new Car();
aCar.setColor("Red");
aCar.thisIs();
BMW aBMW = new BMW();
aBMW.setColor("Black");
aBMW.thisIs();
//Car aaCar = new Car();
//aaCar = (Car)aBMW;
//aaCar.thisIs();
Car aaCar = aBMW.toCar();
aaCar.thisIs();
}
}
J'attends le résultat:
L'appel de méthode à partir de la Voiture: la couleur est Rouge
Méthode d'appel de BMW: la couleur est le Noir
L'appel de méthode à partir de la Voiture: la couleur est le Noir
Mais, le résultat que j'ai obtenu est:
L'appel de méthode à partir de la Voiture: la couleur est Rouge
Méthode d'appel de BMW: la couleur est le Noir
Méthode d'appel de BMW: la couleur est le Noir
Où je me trompe?
Et comment puis-je utiliser la méthode de la super-classe pour obtenir les données dans une sous-classe de l'objet?
Je peux écrire un toCar()
méthode BMW classe pour ce faire.
Mais, pourquoi casting ne fonctionne pas?
Merci d'avance!
OK! Merci!!!!
Je me suis pourquoi casting ne fonctionne pas.
Donc, j'ai ajouter une méthode dans BMW toCar() pour obtenir le résultat que je veux.
J'aime la façon dont ce tutoriel vous explique: cs.utexas.edu/users/cannata/cs345/Class%20Notes/...
Oui. Le lien explique ce que j'ai mal compris. Je vous remercie.
OriginalL'auteur user1947415 | 2013-01-04
Vous devez vous connecter pour publier un commentaire.
Moulage de l'objet ne change pas la nature de l'objet. C'est encore une BMW objet; casting indique au compilateur de le traiter comme s'il s'agissait d'un objet Voiture.
Tant que nous sommes sur le sujet de l'héritage: il n'est PAS nécessaire de mettre la couleur de la variable ou de l'obtenir/setColor méthodes de la super et la sous-classe. Les mettre dans la voiture de classe signifie qu'ils sont disponibles dans toute la sous-classe; ils sont superflus et un peu déroutant dans la sous-classe. Je voudrais les prendre entièrement.
Si j'ai une sous-classe de l'objet. Est-il un moyen de "parler" à cet objet par le biais de super méthode de la classe? Alors que le sous-classe ne dispose pas d'un toCar() la méthode?
super au lieu de ce
Je ne suis pas positif ce que vous voulez dire par "parler" - une méthode de superclasse est exigible pour toutes les classes d'objets, et exécute le code défini dans la superclasse. Vous pouvez donc appeler setColor() et getColor() sur BMW, et ils se comportent de la même chose que si elle est appelée sur une Voiture d'instance ou d'une instance de toute autre sous-classe de la Voiture (au moins, d'une sous-classe qui n'a pas de redéfinir ces méthodes). Ce comportement est à la racine de OO conception; BMW est un "cas spécial de Voiture", et devrait donc se comporter comme une Voiture, plus tout ce qui est défini pour une BMW.
OriginalL'auteur arcy
La BMW est encore une BMW même si vous l'appelez une voiture.
La distribution ne change pas ce que l'objet est. Il indique au compilateur comment vous avez l'intention de traiter. Vous avez créé une BMW, et c'est toujours un lorsque vous appelez sa
thisIs
méthode.OriginalL'auteur Ben Zotto
C'est à cause du polymorphisme d'exécution. La dernière déclaration est parce que même si vous avez une voiture de référence pointant vers la BMW objet(par casting vous n'êtes pas modifier la nature de l'objet! BMW va encore être une BMW ne pas devenir objet Voiture!), Finalement, son la BMW thisIs() méthode qui sera appelée! C'est savoir que Dynamique De La Méthode D'Expédition
veuillez lire sur la Dynamique de la Méthode d'Expédition! et Pensez à des objets de cette façon: Une super-classe de l'objet est plus de type de données et sous-classe de l'objet est inférieure type de données! par exemple, en termes de primitives, court un bas type de données par rapport à un int qui est plus de type de données. Juste parce que vous en fonte(élargir) un court variable de type int, ne signifie pas que le contenu dans le court modification de la variable!
Je vous remercie pour votre réponse. Mais, je comprends le concept de polymorphisme. Et, de mon incompréhension ici est prépondérante. Je pensais que le résultat de (Voiture)aBMW serait un objet Voiture. Mais, tout comme Ben Zotto et rcook dit. Le casting n'a même pas changer ce que l'objet est.
pas de problème, vous êtes les bienvenus!
OriginalL'auteur codeMan
Eh bien, Vous n'avez pas besoin de
explicitly cast
laBMW object
à un type de Voiture, car unBMW object
est unsubclass of Car and a Car can be of any type
(une BMW ou quoi que ce soit). Ainsi, lorsque vous affectez laBMW object to a car the implicit casting is done
par le compilateur. Dans votre cas, vous êtesexplicitly asking the compiler to cast the BMW object to car type
.Aussi cette conversion implicite ne veut pas dire que la BMW objet perd sa
thisIs()
méthode ou toute autre propriété.OriginalL'auteur me_digvijay
Envisager code suivant:
'c' peut contenir de référence de toutes les sous-classes. Selon la période de référence est tenue par "c", cette méthode sera appelée. Il est aussi appelé polymorphisme d'exécution.
OriginalL'auteur Usman Saleem