2012-07-19 63 views
2

我「馬雲對私有方法怎麼能是靜態的,但公衆必須動態綁定。解釋動態綁定和靜態方法

+0

你的問題不明確(AT-至少對我來說),你可以添加更多的細節? – kosa 2012-07-19 17:46:48

+1

修飾符'private','public'和'protected'意味着可見性。他們不得不與綁定無關。你的問題是什麼意思? – Lion 2012-07-19 17:51:14

+0

我同意thinksteep。在發佈這樣的問題時,最好的做法是在每個案例中至少包含一個示例代碼片段(這裏有3個片段,您嘗試做什麼,哪些不起作用,靜態案例和動態案例)。您提供的例子和細節越多,您將收到的質量更好的答案。 – retrohacker 2012-07-19 17:54:00

回答

7

動態綁定意味着哪個代碼運行的決定是在運行時做有點困惑。這是多態的基礎。

公衆,包訪問和保護的方法是動態綁定的。子類可以覆蓋的方法,並提供替代實現。私有方法不能被覆蓋,因此動態綁定不需要他們。

靜態方法不會動態綁定(名稱中的線索) ),因爲它們是在類本身上定義的,而不是每個對象都是唯一的。

+0

+1這是正確的答案。 Dynamism在運行時受到限制,靜態方法隱藏了實現。 – kosa 2012-07-19 18:02:50

+3

你從哪裏得到「包訪問方法不能被覆蓋」?這顯然是錯誤的。 – 2012-07-19 18:31:51

+0

這是一個錯誤。感謝您的更新。 – 2012-07-19 19:50:14

0

靜態方法是類水平的方法以便ü只能通過類名訪問,但方法必須是公共

+0

靜態方法不必是公開的,但如果它們是私有的,它們只能被同一類的其他靜態方法訪問...... – 2012-07-20 04:14:07

0

1.類多態性,子類的對象參考變量作爲一個傳遞參數 與接受參數的方法有關,該參數是 類型的對象參考變量超類Public and Protected and Default members can be dynamically bounded,私人會員不是 不會繼承

2.靜態成員是針對類的,它不受限於對任何單個對象,所以它不是 動態綁定。

0

如果你不需要在private方法中使用this引用,那麼你也可以使它成爲static,它不會有任何區別。方法在任何情況下都不需要動態綁定,因此在實現級別,它與您選擇的實際上無關。儘管如此,當您標記方法static時,它仍然有助於可讀性,因爲它很清楚該方法不依賴於對象的狀態。

3

動態綁定或後期綁定

動態綁定指的是編譯器不能夠解決的呼叫,並且綁定是僅運行時完成的情況。我們試着理解這一點。假設我們有一個名爲SuperClass的類,而另一個名爲​​的類擴展了它。現在可以將SuperClass引用分配給​​類型的對象。如果我們在SuperClass中有一個方法(例如someMethod()),我們在​​中覆蓋該方法,那麼SuperClass引用上該方法的調用只能在運行時解析,因爲編譯器無法確定此引用的對象類型在運行時指向。

... 
SuperClass superClass1 = new SuperClass(); 
SuperClass superClass2 = new SubClass(); 
... 

superClass1.someMethod(); // SuperClass version is called 
superClass2.someMethod(); // SubClass version is called 
.... 

在這裏,我們可以看到,即使兩個對象引用superClass1superClass2SuperClass類型的唯一,但在運行時,它們分別指類型父類和​​的對象。

因此,在編譯時,編譯器無法確定對這些引用的方法someMethod()的調用是否實際引用了該方法的哪個版本 - 超類版本或子類版本。

因此,我們發現Java中的動態綁定只是綁定了方法調用(繼承方法只是因爲它們可以在子類中被重寫,因此編譯器可能不確定調用哪個版本的方法)實際的對象類型而不是對象引用的聲明類型。


靜態綁定或早期綁定

如果編譯器能夠解決在編譯時綁定只有這樣的結合被稱爲靜態綁定或早期綁定。所有實例方法調用總是在運行時解析的,但所有靜態方法調用都是在編譯時本身解析的,因此我們有靜態方法調用的靜態綁定。由於靜態方法是類方法,因此它們可以使用類名本身進行訪問(事實上,它們被封裝爲僅使用其對應的類名稱而不是使用對象引用),因此需要解析對它們的訪問在編譯期間只使用編譯時間類型信息。這就是靜態方法實際上無法被重寫的原因。閱讀更多 - Can you override static methods in Java?

訪問Java中的所有成員變量遵循靜態綁定,因爲Java不支持(實際上,它阻止)成員變量的多態行爲。

[除了這個討論中,不能覆蓋靜態私人和Java中最後方法(如通過上面的鏈接提到)。]