假设我有一个名为mymethod()
并且此方法会覆盖超类方法的方法。
覆盖方法意味着什么?
这是否意味着mymethod()
忽略了超类方法中的所有内容,或者这意味着mymethod()
还包含超类方法中的所有内容?
覆盖方法时,我是否只能覆盖相同名称的方法,或者我可以覆盖任何名称的方法?
感谢。
答案 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
- 不是父母的东西
@Override
版Child
版不会调用saySomething
版本,您必须自己使用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
。
答案 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
注释允许您在编译时引发警告,如果该方法实际上没有覆盖任何内容。没有必要,但是这些警告对你来说是一个打击,你可能在扩展类中有签名错误,忘记在超类中实现该方法,或者其他一些愚蠢的错误。