2017-04-18 55 views
-1

動態方法綁定超類引用只能調用被它繼承和覆蓋的子類方法。但是,否則可以實施。超類對象可能引用未繼承的子類成員方法嗎?

abstract class in 
{ 
    abstract void print(); 
} 
class a extends in 
{ 
    String name=this.getClass().getSimpleName(); 
    void show() 
    { 
     System.out.println("class "+name); 
    } 
    void print() 
    { 
     show(); 
    } 
} 
class Main 
{ 
    public static void main(String args[]) 
    { 
     in x; 
     x = new a(); 
     x.print(); 
    } 
} 

這裏,成功打印

另外的getClass()作爲返回子類名稱,而不是超類名的指的是超類對象中主要方法。

+3

父母不知道孩子。一個類的開發者無法知道他們的類將如何被用戶擴展。 – duffymo

+0

所有'in'知道它應該有一個名爲'print()'的方法。該方法的所有實現都發生在'a'內部,'a'完全知道'a'(就其類名和其他方法而言)。 – khelwood

+0

所以你的意思是x.print()等價於新的a()。print()?但是不是x超類的參考? – ZEU5

回答

0

父對象引用僅受它在其類定義中所使用的方法的約束。如果這些方法被子類重寫,並且在運行時,如果父引用引用的實際對象是子類類型,則調用該重寫的方法。如果重寫的方法調用最初不存在於父類中的方法或訪問父類中不存在的變量,則無關緊要。

這就是多態性的全部內容。如果我們有不同的特定繼承層次結構,其中父類不需要知道某些方法的確切實現,並且可以將子類實現爲某種合約類型,則設計意圖就是這樣的,因爲它使程序擴展更容易。

+0

謝謝這是唯一有用的答案。 :-) – ZEU5

0

未來是未知的開發人員編寫今天一類A.java可以在將來永遠無法預測的,任何其他的開發者可能包括在他的類擴展A.java方法的名稱或簽名。而且這樣的類別可能很多,每個類別具有不同的方法。

基類不應該與其子類聯繫在一起。它不必關心子類是如何實現的。

雖然不推薦,但如果您希望調用其中一個子類中定義的方法,您可以通過類型化來做到這一點,如下所示。

public class Parent { 
    public class someMethod(){ 
      if(this instanceof Child1){ 
       ((Child1)this).someAdditionalMethod(); 
      } 
    } 
} 

public class Child1 extends Parent{ 
    public class someAdditionalMethod(){ 

    } 
}