我正在复习 Java 中的一些重要规则。
我的问题是: 在超类中声明方法 do(double in) ,在子类中声明方法 do(int in) 。 子类中的方法 do(int in) 是否被视为超类方法 do(double in) 的重写方法,因为 int 可以放入 double 中,还是被视为重载方法?
我问这个问题是因为这段代码:
Superclass subclass = new Subclass() subclass.do(10);
此代码将调用超类方法。
我知道在编译时,编译器会将超类中存在的兼容方法放入字节码中,并在超类中找到 do(double in) ,这是一个兼容的方法。
但是为什么当jvm进行方法实现绑定时,它不采用子类中的方法,因为对象是子类?
jvm 是否采用字节码中找到的确切方法签名?
我希望我很清楚,对不起我的英语。
我期待这段代码:
Superclass subclass = new Subclass() subclass.do(10);
调用子类方法 do(int in)。
在java中,integer和double是两种不同的类型。在 Java 中重写方法的唯一方法是具有完全相同的签名:
class Parent() {
public void method(double a); //1
public void method(int a, double b); //2
}
class Child() {
public void method(int a); //Not an override
public void method(String a); //Not an override
@Override
public void method(double a); //Overrides 1
public void method(double a, int b); //Not and override (order is wrong)
@Override
public void method(int a, double b); //Overrides 2
}
方法签名是方法名称、参数类型以及这些类型的顺序(如果有多个参数)的组合。
对于您的问题,我已经定制了您的代码以匹配我的示例。
Parent child = new child();
child.method(10);
编译器只知道对象
child
是类型Parent
。因此它把它当作父母。它不知道 child
实际上是 Child
类型,是 Parent
的子类型。
当您调用
child.method(10)
时,编译器会看到 Parent.method(10)
。由于 10 既可以是整数也可以是双精度数,因此它调用父方法。
我给孩子添加了
method(String a)
。
如果您拨打 child.method("10")
,它会再次看到 Parent.method("10")
。这里的问题是 Parent 没有 method(String a)
所以编译器会抱怨。
调用子方法的唯一方法是将父方法指定为 Child 类型。
Parent child = new child();
(Child) child.method(10);