Java方法访问运行时多态性

时间:2017-12-27 17:40:18

标签: java oop polymorphism dynamic-dispatch

我有以下java代码。

class A {

        public void method1() {
            System.out.println("A 1");
            method2();
        }

        public void method2() {
            System.out.println("A 2");
        }

    }

    class B extends A {
        @Override
        public void method2() {
            System.out.println("B 2");
        }
    }

    public class Tester {
        public static void main(String[] args) {
            A a = new B();
            a.method1();
        }
    }

打印

    A 1
    B 2
  • 调用a.method1()时运行时到底发生了什么?
  • 如何从父级调用派生方法?
  • 是否正在查看对象和方法名称字符串并进行调用 运行期间的方法?
  • 默认情况下是调用this.method2()吗?

5 个答案:

答案 0 :(得分:3)

由于方法method1(...)从未被覆盖,因此B继承了A method1(),并且它被调用,好像它是在B中定义的那样。

自从method1()调用method2()时,调用B中定义的重写方法method2(),当使用B构造函数创建实例时。

如果使用A构造函数创建另一个实例,则不会在B中定义被覆盖的method2(...),但会获得在A中定义的原始method2(...)

答案 1 :(得分:0)

  

调用a.method1()时运行时到底发生了什么?

A类的方法1()被称为。

  

如何从父级调用派生方法?

由于你已经在类B中使用了方法method2,这将是将在运行时调用的方法。

  

是否在查看对象和方法名称字符串并在运行时调用该方法?

不要在这里混淆。当你写

 A a = new B();

如果它们被淘汰,则会调用来自B类的方法,否则将调用来自A的方法。

  

默认是调用this.method2()吗?

同样,它不是默认的。如果你从它那里得到它,那么它就会从B中调出来。如果你不是从它那里调来的,那就是从A中调用它。

答案 2 :(得分:0)

因为您的对象实际上是继承自B的{​​{1}}类型。在你的A课程中,你重写了方法2,这就是它调用B的原因

B.method2()

要从 A a = new B(); 致电method2,请使用:

A

答案 3 :(得分:0)

当初始化类型B的对象时,它是B类的一个实例,即使它被隐式地强制转换为类型A的对象。

因此,当您调用a.method1()时,因为{B}中未定义method1(),它会调用基类中定义的方法。然后反过来调用method2()时,它在类B中定义,因为对象是类型B,所以调用类B中的方法。

答案 4 :(得分:0)

您已创建了Object类的Object和类型为Reference的Object。 引用的类型为Parent(向下转换)

当您在引用上调用任何方法时,将调用类型引用的方法。但是如果该方法在引用类型中不可用,则将从Parent(继承)调用它。

在您的示例中,编译器检查对象A中的method1并在那里找到它。 第二当调用method2时,从当前的Object(对象B而不是参考A)调用它。

注意,因为当从A的引用中调用它时,方法2被覆盖,它将从对象A(父级)调用方法,如果从引用B调用它,它将从对象B(子级)调用。

这里要记住的关键点是Reference和Object的区别。它们都是不同的实体。

*如果从抽象类调用具体方法调用相同类的抽象方法,则会发生同样的事情。将调用子类的实现方法。