使用該類實例使用靜態方法時會發生什麼? 構建級別和運行時間。Java - 使用該類實例引用靜態方法
在此先感謝。
更新: 有兩個類,第一個類有一個方法,第二個類使用該方法,一段時間後該方法變爲靜態。在運行時,我得到IncompatibleClassChangeError。
使用該類實例使用靜態方法時會發生什麼? 構建級別和運行時間。Java - 使用該類實例引用靜態方法
在此先感謝。
更新: 有兩個類,第一個類有一個方法,第二個類使用該方法,一段時間後該方法變爲靜態。在運行時,我得到IncompatibleClassChangeError。
如果您從類實例中調用靜態方法,它與以標準靜態方式(即從類名稱)調用它相同。編譯器足夠聰明以知道進行靜態調用。
此外,編譯器只是在編譯時將所有對靜態方法的調用替換爲MyClass.method調用。 – 2011-05-25 06:50:53
因此編譯第二個類(在那裏使用靜態方法)會再次運行?我得到了IncompatibleClassChangeError,爲什麼? – Vaandu 2011-05-25 06:56:04
@Vladimir - 不發生替換。這正是它的意思。 – 2011-05-25 06:56:28
如果你的意思是這樣
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參數將被忽略。它可能爲空。
考慮這種情況......
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()時,首先它總是搜索類的上下文,如果它發現它會執行它的方法,如果沒有找到它,它將執行它的實例類。
因此,無論您嘗試執行靜態方法,它總是從類的上下文中執行,而不是從類的實例中執行。
這就是爲什麼一個類的靜態成員可以同時調用的原因。
,並通過從實例調用該方法,我們不需要創建(內存分配不必要)
什麼類的實例這是根本不需要的對象? – trojanfoe 2011-05-25 06:45:42
請詳細說明你的意思。很難理解你在做什麼。也許一些代碼示例會幫助你描述問題? – 2011-05-25 06:47:38