[問題] 搞不懂static

作者: wtchen (沒有存在感的人)   2014-12-20 00:34:01
例題如下:
class A {
public static void doSth(){
System.out.println("Doing something in A");
}
}
class B extends A {
public static void doSth(){
System.out.println("Doing something in B");
}
}
class C extends B {
public static void doSth(){
System.out.println("Doing something in C");
}
}
class test {
public static void main(String [] args) {
A.doSth();
B.doSth();
C.doSth();
A aInstance = new B();
B bInstance = new C();
C cInstance = new C();
aInstance.doSth();
bInstance.doSth();
cInstance.doSth();
}
}
執行結果是
Doing something in A
Doing something in B
Doing something in C
Doing something in A
Doing something in B
Doing something in C
前三個我可以理解,後三個我就不懂了,static在這裡是起什麼樣的作用呢?
跪求高手解惑,感謝...
作者: BaiYe (擺耶)   2014-12-20 00:55:00
我不是強者 無法給甚麼想法 但是可以先看看這篇文章#1InXOEIG (java) 或是同系列的幾篇也許看完就懂了~~ 至少我那時候看完後 對static更認識了!
作者: hegemon (hegemon)   2014-12-20 02:50:00
static method是看Class,而不是instance...所以aInstance.doSth()還是執行A的doSth...不過這種寫法一般來說是會被Eclipse警告的...在真的寫code時,不要用instance去執行static method
作者: cha122977 (CHA)   2014-12-20 02:55:00
static method無法被Override
作者: yfr   2014-12-20 14:10:00
用這樣的例子其實跟static沒什麼關係首要你要先搞懂Class field, method跟Instance field, method講的粗略一點,static修飾子會讓field, method成為Class的那麼你不需要new出來,就能用Class.var, Class.method存取同時這東西在記憶體中也是唯一的,要注意thread-safe的問題反之如果不加static就是Instance field, method要取得field或method就必須new出來,例如Class c = new Class();用c.var(public), c.method(public)叫
作者: Kenqr (function(){})()   2014-12-20 14:41:00
A aInstance = null; aInstance.doSth();上面這樣也是能跑的,因為呼叫static method只看class所以呼叫static method請直接用class名呼叫,以免造成混淆
作者: fuchs (fuchs)   2014-12-20 23:18:00
Static 只和class有關,和instance無關
作者: tubbysong (song)   2014-12-23 01:45:00
C宣告類別 cInstance物件名 = new建立空間的關鍵字 C()new C();單純創造空間時的初始化處理,不決定物件

Links booklink

Contact Us: admin [ a t ] ucptt.com