比较困惑的回答

时间:2016-04-10 06:43:35

标签: java inheritance compareto

//答案是2,不知道为什么。它是否不调用对象/类实例 //方法,如果方法被覆盖。基本上为什么在Person类中调用compareTo而不是SoccerPlayer,为什么答案是2 ????提前致谢

ampl: model waste.mod;
ampl: data waste.dat;
ampl: solve;
MINOS 5.51: ignoring integrality of 20 variables
MINOS 5.51: optimal solution found.
23 iterations, objective 0

以下代码的结果是什么? //为什么2 ???

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

一个。类Person中的语法错误:无法访问other.name

湾SoccerPlayer类中的语法错误:compareTo被重新定义

℃。第***行的ClassCaseException

d。编译没有错误,显示1

即编译没有错误,显示2

1 个答案:

答案 0 :(得分:3)

这里没有压倒一切。一个compareTo方法将Object作为参数,另一个采用SoccerPlayer

那是超载,而不是压倒一切。两个名称相同但方法不同的方法。

由于变量players[0]的声明类型是Person,所有编译器都知道这个变量是一个Person,只有一个compareTo方法将Object作为参数。所以这个方法就是被调用的方法。

请注意,这段代码可能会比10年前更好,当时我们使用Java 4,并且不存在泛型。如今,使用原始类型实际上是不好的做法。人员应该实施Comparable<Person>,而不是Comparable

另请注意,equals()实现也是错误的。如果作为参数传递的对象不是Person,它应该返回false而不是抛出ClassCastException。