Re: [問題] 為何static method不用物件化便能直接使?

看板java作者 ( )時間13年前 (2012/10/27 01:41), 編輯推噓0(000)
留言0則, 0人參與, 最新討論串2/2 (看更多)
※ 引述《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
文章代碼(AID): #1GYij7Wo (java)
文章代碼(AID): #1GYij7Wo (java)