jvm 在超类中声明方法do(int in),在子类中声明方法do(double in)

kmb7vmvb  于 6个月前  发布在  其他
关注(0)|答案(1)|浏览(115)

我正在复习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)。

gzjq41n4

gzjq41n41#

在Java中,integer和double是两种不同的类型。在Java中重写方法的唯一方法是使用完全相同的签名:

class Parent() {
  public void method(double a); //1
  public void method(int a, double b); //2
}

class Child() extends Parent {
  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可以是整数也可以是double,所以它会调用父方法。
我给子对象添加了method(String a)。如果你调用child.method("10"),它又看到了Parent.method("10")。这里的问题是Parent没有method(String a),所以编译器会抱怨。
使这个调用成为子方法的唯一方法是将父方法指定为Child类型。

Parent child = new child(); 
((Child) child).method(10);

相关问题