【问题标题】:child class object in unable to run overridden method instead parent class method is being run both times子类对象无法运行被覆盖的方法,而是两次运行父类方法
【发布时间】:2022-01-11 00:49:02
【问题描述】:

编程新手...只是试图理解方法覆盖。 在下面的代码中,来自子类的对象覆盖了父类方法,但仍然使用子类对象我无法运行被覆盖的方法 (m())。 我设置了不同的返回类型——父类中的浮点数和子类中的双精度,如果特定方法没有被覆盖,那么子类也从接口 u 实现相同的方法并且仍然没有运行被覆盖的方法..

class Parent {
public float m(float m){ 
    System.out.println(" parent class with float return");
    return m;
}}
class Child extends Parent implements u {
    @Override
    public double m(double y) { /*method name same - Parent class & interface
different return type */
        System.out.println(" child class with double");
        return y;
    }
    public static void main(String[] args) {
        Child child = new Child();
       child.m(10);/*child object running parent method*/
       Parent g = new Child();
     g.m(10);
    }
}
interface u  {double m(double y);}

【问题讨论】:

  • 方法名和参数列表形成一个唯一标识符。所以m(float) 不同于m(double)。 Java 还采用10 并自动应用对话,在这种情况下支持float 而不是double。您可以使用child.m(10d); 转换值,这将导致调用Childs m 方法
  • 谢谢,我现在明白了..它就像最高的是 int-long-float-double..
  • 谢谢,我现在明白了..它就像最高的是 int-long-float-double...你能推荐一些好书来理解 Java 编译器 JVM 规则
  • 你可以试试看java jvm specifications

标签: java methods interface overriding


【解决方案1】:

您正试图覆盖一个名为 m 的方法,该方法返回父类中不存在的 double,父类有一个方法 m,其返回类型为 float,这些是不同的。基本上,当前的 @Override 实际上并没有覆盖任何东西,因为父级中不存在具有该名称和返回类型的方法。

您履行了接口契约,因为存在一个返回双精度值的方法 m

您得到相同输出的原因是因为您正在调用Parentm 函数,因为您传入的参数类型(10 被确定为浮点数)。相反,如果您使用双精度(即 10d)调用函数,则将调用 Child classes m 方法。

将你的 main 方法更改为以下内容,它现在将调用父方法和子方法:

    public static void main(String[] args) {
        Child child = new Child();
        child.m(10.0);/*child object running parent method*/
        Parent g = new Child();
        g.m(10);
    }

【讨论】:

  • niggle 我会使用10d 而不是10.0,因为它“通常”更清楚你的意图,只是说?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-11-18
  • 2011-04-17
  • 1970-01-01
相关资源
最近更新 更多