@override超类的方法意味着什么?

时间:2011-10-04 22:57:26

标签: java

假设我有一个名为mymethod()

的方法

并且此方法会覆盖超类方法的方法。

覆盖方法意味着什么?

这是否意味着mymethod()忽略了超类方法中的所有内容,或者这意味着mymethod()还包含超类方法中的所有内容?

覆盖方法时,我是否只能覆盖相同名称的方法,或者我可以覆盖任何名称的方法?

感谢。

6 个答案:

答案 0 :(得分:5)

一个例子:

public class Base {
    public void saySomething() {
        System.out.println("Hi, I'm a base class");
    }
}

public class Child extends Base {
    @Override
    public void saySomething() {
        System.out.println("Hi, I'm a child class");
    }
}

现在假设我们在某个地方有main功能......

public static void main(String [] args) {
    Base obj = new Child();
    obj.saySomething();
}

运行时,它会调用Child的{​​{1}}版本,因为您通过在saySomething中提供新版本的功能来覆盖父版本。

Child注释允许其他开发人员(以及您忘记时)知道此方法覆盖基类/接口中的某些内容,并且如果您不是,它还允许编译器对您大喊大叫实际上覆盖基类中的任何内容。例如,如果函数的参数数量错误,编译器会给出错误,指出@Override不正确。

例如:

@Override

编译器会对你大吼大叫,因为这个版本的public class Child extends Base { @Override public void saySomething(int x) { System.out.println("I'm a child and x is: " + x); } } 接受了一个参数,但是父版本没有参数,所以你saySomething - 不是父母的东西


超级

@OverrideChild版不会调用saySomething版本,您必须自己使用Base

例如:

super.method()

如果您运行了public class Child extends Base { @Override public void saySomething() { super.saySomething(); System.out.println("I'm also a child"); } } 并使用了此main课程,则会打印出ChildI'm a base

答案 1 :(得分:4)

覆盖意味着当您在对象上调用方法时,将调用对象的方法而不是超类。 @Override注释是用来确保覆盖超类的正确方法的东西。如果您注释超类中不存在的方法,Java编译器将给您一个错误。这样您就可以确保覆盖正确的方法。这在以下情况下特别有用:

public class MyClass {

    ...

    public boolean equals(MyClass myClass) {
       ...
    }
}

上面的代码中存在逻辑错误。您实际上没有覆盖Object类的equals方法。如果添加@Override注释:

public class MyClass {

    ...

    @Override
    public boolean equals(MyClass myClass) {
       ...
    }
}

Java编译器现在会抱怨,因为父类中没有相应的方法。然后,您将知道正确的解决方案是:

public class MyClass {

    ...

    @Override
    public boolean equals(Object o) {
       ...
    }
}

要调用父类的方法,可以调用super.overriddenMethod(),其中overriddenMethod是您已覆盖的方法的名称。因此,除了父类已经执行的操作之外,您还可以执行以下操作:

public class MyClass {

    ...

    @Override
    public void overriddenMethod() {
        super.overriddenMethod();

        /* whatever additional stuff you want to do */
    }
}

答案 2 :(得分:1)

如果继承类具有与父类同名的覆盖方法,则将调用它而不是父类中的方法。这仅在名称相同时才有效,当然,如果方法的签名与您对方法的调用相匹配,也是如此。

答案 3 :(得分:1)

  

覆盖方法意味着什么?

这意味着您用自己的定义替换方法的超类定义。

  

这是否意味着mymethod()会忽略超类方法中的所有内容?   或者这意味着mymethod()还包括超类方法中的所有内容?

您可以选择是否在定义中包含超类定义。要将其包括在内,您需要在super.mymethod()内致电mymethod()

  

并且在覆盖方法时,我是否只能覆盖相同名称的方法,或者我可以覆盖任何名称的方法?

要覆盖方法,必须在子类中提供具有相同签名的方法(这意味着相同的名称,参数和返回类型)。

作为旁注,问题中的@Override注释实际上并不会导致您的方法覆盖其他方法。如果使用它注释的方法没有与超类(或1.6中的接口)的公共或受保护方法匹配的签名,则会导致编译时错误。

答案 4 :(得分:0)

我曾经让一个学生来问我为什么他的代码不起作用。他花了几天时间想知道为什么他可以把东西放进一个收藏品但却找不到它。他的代码类似于:

public int hashcode()

而不是:

public int hashCode()

所以hashCode方法永远不会被调用。

将@Overrides添加到某个方法会清楚表明您正在覆盖该方法并确保您确实覆盖了某个方法。

答案 5 :(得分:0)

当覆盖超类的方法时,在对象上调用该方法会调用其方法而不是超类的方法。

您可以使用super.methodName()调用超类的方法(尽管已覆盖它)。这种情况的一个常见原因是,重写方法会重新实现超类方法并添加特定于扩展类(public void methodName() { super.methodName(); /* more code */ })的其他代码。

@Override注释允许您在编译时引发警告,如果该方法实际上没有覆盖任何内容。没有必要,但是这些警告对你来说是一个打击,你可能在扩展类中有签名错误,忘记在超类中实现该方法,或者其他一些愚蠢的错误。