2010-06-22 9 views
5

ich habe zwei Klassen in Java als:Classcast

class A { 

int a=10; 

public void sayhello() { 
System.out.println("class A"); 
} 
} 

class B extends A { 

int a=20; 

public void sayhello() { 
System.out.println("class B"); 
} 

} 

public class HelloWorld { 
    public static void main(String[] args) throws IOException { 

B b = (B) new A(); 
    System.out.println(b.a); 
    } 
} 

bei der Kompilierung es nicht Fehler nicht geben, aber zur Laufzeit zeigt es eine Fehlermeldung: Exception in thread "main" java.lang.ClassCastException: A kann nicht Dies geschieht nach B

Antwort

16

gegossen werden, da die Kompilierung- Ausdrucksart von new A()A ist - die ein Verweis auf eine Instanz von B sein könnte, so dass der Guss erlaubt ist.

Zur Ausführungszeit jedoch ist der Verweis nur auf eine Instanz von A - so schlägt die Besetzung fehl. Eine Instanz von nur Aist nicht eine Instanz von B. Die Umwandlung funktioniert nur, wenn sich die Referenz wirklich auf eine Instanz von B oder eine Unterklasse bezieht.

7

B erweitert A und daher kann B wie A umgewandelt werden. Das Gegenteil ist jedoch nicht der Fall. Eine Instanz von A kann nicht als B gecastet werden.

Wenn Sie aus der Javascript-Welt kommen, können Sie erwarten, dass dies funktioniert, aber Java hat nicht "duck typing".

1

Zuerst es wie folgt tun:

A aClass = new B(); 

Jetzt tun Sie Ihr explizites Casting, wird es funktionieren:

B b = (B) aClass; 

, dass explizites Casting der Mittelwert muss implizites Casting müssen. elsewise Explizites Casting ist nicht erlaubt.

0

Sobald Sie das Objekt einer Kindklasse erstellt haben, können Sie es nicht in eine Superklasse schreiben. Schauen Sie einfach in den folgenden Beispielen

Annahmen: Hund ist das Kind Klasse, die von Tier (Oberklasse) erbt

Normale Typecast:

Dog dog = new Dog(); 
Animal animal = (Animal) dog; //works 

Wrong Typecast:

Animal animal = new Animal(); 
Dog dog = (Dog) animal; //Doesn't work throws class cast exception 

Die unten Typecast funktioniert wirklich:

Dog dog = new Dog(); 
Animal animal = (Animal) dog; 
dog = (Dog) animal; //This works 

Ein Compiler die Syntax überprüft er Inhalte während der Laufzeit ist tatsächlich

prüft