Java

时间:2018-08-17 12:46:56

标签: java dynamic polymorphism

Java中动态多态性的实时示例是什么?

面试中我被问过很多地方 但Dint得到了真正的答案。代码:

class A {
    public void m1() {}
}

class B extends A {
    public void m1() {}
}

class manage {
    A a1 = new A();
    B b1 = new B();
    A a2 = new B();

    //when i will call A's m1 it will call m1 of A
    a1.m1();

    //when i will call B's m1 it will call  m1 of B
    b1.m1();

    //when i will call B's m1
    a2.m1();

}

在上面的代码中,通过查找,我可以说出其对象将被调用,然后为何其运行时多态性

任何人都可以帮助实时纠正运行时/动态多态的示例

3 个答案:

答案 0 :(得分:4)

让我们稍微更改一下代码示例。我们没有提供定义要测试的对象的测试类,而是仅提供一种带有一些参数的方法:

public void testCalls(A a1, A b1, A b2) {
  a1.m1();
...

现在,您还能说会发生什么吗? “嗯,这取决于传递给方法调用的内容?!”

在您的示例中,您知道将要发生的事情,因为您可以轻松推断所有对象的 true 性质。但是,如果您没有该信息怎么办?当您仅提供一个接口,而传入的对象没有出现在源代码中吗?!

因此:重要的是在运行时对象的 true 类型。当然,当您构造一个简单的示例时,您始终会知道该真实类型。但是,在现实世界中重要的事情并不是那么简单。

答案 1 :(得分:1)

"Dynamic polymorphism is the polymorphism existed at run-time"

这意味着Java编译器无法理解在编译时调用哪种方法。只有JVM决定在运行时调用哪种方法。

在您的示例中,编译器不知道a2.m1()的行为。但是,在运行时,JVM将调用在类B中定义的代码。

class A {
    public void m1(){
        System.out.println("Inside A's m1 method");
    }
}

class B extends A {
    // overriding m1()
     public void m1(){
            System.out.println("Inside B's m1 method");
     }
}

class C extends A {
     public void m1(){
            System.out.println("Inside C's m1 method");
     }
}
// Driver class
class Dispatch {
    public static void main(String args[]) {
        // object of type A
        A a = new A();
        a.m1(); // calling m1 of A

        a = new B();
        a.m1(); // calling m1 of B

        a = new C();
        a.m1(); // calling m1 of C

    }
}

结果: Inside A's m1 method Inside B's m1 method Inside C's m1 method

答案 2 :(得分:0)

顾名思义,它是实时运行的。