2017-03-13 5 views
-2

warum ich wie dieseüber Downcasting und Polymorphie

animal a = new cat(); 
cat b = (cat)a; 
b.makesound(); 
a.makesound(); 

schreiben, aber diese

animal a = new cat(); 
animal b = new cat(); 
a.makesound(); 
b.makesound(); 

sie die gleichen Ausgänge

Dies ist der gesamte Code geben nicht mögen.

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"); 
    } 
} 

so downcasting geben Sie einfach einen zweiten Objektnamen? oder es hat andere Verwendungen?

+2

Es sei denn, 'makesound' eine Eigenschaft von' Tier: ein Tier ist, nicht. Wir müssten wirklich mehr Code sehen. – Makoto

+0

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

+0

@ user7639356: Wenn Sie [bearbeiten], um diesen Teil der Frage zu machen, wird es lesbarer –

Antwort

0

warum ich wie diese

schreiben haben diese Frage, die Sie zuerst wissen müssen, beantworten, was kann Mucks? die Katze oder das Tier?

Sie dies tun:

animal a = new cat(); 
a.makesound(); 

, wenn die Methode makesound in Tier erklärt

wenn nicht, dann müssen Sie

+0

Wenn ich die Methode "makeup" im Tier lösche, würde ich, selbst wenn ich die Besetzung hätte, Ungelöste Kompilierungsprobleme bekommen. – user7639356

+0

@ user7639356: Haben Sie versucht, alle temporären Dateien zu entfernen und neu zu kompilieren? –

+0

Klasse Tier { \t } – user7639356

0

In der zweiten Variante erstellen Sie zwei Katzen.

In der ersten vergeben Sie den zusätzlichen Namen b zu dem bereits vorhandenen Tier a.

so downcasting geben Sie einfach einen zweiten Objektnamen? oder es hat andere Verwendungen?

Vielleicht möchten Sie eine Liste von Tieren haben, z. ein Hund:

class dog extends animal 
{ 
    public void makesound() 
    { 
     System.out.println("woof"); 
    } 
} 

könnte in der gleichen Liste mit Katzen kombiniert werden.

+0

also ist der erste ein Objekt mit zwei Namen? – user7639356

+0

@ user7639356: ja. –

0

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 AnimalCat, 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.

+0

Was kann ich tun, wenn ich die Methode in der Superklasse verwenden möchte, aber in beiden Klassen existiert? – user7639356

+0

Verwenden Sie super.methodInSuperClass – Dazak