Casting ist der Prozess der zwangs machen eine Variable verhalten sich wie ein werfen Variable eines anderen Typs. Wenn eine Klasse eine IS-A- oder Vererbungsbeziehung mit einer anderen Klasse oder Schnittstelle teilt, können ihre Variablen in den jeweils anderen Typ umgewandelt werden.
public class DownCasting
{
public static void main(String args[])
{
animal a = new cat();
cat b = (cat)a;
b.makesound();
a.makesound();
}
}
class animal
{
public void makesound()
{
System.out.println('w');
}
}
class cat extends animal
{
public void makesound()
{
System.out.println("meow");
}
}
In der Zeile animal a = new cat();
Sie eine Variable vom Typ verwenden Animal
Cat
, ein Objekt vom Typ zu beziehen und a.makesound();
werden „miau“ drucken, weil mit Vererbung, binden die Instanzmethoden zur Laufzeit.
Wenn Sie jedoch versuchen cat b = a;
(ohne Casting) zu tun, der Java-Compiler wird versuchen, eine Variable vom Typ zu verwenden Cat
ein Objekt vom Typ Animal
, zu verweisen und das nicht möglich ist (eine Variable eines Unter nicht verwenden kann, -klasse, um Methoden aus einer Super-Klasse zu referenzieren (ausführen), so ist es notwendig, die Variable zu konvertieren, um dem Java-Compiler anzuzeigen, dass es trotz a
eine Variable vom Typ Animal
ist, tatsächlich eine Cat
ist.
Lassen Sie mich Ihnen ein Beispiel geben dies deutlicher zu machen:
Ich habe Ihre zwei Klassen mit einigen Änderungen:
class animal
{
public void makesound()
{
System.out.println('w');
}
void sleep(){
System.out.println("ZZZ");
}
}
class cat extends animal
{
public void makesound()
{
System.out.println("meow");
}
void play(){
System.out.println("I´m playing");
}
}
beide Klassen nun eine Methode, die die andere Klasse nicht.
Jetzt ist es verwenden lassen:
public class DownCasting
{
public static void main(String args[])
{
animal a = new cat();
}
}
Wenn ich a.play();
es mir einen Übersetzungsfehler geben wird, weil Java für die Methode searchs play()
in der Tierklasse und kann es nicht finden ... Warum Java das tut? wie ich schon sagte: „Mit Vererbung binden die Instanzmethoden zur Laufzeit“, also wenn ich diese Methode, die ich die a
Variable zu werfen haben nennen wollen ... ((Cat)a).play();
Aber was passiert, wenn Sie versuchen, zu tun ist es umgekehrt?
Cat c = new Animal(); //This line will never compile...
Also, ich kann es so gegossen, um zu machen, kompiliert:
Cat c = (Cat)new Animal();
c.play();
ABER, in der Laufzeit wird es ein java.lang.ClassCastException
werfen, warum ?, weil Sie nicht von einer Variable verwenden eine Unterklasse zum Referenzieren (Ausführen) von Methoden aus einer Superklasse.
Zusammenfassend ist zu beachten, dass der Typ der Objektreferenzvariablen und der Typ des Objekts, auf das verwiesen wird, unterschiedlich sein können.
Aber es gibt Regeln, wie unterschiedlich diese sein können.
Zu diesem Thema werde ich empfehlen OCA Java SE 7 Programmer I Certification Guide: Prepare for the 1ZO-803 exam Sie speziell das Kapitel 6.
Es sei denn, 'makesound' eine Eigenschaft von' Tier: ein Tier ist, nicht. Wir müssten wirklich mehr Code sehen. – Makoto
Bitte versuchen Sie nicht, Code in einen Kommentar zu schreiben; wie Sie sehen können, ist es völlig unlesbar. [Bearbeiten] Ihre Frage, wenn Sie es verbessern möchten. – azurefrog
@ user7639356: Wenn Sie [bearbeiten], um diesen Teil der Frage zu machen, wird es lesbarer –