2017-01-14 3 views
-1

, wenn ich rufe s1.dub (7) oder s2.dub (7) nicht funktioniert, aber es mit einer Schnur wie s2.dub („9“) arbeitet und druckt die Zeichenfolge verdoppelt AufrufPolymorphe Misunderstand

Könnte mir jemand sagen warum?

Hier ist der Code

interface Inter { 
    int number(); 
} 
abstract class Abs { 
static int foo = 12; 
    int number() { return 5; } 
    abstract int ace(); 
} 
final class Sub extends Super { 
    Sub(int bar) { foo = bar; } 
    public int number() { return 10; } 
    int ace() { return 13; } 
    int dub(int i) { return 2 * i; } 
} 
public class Super extends Abs implements Inter { 
    public int number() { return 11; } 
    public static void main(String args[]) { 
     Super s1 = new Super(); 
     Super s2 = new Sub(16); 
     //System.out.println(s1.dub(7));  //doesn't work 
     //System.out.println(s2.dub(7));  //doesn't work 
     //System.out.println(s1.dub("7")); //works giving 77 
     //System.out.println(s2.dub("7")); //works giving 77 
    } 
    int twice(int x) { return 2 * x; } 
    public int thrice(int x) { return 3 * x; } 
    int ace() { return 1; } 
    String dub(String s) { return s + s; } 
} 
+0

Ich bin ein bisschen müde, aber ich denke, das sollte nicht mal kompilieren? –

+0

Bearbeitet Nun, überprüfen Sie es erneut! –

+0

s1.dub (7) kompiliert nicht, da Sie einen int-Wert übergeben, während die einzige Dub-Methode im Super-Objekt einen String erwartet. s2.dub (7) kompiliert auch nicht als, während Sie ein Sub-Objekt erstellen, das eine Methode hat, die ein int erwartet, behalten Sie es als Super, das wiederum nur eine Dub-Methode hat, die einen String erwartet . Davon abgesehen, sollten Sie auch verstehen können, warum s1.dub ("7") und s2.dub ("7") kompilieren. –

Antwort

0

Sehr einfach .. Sie Klasse Super-eine Methode definiert:

String dub(String s) { return s + s; } 

in Ihrem Haupt-Methode instanziert Super-:

Super s1 = new Super(); // this has a dub(String) method 

dann Sie versuchen, Um diese Methode (Dub) aufzurufen, wird anstelle einer Zeichenfolge eine Ganzzahl übergeben:

System.out.println(s1.dub(7)); // s1.dub(...) takes a String, not a number 

BEARBEITEN: Dieser Code sollte nicht kompiliert oder ausgeführt werden, da Sie beide Instanzen der Superklasse Super zuweisen (die eine Dub (Int) -Methode nicht definiert).

Nicht sicher, wie Sie Ausnahmen erhalten?

Danke @ Jean-FrançoisSavard - das habe ich total vermisst!

EDIT2: Die ursprüngliche Frage wurde geändert und zeigt nicht mehr an, dass eine Ausnahme ausgelöst wird, was sinnvoll ist, da der Code überhaupt nicht kompiliert werden sollte.

EDIT3: (letzte, aufgrund ursprüngliche Frage Wechsel)

System.out.println(s1.dub(7)); //- this will never work unless you change your class' definition 

System.out.println(s2.dub(7)); //- will work if you also change the following line: 

aus:

Super s2 = new Sub(16); 

zu:

Sub s2 = new Sub(16); 
+1

* "Nimmt einen String, keine Zahl" * Dann sollte es nicht kompiliert werden? OP spricht über eine Ausnahme. Der zweite Teil Ihrer Antwort ist auch falsch –

+0

Sie sind richtig! Es kompiliert nicht auf meinem Compiler - beide Zeilen, an denen Sie eine Zahl übergeben, haben Fehler, wenn ich versuche, sie zu kompilieren. Wie kompilierst du diesen Code? –

+1

Ich schlage vor, Sie löschen die Antwort und setzen die Diskussion in den Kommentaren unter der Frage fort. Auf diese Weise vermeiden Sie Downvotes und helfen anderen, die Frage zu verstehen, da sie eher nach Informationen zu den fraglichen Kommentaren als nach dem Kommentar der Antwort suchen. –