作者wtchen (沒有存在感的人)
看板java
標題[問題] 搞不懂static
時間Sat Dec 20 00:34:01 2014
例題如下:
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://webptt.com/m.aspx?n=bbs/java/M.1419006844.A.98B.html
1F:推 BaiYe: 我不是強者 無法給甚麼想法 但是可以先看看這篇文章 12/20 00:55
3F:→ BaiYe: 也許看完就懂了~~ 至少我那時候看完後 對static更認識了! 12/20 00:56
4F:推 hegemon: static method是看Class,而不是instance... 12/20 02:50
5F:→ hegemon: 所以aInstance.doSth()還是執行A的doSth... 12/20 02:52
6F:→ hegemon: 不過這種寫法一般來說是會被Eclipse警告的... 12/20 02:52
7F:→ hegemon: 在真的寫code時,不要用instance去執行static method 12/20 02:53
8F:→ cha122977: static method無法被Override 12/20 02:55
9F:推 yfr: 用這樣的例子其實跟static沒什麼關係 12/20 14:10
10F:→ yfr: 首要你要先搞懂Class field, method跟Instance field, method 12/20 14:13
11F:→ yfr: 講的粗略一點,static修飾子會讓field, method成為Class的 12/20 14:16
12F:→ yfr: 那麼你不需要new出來,就能用Class.var, Class.method存取 12/20 14:17
13F:→ yfr: 同時這東西在記憶體中也是唯一的,要注意thread-safe的問題 12/20 14:18
14F:→ yfr: 反之如果不加static就是Instance field, method 12/20 14:20
15F:→ yfr: 要取得field或method就必須new出來,例如 12/20 14:21
16F:→ yfr: Class c = new Class();用c.var(public), c.method(public)叫 12/20 14:24
17F:推 Kenqr: A aInstance = null; aInstance.doSth(); 12/20 14:41
18F:→ Kenqr: 上面這樣也是能跑的,因為呼叫static method只看class 12/20 14:41
19F:→ Kenqr: 所以呼叫static method請直接用class名呼叫,以免造成混淆 12/20 14:42
20F:推 fuchs: Static 只和class有關,和instance無關 12/20 23:18
21F:→ tubbysong: C宣告類別 cInstance物件名 = new建立空間的關鍵字 C() 12/23 01:45
22F:→ tubbysong: new C();單純創造空間時的初始化處理,不決定物件 12/23 01:49