2012-02-02 19 views
1

假設您的用戶類有兩種方法,如methodamethodb。我們創建了這個類的兩個實例ab。現在我想更新我的代碼,methoda應該是可見的,只有實例amethodb應該對實例b可見。我沒有得到我們如何在Java中實現這一點。對於同一類別的不同實例的Java方法限制

+0

怎麼樣實例C和D等?我的意思是方法應該是可見的或不是? – 2012-02-02 07:41:37

回答

1

不,方法可見性始終基於類型,而不是單個實例。聽起來也許你應該有兩個小類,一個是methodA,另一個是methodB;您可以創建相應子類的實例。

0

如果ab都是同一類的實例,則不能這樣做。這兩個實例都有相同的方法(即OOP中的行爲)。

1

你可以做這樣的:

public interface InterfaceA { void methodA(); } 

public interface InterfaceB { void methodB(); } 

public class User implements InterfaceA, InterfaceB { 

public void methodA() { System.out.println("method A"); } 

public void methodB() { System.out.println("method B"); } 

} 

//一些別的地方

InterfaceA a = new User(); 
InterfaceB b = new User(); 

現在,a 「看見」 只有methodA()b 「看見」 只有methodB()

我認爲沒有其他辦法可以做到這一點。

+0

這確實是要走的路。使用接口來限制引用的行爲可能是安全設計最重要的設計模式。 – 2012-02-02 07:46:17

0

你需要使用多態性和hage回答你的問題。

瞭解在多態性讀取過程中會發生什麼。

  1. 編譯器查看對象的聲明類型和方法名稱。比方說, 我們稱之爲x.fun(param),並且隱含參數x被聲明爲C類的一個對象

注意,可能有多種方法,都具有相同的名稱,好玩的,但具有不同的 參數類型。例如,可能有一個方法f(int)和一個方法f(String)。 編譯器列舉了類C中所有稱爲fun的方法以及所有在C的超類中稱爲fun的公共/受保護方法fun。現在,編譯器知道調用方法的所有可能候選者。

  1. 接着,編譯器確定的類型被在 方法調用提供的參數。如果在所有被稱爲樂趣的方法中有一種獨特的方法,其參數類型是所提供的參數的最佳匹配,則該方法是 被選擇調用。這個過程被稱爲超載分辨率

  2. 如果方法是私有的,靜態的,最終的或構造函數,那麼編譯器確切地知道調用哪個方法。編譯器然後使用靜態綁定。 否則,如果要調用的方法取決於隱式參數的實際類型,則編譯器使用動態綁定。

  3. 當程序運行,並使用動態綁定來調用一個方法,則虛擬機 必須調用適合於實際類型的 目的是其中x是指該方法的版本。

假設實際類型是D,C的一個子類。如果類D定義了一個方法fun(String),那麼調用該方法。 如果不是,則搜索D的超類,以搜索方法fun(String),等等。每次調用某個方法時執行此搜索將非常耗時。 因此,虛擬機會爲每個類預先計算一個方法表,其中列出了所有方法簽名和要調用的實際方法。當一個方法實際上調用 時,虛擬機只是簡單地進行表查找

相關問題