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

问题描述 投票:0回答:1

我正在复习 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 oop jvm polymorphism
1个回答
0
投票

在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);
© www.soinside.com 2019 - 2024. All rights reserved.