Re: [問題] 為何static method不用物件化便能直接使?
※ 引述《tnsshnews (tnsshnews)》之銘言:
: Dear all,
: public class demo{
: public static String test1;
: public static String getString(){
: return test1;
: }
: }
: static放在變數或是方法之前代表是class level的變數,
你其實已經把答案給講出來了,就是因為它是 class member,因此不需要任何 instance
就已經存在了。如果你要問為什麼的話,那也只能回答因為 Java 的設計者這樣設計的。
轉不過來的話就先記下來吧。
: 但為什麼要使用getString方法時, 只要直接用demo.getString就好呢?
: 雖然是class等級, 但這個class在之前如果都沒有被使用過, 這邊直接呼叫,
: 記憶體空間怎麼會已經配置好空間存放呢?
: 謝謝
沒有被使用過這個講法其實有點問題,因為當你呼叫 Demo.getString() 時,
你就正在用它了,classloader 一旦注意到有 class 尚未初始化過,就會即時讀取它。
這點可以用下面的程式碼來證實 :
這裡有個含有 static initializer 的 class,static initializer 是 class 在初始
時會執行的程式碼。
public class MyClass {
static {
System.out.println("initializing...");
}
public static void print() {
System.out.println("MyClass.print() is called");
}
}
我們在 main method 裡這樣呼叫的話
MyClass myclass;
結果是什麼都不會印出來的
但如果我們直接呼叫 static method :
MyClass.print();
結果會是 :
=> initializing...
=> MyClass.print() is called
因此 Classloader 是需要的當下時才會把 class 給初始化。
不知道這樣子能不能讓你釋懷 ?
更詳細的說明可能要請懂 JVM spec 的人來講...
--
We who cut mere stones must always be envisioning cathedrals.
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 114.35.186.241
討論串 (同標題文章)
本文引述了以下文章的的內容:
完整討論串 (本文為第 2 之 2 篇):