[英]What does it mean to @override the method of a super class?
假设我有一个名为mymethod()
的方法
并且此方法会覆盖超类方法的方法。
覆盖方法意味着什么?
这是否意味着mymethod()
忽略了超类方法中的所有内容,或者这意味着mymethod()
还包含超类方法中的所有内容?
覆盖方法时,我是否只能覆盖相同名称的方法,或者我可以覆盖任何名称的方法?
谢谢。
一个例子:
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
的saySomething
版本,因为你通过在Child
中提供该函数的新版saySomething
覆盖父版本。
@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
接受了一个参数,但是父版本的版本没有参数,所以你是@Override
-ing不在父版本中的东西。
saySomething
的Child
版本不会调用Base
版本,你必须自己使用super.method()
。
例如:
public class Child extends Base {
@Override
public void saySomething() {
super.saySomething();
System.out.println("I'm also a child");
}
}
如果你运行main
并使用了这个Child
类,它会打印出I'm a base
而且I'm also a child
。
覆盖意味着当您在对象上调用方法时,将调用对象的方法而不是超类。 @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 */
}
}
如果继承类具有与父类相同名称的覆盖方法,则将调用它而不是父类中的方法。 这仅在名称相同时才有效,当然如果方法的签名与您对方法的调用匹配。
覆盖方法意味着什么?
它意味着您使用自己的定义替换方法的超类定义。
这是否意味着mymethod()会忽略超类方法中的所有内容? 或者这意味着mymethod()还包括超类方法中的所有内容?
您可以选择是否在定义中包含超类定义。 要包含它,您需要在mymethod()
调用super.mymethod()
mymethod()
。
覆盖方法时,我是否只能覆盖同名方法,或者我可以覆盖任何名称的方法?
要覆盖方法,必须在子类中提供具有相同签名的方法(这意味着相同的名称,参数和返回类型)。
作为旁注,问题中的@Override
注释实际上并不会导致您的方法覆盖另一个方法。 如果使用它注释的方法没有与超类(或1.6中的接口)的公共或受保护方法匹配的签名,则会导致编译时错误。
我曾经让一个学生来问我为什么他的代码不起作用。 他花了几天时间想知道为什么他可以把东西放进一个收藏品但却找不到它。 他的代码类似于:
public int hashcode()
代替:
public int hashCode()
所以hashCode方法永远不会被调用。
将@Overrides添加到方法可以清楚地表明您正在覆盖该方法并确保您确实覆盖了一个方法。
当覆盖超类的方法时,在对象上调用该方法会调用其方法而不是超类的方法。
您可以使用super.methodName()
调用超类的方法(尽管已经覆盖了它super.methodName()
。 这种情况的一个常见原因是,重写方法会重新实现超类方法并添加特定于扩展类的其他代码( public void methodName() { super.methodName(); /* more code */ }
)。
@Override
注释允许您在编译时引发警告,如果该方法实际上没有覆盖任何内容。 没有必要,但是这些警告对你来说是一个打击,你可能在扩展类中有签名错误,忘记在超类中实现该方法,或者其他一些愚蠢的错误。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.