[問題] 搞不懂static

看板java作者 (沒有存在感的人)時間9年前 (2014/12/20 00:34), 編輯推噓5(5017)
留言22則, 7人參與, 最新討論串1/1
例題如下: 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在這裡是起什麼樣的作用呢? 跪求高手解惑,感謝... -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 84.193.161.32 ※ 文章網址: http://www.ptt.cc/bbs/java/M.1419006844.A.98B.html

12/20 00:55, , 1F
我不是強者 無法給甚麼想法 但是可以先看看這篇文章
12/20 00:55, 1F

12/20 00:55, , 2F
#1InXOEIG (java) 或是同系列的幾篇
12/20 00:55, 2F

12/20 00:56, , 3F
也許看完就懂了~~ 至少我那時候看完後 對static更認識了!
12/20 00:56, 3F

12/20 02:50, , 4F
static method是看Class,而不是instance...
12/20 02:50, 4F

12/20 02:52, , 5F
所以aInstance.doSth()還是執行A的doSth...
12/20 02:52, 5F

12/20 02:52, , 6F
不過這種寫法一般來說是會被Eclipse警告的...
12/20 02:52, 6F

12/20 02:53, , 7F
在真的寫code時,不要用instance去執行static method
12/20 02:53, 7F

12/20 02:55, , 8F
static method無法被Override
12/20 02:55, 8F

12/20 14:10, , 9F
用這樣的例子其實跟static沒什麼關係
12/20 14:10, 9F

12/20 14:13, , 10F
首要你要先搞懂Class field, method跟Instance field, method
12/20 14:13, 10F

12/20 14:16, , 11F
講的粗略一點,static修飾子會讓field, method成為Class的
12/20 14:16, 11F

12/20 14:17, , 12F
那麼你不需要new出來,就能用Class.var, Class.method存取
12/20 14:17, 12F

12/20 14:18, , 13F
同時這東西在記憶體中也是唯一的,要注意thread-safe的問題
12/20 14:18, 13F

12/20 14:20, , 14F
反之如果不加static就是Instance field, method
12/20 14:20, 14F

12/20 14:21, , 15F
要取得field或method就必須new出來,例如
12/20 14:21, 15F

12/20 14:24, , 16F
Class c = new Class();用c.var(public), c.method(public)叫
12/20 14:24, 16F

12/20 14:41, , 17F
A aInstance = null; aInstance.doSth();
12/20 14:41, 17F

12/20 14:41, , 18F
上面這樣也是能跑的,因為呼叫static method只看class
12/20 14:41, 18F

12/20 14:42, , 19F
所以呼叫static method請直接用class名呼叫,以免造成混淆
12/20 14:42, 19F

12/20 23:18, , 20F
Static 只和class有關,和instance無關
12/20 23:18, 20F

12/23 01:45, , 21F
C宣告類別 cInstance物件名 = new建立空間的關鍵字 C()
12/23 01:45, 21F

12/23 01:49, , 22F
new C();單純創造空間時的初始化處理,不決定物件
12/23 01:49, 22F
文章代碼(AID): #1Kb5DycB (java)