0

这是家庭作业的一部分。

我正在尝试创建一个具有多种方法的class名称。RomanNumeral第一种方法,RomanNumeral检查字符串rn是否为罗马数字。第二种方法将罗马数字转换为十进制值。我的问题在于其余的方法。我被要求为.equals(),.compareTo()toString(). 我的问题是我将如何开始这样做?覆盖是什么意思?我应该看看他们的所作所为并效仿吗?如果我是,在哪里可以查看定义.compareTo()or的方法toString()

如果有帮助,我可以发布我当前的代码。

4

5 回答 5

3

好的,据我所知,您在这里有两个主要问题。

  1. 重写方法是什么意思?
  2. 如何覆盖方法?

让我们想一个新的班级,这样我就可以避免为你做作业。

我们有一个名为 Student 的类,它存储 3 个字符串。

  • 平均绩点

它可能看起来像这样。

public class Student {
    String firstName;
    String lastName;
    String gpa

    public Student(String firstName, String lastName, String gpa){
        this.firstName = firstName;
        this.lastName = lastName;
        this.gpa = gpa;
    }

    // Perhaps some methods here

    public String getIdentity(){
        return this.lastName + ", " + this.firstName;
    }
}

您喜欢 Student 课程,但您认为如果您也可以跟踪 College studentId 会更好。一种解决方案是扩展 Student 类。

通过扩展类,我们可以访问 Student 拥有的所有方法(和构造函数),并且可以添加一些我们自己的方法。因此,让我们调用我们的新类 CollegeStudent,并为 studentId 添加一个字符串。

public class CollegeStudent extends Student{

    String studentId;

}

现在,无需额外工作,我就可以创建一个 CollegeStudent,并获得它的身份。

// Code
CollegeStudent myCollegeStudent = new CollegeStudent("Dennis", "Ritchie", "2.2");
String identity = myCollegeStudent.getIdentity();
// Code

好的,足够的设置。让我们回答你的问题。

因此,让我们假设您宁愿使用 getIdentity() 来返回该大学生的“studentId”,而不是返回“Ritchie, Dennis”。然后,您可以覆盖getIdentity 方法。

通过覆盖该方法,您将重新编写 getIdentity() 以便它返回 studentId。CollegeStudent 类看起来像这样。

public class CollegeStudent extends Student{

    String studentId;

    @Override
    public String getIdentity(){
        return this.studentId;
    }
}

要覆盖一个方法,你必须返回相同类型的对象(在我们的例子中是String),并且你必须接受相同的参数(我们的例子没有接受任何参数)

您还可以覆盖构造函数。

那么这如何适用于你的任务呢?.equals()、.compareTo() 和 .toString() 已经定义,因为您将要扩展的类(例如 Object)。但是,您将需要重新定义或覆盖这些方法,以便它们对您的类有用。也许的 toString() 实现将返回单词“four”而不是“IV”。可能不会,但关键是您现在可以自由决定应该如何编码该方法。

希望这可以帮助。

于 2013-03-11T23:09:19.307 回答
2

当一个类扩展另一个类时,它会继承其所有非私有实例成员。

例如RomanNumeral extends Object,所以它继承了后者的toString()方法。这意味着您可以调用toString()任何RomanNumeral实例,并且它将调用该Object.toString()方法。

但是,RomanNumeral可以选择通过提供自己的定义来覆盖此方法,这将取代它继承的定义。然后,当您调用实例时,它将调用您定义的方法。(即使您通过引用引用实例,这也有效。)toString()RomanNumeralRomanNumeralObject

所以,你被要求充实这个标准:

public class RomanNumeral {

    // ... your other methods ...

    @Override       // this line is optional
    public String toString() {
        // TODO define this method
    }

    @Override       // this line is optional
    public boolean equals(Object o) { // note: 'Object', *not* 'RomanNumeral'!
        // TODO define this method
    }

    @Override       // this line is optional
    public int hashCode() {
        // TODO define this method
    }

}

请注意,尽管您似乎被告知了什么,但没有“覆盖文件”之类的东西。上面的方法是在内部定义的RomanNumeral.java,就像任何其他方法一样。

于 2013-03-11T22:02:37.243 回答
0

来自文档
子类中具有相同签名(名称,加上其参数的编号和类型)和返回类型作为超类中的实例方法的实例方法覆盖超类的方法。

子类重写方法的能力允许类从行为“足够接近”的超类继承,然后根据需要修改行为。覆盖方法与它覆盖的方法具有相同的名称、参数数量和类型以及返回类型。

重写方法时,您可能希望使用@Override指示编译器您打算重写超类中的方法的注释。

于 2013-03-11T22:04:03.060 回答
0

覆盖意味着通过创建方法的新实现来改变实例的行为。每个Java 类都从Object 类继承equals()、hashCode() 和toString()。

尝试在您的类中编写这些方法的新实现,以便 toString() 将 RomanNumber 作为字母返回,equals() 返回如果另一个对象也是 RomanNumber 并且具有相同的值并尊重两个相等对象需要的约定相同的哈希码。

为您的方法添加一个 @Override 注释,将它们标记为故意更改,以便让编译器检查签名。

于 2013-03-11T22:11:05.397 回答
0

您需要做的是重新定义这些方法:

public class RomanNumeral implements Comparable<RomanNumeral>{

@Override
public boolean equals(Object obj) {
// your conditions and return true or false
}

@Override
public String toString() {
return "Show the world my representation";
}

public int compareTo(T o) {
/* your conditions and if returns:
Less than zero -> instance precedes obj in the sort order.
Zero -> instance occurs in the same position in the sort order as obj
Greater than zero -> instance follows obj in the sort order)*/ 
}
于 2013-03-11T22:17:50.297 回答