2012-06-28 47 views
0

我從http://www.oracle.com/technetwork/java/javase/documentation/codeconventions-137265.html#587閱讀Java代碼約定。爲什麼使用類名而不是對象來訪問Java中的類方法或變量?

因此,他們提到我們應該避免使用對象來訪問類變量或方法,而應該使用類名來代替。

避免使用對象訪問類(靜態)變量或方法。 改爲使用類名稱。例如:

classMethod();    //OK 
AClass.classMethod();  //OK 
anObject.classMethod(); //AVOID! 

是否有條款或性能或別的東西,這個特別的原因?

+0

你能不能給我們的首選方法VS的objcect基於方法的代碼示例? – Miquel

回答

4

通過類變量我假設你的意思是靜態變量。

應避免通過實例變量使用靜態變量/方法,因爲它會讓讀者感到困惑。由於只能使用實例訪問實例變量,因此讀取通過實例調用靜態方法的代碼可能會使讀者誤解發生了什麼。

圖片這種情況下,Thread.sleep,這是一個靜態方法:

Thread.sleep(1000); 

由於該方法是靜態的,我們都是通過類名調用它,它的直觀讀者推斷出效果讓當前線程進入睡眠狀態。

現在,如果我們這樣做:

Thread t = new Thread(...); 
t.sleep(1000); 

現在哪個線程處於睡眠狀態?目前的「顯然」。有人不知道睡眠是如何工作的,可能會認爲子線程以某種方式進入睡眠狀態。

2

我想這取決於你想要做,我對一個總是使用類名來存取權限靜態variable.Being靜態沒有關係不管你做的方式是什麼,但我確實節省一些內存的使用情況。

至於非靜態變量,總是使用對象。

+0

當然因爲你不能從 –

+0

類訪問非變量的沒錯,我知道這聽起來差很多,比我thought.I意味着作爲非靜態,當然可以用objects.Sorry! –

1

我不知道性能,但顯然是另一個developper尋找你的代碼就知道了一見鍾情的靜態變量/方法,如果您使用的類名使用。

我不認爲編譯器會給變量賦予不同的代碼。

1

這是因爲。

1.它告訴變量或方法實際上是靜態的。

2.此外,它檢查該對象是指哪個類。這會產生額外的成本。

3

它不是在的出品字節碼方面有什麼不同,所以表現不是問題。

什麼的問題是使用一個變量來訪問靜態成員看起來好像由變量保持的參考實際上關係到被訪問的內容。但它不!事實上即使anObject其中null,你會不會得到一個NPE,但它只是調用classMethod

所以,原理很簡單:訪問靜態成員時,避免提及信息(在這種情況下,變量名),這實際上不相關的正在進行的訪問。

相關問題