[英]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.