2011-01-06 38 views
4

我研究過在實例方法的情況下,運行時jvm使用實際的類實例,並且在類方法的情況下編譯器只會查看引用變量的聲明類型而不是實際的類..關於接口引用變量的問題

我研究過這個概念實例方法隱藏..

在我proram我使用的接口引用變量來存儲類的對象,並嘗試訪問類的實例方法使用這個但是會引發錯誤.. 我的程序如下:

interface A 
{ 
    void show(); 
} 
class B implements A 
{ 
    public void show() 
    { 
     System.out.println("Interface Method"); 
    } 
    void info() 
    { 
    System.out.println("IN Info"); 
    } 
} 
class interDemo 
{ 
    public static void main(String args[]) 
    { 
    A a; 
    B b=new B(); 
     a=b; 
     a.show(); 
     a.info(); 
    } 
} 

請幫我瞭解conept ...

回答

7

編譯器告訴你該類型A沒有一個叫info定義的方法。這是事實:編譯器不知道在運行時a的類型實際上是B,它確實有info方法。將a.info()調用實際編譯併發送到字節碼將是不安全的,沒有什麼可以說a將始終是B類型。

這就是所謂的static typing。在Java和其他靜態類型語言中,您需要「轉換」一個變量以強制編譯器將其視爲另一種類型。在這種情況下,您可以編寫((B) a).info()

+0

非常感謝!我的問題就解決了.. – Laawanya 2011-01-08 08:50:39

+0

您可以繼續接受的解決方案,這會是不錯的:)謝謝 – sjr 2011-01-08 19:01:30

1

sjr是正確的。這裏有另一種方式來看看它:

你指定一個A只能show。這意味着當你有一個A參考變量時,這就是你所能做的。

這意味着任何願意show的類都可以實現該接口。需要對象show的客戶端可以使用A而無需知道或關心底層類是否有其他方法。這是面向對象編程提供的抽象的一個關鍵方面。

1

您可能希望在YouTube上看到此lecture。它涵蓋了你的問題,我希望它能幫助你。

簡而言之:a的靜態類型是A.在將b賦值給a之後,a的動態類型爲B.因此,此時靜態類型a是A,動態類型a是B.編譯器不遵循動態類型,它只檢查靜態類型。所以它不會讓任何其他靜態類型允許的。

從類A.因此,在你的例子,如果你使用的是靜態類型A的參考,你只能調用方法

0

不會產生混淆
超級概念============= ========================

2規則知道方法將執行的地方(當使用超類型參考來調用方法時)

注意:檢查「對象創建」/「引用賦值」語句以應用規則

1 RULE:首先檢查要調用的方法。如果靜態/過載/單 --then變得靜態多態性/靜態(編譯器查找引用類型)---因此總是從引用類型執行

2 RULE:檢查方法被調用 - - 如果重寫 --then變得動態多態性(JVM查找對象類型) ---因此總是從對象類型執行(即從右到新的關鍵字)

例如:

super s=new child(); 

s.play(); 

此兩種情況:

:檢查播放()是什麼,即靜態的(靜態/過載/單法)或動態(覆蓋)

第二:如果靜態將執行從超即引用類型導致編譯時多態性

如果動態它將從子即對象類型執行導致動態多態性