【问题标题】:Java calling subclass method when trying to use parent class method尝试使用父类方法时Java调用子类方法
【发布时间】:2012-09-04 15:29:54
【问题描述】:

如果我有两个班级,A 和 B,

public class A {
    public int test() {
        return 1;
    }
}

public class B extends A{
    public int test() {
        return 2;
    }
}

如果我这样做:A a1 = new B(),那么a1.test() 根据需要返回 2 而不是 1。 这只是 Java 的一个怪癖,还是这种行为有某种原因?

【问题讨论】:

  • 这叫做dynamic binding,你还需要了解static binding。当您尝试覆盖(实际上隐藏)字段而不是方法时,它变得有点棘手。您会在 SO 或 google 上找到很多关于此的问题。

标签: java inheritance


【解决方案1】:

这称为polymorphism。在运行时,将根据a1 的“真实”类型调用正确的方法,在本例中为B

正如维基百科所说:

多态性在工业中的主要用途(面向对象 编程理论)是属于不同对象的能力 响应同名的方法、字段或属性调用的类型, 每个都根据适当的类型特定的行为。这 程序员(和程序)不必知道确切的类型 提前对象,因此确切的行为是在 运行时(这称为后期绑定或动态绑定)。

【讨论】:

    【解决方案2】:

    不,这是正确的(这是由于多态性)。所有方法调用都对对象进行操作,而不是引用类型。

    这里你的对象是B,类型的,所以class B的测试方法会被调用。

    【讨论】:

    • 谢谢,这就是我所困惑的。期待基于引用类型的行为。
    【解决方案3】:

    这是polymorphism,更具体地说是Java 中的overriding。如果要从 B 类调用 A 类的测试方法,则需要使用super 来调用超类方法。例如:

    public class B extends A{
       public int test() {
           return super.test();
    }
    

    【讨论】:

      【解决方案4】:

      这是预期的行为。 B 类的方法test() 覆盖了A 类的方法test()

      【讨论】:

        【解决方案5】:

        对于

        A a1 = new B();
        

        a1 指向 B 的对象,它是运行时的真实类型。因此值是从对象 B 打印出来的。

        【讨论】:

          【解决方案6】:
          A obj = new A();
          obj.test()
          

          将返回 1

          A obj = new B();
          obj.test()
          

          将返回 2

          B obj = new B();
          obj.test()
          

          将返回 2

          正如其他答案所述,这就是多态性的工作原理。

          This 的帖子可能会让事情变得更清楚

          【讨论】:

            【解决方案7】:

            Java使用动态绑定(或后期绑定),所以调用的是B的方法,而不是A。这与静态绑定相反。有一个很好的例子here

            【讨论】:

              【解决方案8】:

              您将对象声明为 A,但您的实例是 B。因此,将调用的方法来自类 B。B 扩展了 A(我们可以说 A 是 B 的父级),如果您将在 B 中注释方法测试并且然后调用这个方法,在这种情况下,调用的方法将从 A 类测试并返回 1。

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 2016-02-14
                • 2017-11-09
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2011-09-04
                • 2012-02-22
                • 1970-01-01
                相关资源
                最近更新 更多