2011-05-25 81 views
-1

使用該類實例使用靜態方法時會發生什麼? 構建級別和運行時間。Java - 使用該類實例引用靜態方法

在此先感謝。

更新: 有兩個類,第一個類有一個方法,第二個類使用該方法,一段時間後該方法變爲靜態。在運行時,我得到IncompatibleClassChangeError。

+1

什麼類的實例這是根本不需要的對象? – trojanfoe 2011-05-25 06:45:42

+0

請詳細說明你的意思。很難理解你在做什麼。也許一些代碼示例會幫助你描述問題? – 2011-05-25 06:47:38

回答

4

如果您從類實例中調用靜態方法,它與以標準靜態方式(即從類名稱)調用它相同。編譯器足夠聰明以知道進行靜態調用。

+1

此外,編譯器只是在編譯時將所有對靜態方法的調用替換爲MyClass.method調用。 – 2011-05-25 06:50:53

+0

因此編譯第二個類(在那裏使用靜態方法)會再次運行?我得到了IncompatibleClassChangeError,爲什麼? – Vaandu 2011-05-25 06:56:04

+1

@Vladimir - 不發生替換。這正是它的意思。 – 2011-05-25 06:56:28

0

如果你的意思是這樣

class Foo { 
    static void bar() { ... } 
} 

public class Baz { 
    public static void main(String... argv) { 
    new Foo().bar(); // Use static method here via instance 
    } 
} 

那麼實例只是完全忽略。

如果你通過reflection來做,那麼它也被忽略。

如果底層方法是靜態的,那麼指定的obj參數將被忽略。它可能爲空。

0

考慮這種情況......

Class XYZ{ 

public static void functionTest(){ 
// Your code 
} 

public static void main(String args[]){ 
XYZ x = new XYZ(); 
//Here we can execute the method functionTest() in 2 ways. 
x.functionTest(); 
XYZ.functionTest(); 
} 
} 

每次上課都會有一些所謂,這意味着所有的靜態方法和靜態變量得到RAM分配的內存,而不需要創建對象的語境並且我們把這個記憶稱爲一個類的上下文。

而一個引用(x)包含兩個部分,一個是對象(實例)的實際地址,另一個是類的上下文地址。

當我們在上面的場景中調用x.function()時,首先它總是搜索類的上下文,如果它發現它會執行它的方法,如果沒有找到它,它將執行它的實例類。

因此,無論您嘗試執行靜態方法,它總是從類的上下文中執行,而不是從類的實例中執行。

這就是爲什麼一個類的靜態成員可以同時調用的原因。

,並通過從實例調用該方法,我們不需要創建(內存分配不必要)

相關問題