我正在复习Java中的一些重要规则。
我的问题是:在超类中声明一个方法do(double in),在子类中声明一个方法do(int in)。子类中的方法do(int in)被认为是超类方法do(double in)的重写方法,因为int可以放在double中,还是被认为是重载方法?
我问这个问题是因为这段代码:Superclass subclass = new Subclass() subclass.do(10);
这段代码将调用超类方法。
我知道在编译时,编译器会把超类中的兼容方法放入字节码中,因为它在超类中找到了do(双入),这是一个兼容的方法。
但是为什么当jvm执行方法实现绑定时,它不接受子类中的方法,因为对象是一个子类?
jvm是否采用在字节码中找到的确切方法签名?
我希望我说得很清楚,对不起我的英语。
我期待这样的代码:Superclass subclass = new Subclass() subclass.do(10);
调用子类methode do(int in)。
1条答案
按热度按时间gzjq41n41#
在Java中,integer和double是两种不同的类型。在Java中重写方法的唯一方法是使用完全相同的签名:
字符串
方法签名是方法名称、参数类型和这些类型的顺序(如果有多个参数)的组合。
对于你的问题,我已经修改了你的代码来匹配我的例子。
型
编译器只知道对象
child
的类型是Parent
。因此它将其视为父对象。它不知道child
实际上是Child
类型,Parent
的子类型。当你调用
child.method(10)
时,编译器会看到Parent.method(10)
。因为10可以是整数也可以是double,所以它会调用父方法。我给子对象添加了
method(String a)
。如果你调用child.method("10")
,它又看到了Parent.method("10")
。这里的问题是Parent没有method(String a)
,所以编译器会抱怨。使这个调用成为子方法的唯一方法是将父方法指定为Child类型。
型