如何在Java中编写覆盖方法

时间:2013-03-11 21:55:02

标签: java override

这是家庭作业的一部分。

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

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

5 个答案:

答案 0 :(得分:3)

好的,从我所看到的,你有2个主要问题。

  1. 覆盖方法意味着什么?
  2. 如何覆盖方法?
  3. 让我们想一个新的课程,这样我就可以避免为你做功课。

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

    • 名字
    • 姓氏
    • GPA

    它可能看起来像这样。

    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类。

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

    public class CollegeStudent extends Student{
    
        String studentId;
    
    }
    

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

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

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

    因此,我们假设您不希望返回" Ritchie,Dennis",而是希望getIdentity()返回" studentId"对那个大学生。然后,您可以覆盖 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"。可能不是,但重点是你现在可以自由决定如何编码方法。

    希望这有帮助。

答案 1 :(得分:2)

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

例如,RomanNumeral 扩展 Object,因此继承后者的toString()方法。这意味着您可以在任何toString()个实例上调用RomanNumeral,并调用Object.toString()方法。

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

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

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内定义,就像任何其他方法一样。

答案 2 :(得分:0)

来自documentation
具有相同签名(名称,加上其参数的数量和类型)的子类中的实例方法以及作为超类中的实例方法的返回类型将覆盖超类的方法。

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

覆盖方法时,您可能希望使用@Override注释来指示编译器您要覆盖超类中的方法。

答案 3 :(得分:0)

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

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

在方法中添加@Override注释,将其标记为故意更改,然后让编译器检查签名。

答案 4 :(得分: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)*/ 
}