簡體   English   中英

為什么它被稱為運行時多態?

[英]Why it is called runtime polymorphism?

我正在擴展一個類,但我無法弄清楚為什么JVM只在運行時決定調用哪個方法。 我的意思是當我做A obj=new B(); ,是否會調用B中的方法是不是很明顯? 也許這對編譯器來說並不明顯,但我想知道細節。

代碼如下:

class A
{
    String getName(String name) {
        return "super";
    }
}

class B extends A
{
    @Override
    String getName(String name) {
        return "sub";
    }
}

public class Overload 
{
    public static void main(String args[]) {
        A obj=new B();
        System.out.println(obj.getName(null));
    }     
}

編譯器只能檢查其類型,並且其功能有限。 因此它實際上無法運行並查看程序輸出。 這就是它屬於運行時的原因。

編譯器檢查它的類型,並運行時綁定它的功能。

你知道它有B的引用,因為這里代碼的復雜性很簡單。 如果您的類'C'也從類'A'擴展並且如果初始化obj的責任是與其他類或可能是某些配置,那該怎么辦?

與編譯類型多態性不同,我們以及編譯器可以看到單個語句並決定可以調用哪個方法。

讓我們看看這個場景:

public abstract class A {
    public abstract void sayHello();
}

public class B extends A{
    public void sayHello(){
        System.out.println("B says Hello!");
    }
}

public class C extends A{
    public void sayHello(){
        System.out.println("C says Hello!");
    }
}

public class FactoryA{
    public static A getInstance(String type){
        if("B".equals(type)){
            return new B();
        }
        else if("C".equals(type)){
            return new C();
        }
    }
}

讓我們說現在你要求工廠根據String參數獲取實例,如下所示:

A a = FactoryA.getInstance("B"); // the string can come user-input
a.sayHello();

在這個輸出中將是“B表示Hello!”,因為從Factory的方法獲得的實例是B的實例,它取決於傳遞給它的String參數。

在這種情況下,可能在運行時不知道將調用哪個方法(B的sayHello()或C的sayHello())。 這就是它被稱為運行時多態性的原因。

因為決定是在運行時做出的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM