作者awert ( )
看板java
标题Re: [问题] 为何static method不用物件化便能直接使?
时间Sat Oct 27 01:41:25 2012
※ 引述《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