2010-06-13 8 views
0

Veuillez m'expliquer ci-dessous situation Quelle serait la sortie?quelle serait la sortie?

 

interface A{} 
class B implements A{} 
class C extends B{} 
class D extends C{} 
class E extends D{ 
public static void main(String args[]){ 
C c = new C(); 
B b = c; 
A a = (E)c; 
a = (B)c; 
c = (C)(B)c; 
} 
} 
 
+3

beaucoup d'erreurs .. – ultrajohn

Répondre

4

être complètement stricte, ce ne compilera pas parce que la ligne 4 vous tapez Class au lieu de class

Class D extends C{} 

Et plus tard vous définissez deux fois a et c

C c = new C(); // once 
B b = c; 
A a = (E)c; // once a 
A a = (B)c; // twice c 
C c = (C)(B)c; // twice 

Maintenant, en supposant ce étaient fautes de frappe la sortie serait ClassCastException car c ne peut pas être cast à E.

Lorsque vous effectuez un casting est comme vous disiez: « Je suis le programmeur et je sais que c'est ... »____(put your class here) Et le compilateur vous permettra compilez.

Mais si exécution l'instance est pas vraiment un ____ (un E dans ce cas, ce qui est pas) alors il jette ClassCastException.

Le programme n'échouera pas avec A a = (B) c; car c est une instance de C qui est une sous-classe de B.

Vous pouvez dire que, Cest un B.Pour comprendre mieux penser à la déclaration suivante:

class Employee extends Object { 
} 

Chaque Employeeest unObject donc le casting réussira, est en fait tellement clair qu'il réussira que vous ne même pas besoin de mettre le casting opérateur ().

Employee e = new Employee(); 
Object o = (Object) e; // or much better: 
Object o2 = e; // no cast needed when assigning to superclass. 

Mais pas nécessairement un Object est un Employee.

Object o = .... 
Employee e = (Employee) o; // will fail if o was not created as an Employee. 

Voilà pourquoi A a = (E) c; échouent, parce que, la référence c était pas créé comme un E

J'espère que cela aide.

+0

J'ai déjà corrigé mes erreurs –

0

Je pense qu'il n'y a pas de sortie. Parce que vous ne l'avez pas dit où est le point d'entrée.

Si vous avez spécifier la classe principale comme D E, il n'y aurait toujours pas de sortie puisque toutes ces classes étendent une classe vide.

+0

La classe principale est 'E' – OscarRyz

1

ClassCastException à A a = (E) c;

+0

oui mais pourquoi? Pouvez-vous s'il vous plaît m'expliquer cela? –

+1

même si le conteneur "a" est de type "A", la distribution est exécutée, mais elle est illégale car "c" contient un objet de type C: puisque E est une spécialisation de C, c ne peut pas être castée en E. – fede

+0

Parce que le type de l'objet 'c' est C. Il ne peut pas être transtypé en E. –

1

Sans essayer réellement, je vais aller sur une branche et dire que cette ligne entraînera deux erreurs du compilateur:

C c = (C)(B)c; 
  1. Vous déclarer la variable « c » deux fois.
  2. Vous ne pouvez pas lancer de B à C.

Et si vous mettez en fait un double casting comme ça dans un projet réel, alors vous méritez d'obtenir botté le cul.

+0

OK, je vois que vous avez modifié le code de sorte que 1 ne s'applique plus. Et je me suis également trompé sur 2. –

+0

J'ai déjà corrigé l'erreur de déclarer la variable c deux fois. Merci. –

1

L'objet c est créé comme un nouveau C. Puisque C étend B, il n'y a aucun problème pour l'assigner à une variable de type B. Cependant C ne sait rien sur E, donc vous ne pouvez pas lancer ici. Vous ne pouvez le faire qu'avec des super-classes. Puisque A est le niveau supérieur absolu, il est bon d'assigner tous les objets des types que vous avez définis.

Questions connexes