2016-04-10 12 views
-1

// Die Antwort ist 2 nicht sicher warum. Ruft es die Objekt-/Klasseninstanz // method nicht auf, wenn die Methode überschrieben wird. Warum ruft compareTo in der Person-Klasse anstelle von SoccerPlayer auf, warum lautet die Antwort 2 ???? Vielen Dank im VorausVerwirrt von der compareTo Antwort

public class Person implements Comparable { 
    private String name; 

    public Person(String name) { this.name = name; } 

    public String getName() { return name; } 

    public boolean equals(Object other) { 
     return other != null && name.equals(((Person) other).name); 
    } 

    public int compareTo(Object other) { 
     return name.compareTo((Person other).name); 
    } 

    public int hashCode() { return name.hashCode(); } 
} 

public class SoccerPlayer extends Person { 
    private int numGoals; 

    public SoccerPlayer(String name, int n) { 
     super(name); 
     numGoals = n; 
    } 

    public int getNumGoals() { return numGoals; } 
    public void score() [ numGoals++; } 

    public int compareTo(SoccerPlayer other) { 
     return getNumGoals() - other.getNumGoals(); 
    } 

    public String toString() { 
     return getName() + "/" + getNumGoals(); 
    } 
} 

Was ist das Ergebnis des folgenden Codes? // warum 2 ??? ein

Person players[] = { new SoccerPlayer("Mia Hamm", 7), new SoccerPlayer("Kristine Lilly", 6) }; 
System.out.println(players[0].compareTo((SoccerPlayer) players[1]));  // Line *** 

. Syntaxfehler in der Klasse Person: other.name ist nicht zugänglich

b. Syntaxfehler in der Klasse SoccerPlayer: compareTo wird neu definiert

c. ClassCaseException on Line ***

d. Kompiliert ohne Fehler, Anzeigen 1

e. Kompiliert ohne Fehler, Anzeigen 2

+0

Beide Antworten sind falsch, da sie rohe Typen verwenden. –

Antwort

3

Hier gibt es kein Überschreiben. Eine compareTo Methode nimmt eine Object als Argument, und die andere nimmt eine SoccerPlayer.

Das ist überladen, nicht überschreiben. Zwei Methoden mit dem gleichen Namen, aber nicht mit der gleichen Signatur.

Da der deklarierte Typ der Variablen players[0] Person ist, sind alle Compiler knowns über diese Variable ist, dass es eine Person ist, mit einem einzigen compareTo Methode ein Objekt als Argument nehmen. Also diese Methode ist diejenige, die aufgerufen wird.

Beachten Sie, dass dieser Code vor etwas mehr als 10 Jahren in Ordnung gewesen wäre, als wir Java 4 verwendet haben und Generika nicht existierten. Heutzutage ist die Verwendung roher Typen wirklich eine schlechte Übung. Die Person sollte Comparable<Person>, nicht Comparable implementieren.

Beachten Sie auch, dass die equals() - Implementierung ebenfalls falsch ist. Es sollte false zurückgeben, statt eine ClassCastException zu werfen, wenn das als Argument übergebene Objekt keine Person ist.

+0

Vielen Dank für schnelle Antwort Ich verstehe! – user6183277