2016-04-10 9 views
-1

//答えは2つの理由がわかりません。メソッドがオーバーライドされている場合、オブジェクト/クラスインスタンス //メソッドは呼び出されません。基本的になぜSoccerPlayerの代わりにPersonクラスのcompareToを呼び出すのですか?なぜ答えは2ですか?事前に感謝compareToによって混乱しています

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

次のコードの結果はどうなりますか? //なぜ2?

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

a。 Person:other.nameにアクセスできないクラスの構文エラー

b。 SoccerPlayerクラスの構文エラー:compareToが再定義されました

c。 ClassCaseException on Line ***

d。エラーなしでコンパイル、表示1

e。エラーなしでコンパイルして表示する2

+0

これらの回答はどちらも生の種類を使用するため、間違っています。 –

答えて

3

ここではオーバーライドはありません。 1つのcompareToメソッドは引数としてObjectをとり、もう1つはSoccerPlayerをとります。

オーバーロードしていますが、オーバーライドしていません。同じ名前の2つのメソッドですが、同じシグネチャはありません。

変数players[0]の宣言された型はPersonなので、この変数について知られているすべてのコンパイラは、それがPersonであり、単一のcompareToメソッドがObjectを引数として取ります。そのメソッドは呼び出されるメソッドです。

このコードは、Java 4を使用していて10年以上前にはうまくいき、ジェネリックは存在しなかったことに注意してください。今日、生の型を使用することは本当に悪い習慣です。人はであり、Comparableではありません。

また、equals()の実装も間違っていることに注意してください。引数として渡されたオブジェクトがPersonでない場合は、ClassCastExceptionをスローするのではなく、falseを返す必要があります。

+0

すぐにお返事ありがとうございます。 – user6183277

関連する問題