java 板


LINE

※ 引述《exorpo (exorpo)》之銘言: : 標題: [問題] 一般內部類別不能放靜態方法? : 時間: Mon Aug 22 18:39:19 2011 : : 大家好!最近在學Java的內部類別,碰到了一點問題... : : 想請問一般內部類別裡面不能放靜態(static)成員嗎? : : 如下方程式碼編譯是不通過的。 : : public class Test { : public static void fun() {} // OK : public class TestInner { : static int x; // not OK : public static void fun() {} // not OK : } : } : : 想知道原因 : : 謝謝大家! : : -- :



※ 發信站: 批踢踢實業坊(ptt.cc)
: ◆ From: 111.248.226.136 : ※ 編輯: exorpo 來自: 111.248.226.136 (08/22 18:42) : ※ 編輯: exorpo 來自: 111.248.226.136 (08/22 18:42) : → pico2k:原因就是Java不允許這樣子的宣告。 08/22 19:26 : → pico2k:請去看一下Java Language Specification 08/22 19:31 : → exorpo:嗯,找到了,謝謝!:) Ans:http://goo.gl/6zIzQ 08/22 19:55 : 推 po500922:宣告成static代表他不屬於單一個物件~應該是這樣吧 08/22 20:57 : 推 LaPass:C 好像才能這樣玩 java不行 08/23 07:58 : 推 LaPass:眼殘看錯,我看成在fun內宣告static 08/23 08:01 : 推 lachtchlee:static variable 好比愛心雨傘 放在店家門口(外部類中 08/23 10:29 : → lachtchlee:非靜態內部類外)就可以了 何必把它們放在有保全的倉庫 08/23 10:34 : → lachtchlee:(非靜態內部類中) 本來用類的名稱就可拿到的愛心傘 還 08/23 10:39 : → lachtchlee:要請出外部類的實例 然後創建非靜態內部類的實例 才摸 08/23 10:44 : → lachtchlee:得到那把愛心傘 效率太差 故乾脆規定 在非靜態內部類 08/23 10:49 : → lachtchlee:中 不該出現static鼠輩 08/23 10:53 : → lachtchlee:static method也是鼠輩 08/23 10:55 : → sbrhsieh:跟效率無關。主要是語意上適不適當。 08/23 17:44 : 推 lachtchlee:有何根據@~@ 08/23 19:32 以下列 classes 來說: package ptt.demo; public class Outer { public class Inner { public static int instanceCount; public Inner() { ++instanceCount; } } } 任何 class 要 access instanceCount 這個 static field,只需要寫 ptt.demo.Outer.Inner.instanceCount(如同一般存取 static field 的寫法)。 這沒有牽涉到推文中提到的有關先建立 Outer instance 與 Outer.Inner instance, 再來 access instanceCount field 的這些步驟,所以不能以此推論為效率上的考量。 那我所稱是語意上適不適當部份,是指 instance inner class/nested class 在語意 上視為某個 object/instance 的 member(看看 Outer.Inner object 的建立方式: someOuterObject.new Inner()),雖然它實際上是個 class,但應該不把它當作 一般的 class 對待。 這個主題在許多論壇應該都有討論過,有興趣者不妨 google 一下,看看各方的 觀點,看看自己認同哪一種。 --



※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 114.45.20.29
1F:推 lachtchlee:你這個Outer.java根本通不過編譯器那一關 是不是 ? 08/23 22:29
2F:→ mars90226:因為就不允許了不是嗎? 08/23 22:47
3F:推 lachtchlee:是的 08/23 22:50
OK,上面的 Outer 與 Outer.Inner classes 確實是可以存在的。 姑且不論你信不信,暫時把 Inner 改為 public class Outer { public class Inner { public static final String VERSION = "0.0.1"; public Inner() { } } } 你可以透過 ptt.demo.Outer.Inner.VERSION 來 access 這個 static field(常數)。 ※ 編輯: sbrhsieh 來自: 114.45.20.29 (08/23 22:57)
4F:推 lachtchlee:常量引用 可以 靜態變量則否 08/23 23:07
我覺得你要搞清楚,現在是討論為甚麼語法上做這樣的限制,不是編譯器說 不可以,然後由你來作結論"這是不可以的"。 我可以給你我一開始寫的那兩個 classes(Outer, Outer.Inner),不管你怎麼測試 與檢測,你會發現它的確就是如我所給的 source code。 http://www.megaupload.com/?d=0U670F9E (ptt_demo.jar,裡頭包兩個 class file) 如果你懶得自己寫,可以直接 copy 這段碼回去與 ptt_demo.jar 一同編譯與執行。 package ptt.demo; public class Main { public static void main(String[] args) { Outer outer = new Outer(); System.out.printf("[Before loop] Outer.Inner instance count: %s%n", Outer.Inner.instanceCount); for (int i = 0; i < 10; ++i) { System.out.println(outer.new Inner()); } System.out.printf("[After loop] Outer.Inner instance count: %s%n", Outer.Inner.instanceCount); } } ※ 編輯: sbrhsieh 來自: 114.45.20.29 (08/23 23:17)
5F:→ lachtchlee:因為VERSION始終指向同一個位址 08/23 23:18
6F:→ lachtchlee:你很用功佩服Java Rules Douglas Dunn Addison-Wesley 08/23 23:22
7F:→ lachtchlee:2002 一書 有相關資料 有性趣的話 不仿瞧瞧 good luck 08/23 23:27
8F:→ sbrhsieh:哪方面的資料? 08/23 23:29
9F:→ lachtchlee:興趣 08/23 23:30
10F:→ lachtchlee:something about static & inner class 08/23 23:32
11F:→ sbrhsieh:為甚麼我需要看這些資料?我到覺得你比較需要多多研究 08/23 23:37
12F:推 lachtchlee:你太自大了 08/23 23:48
13F:→ sbrhsieh:不敢,這方面還不如你。 08/23 23:52
14F:→ sbrhsieh:抱歉。應該就事論事,希望你也做的到。 08/24 00:00
現實中,Java Language 的規範確是 non-static inner class 不能有 non-final static field,但在 VM 層面是可以這麼做的,當我們這麼做了,沒有很明顯的 缺失(除了語意上妥當與否)。 ※ 編輯: sbrhsieh 來自: 114.45.20.29 (08/24 00:25) ※ 編輯: sbrhsieh 來自: 114.45.20.29 (08/24 00:42)
15F:→ leeyh:我覺得你說法有點奇怪, 這是語法上面不允許的 08/25 22:11
16F:→ leeyh:這跟VM能不能執行這種概念, 有沒有缺失完全是兩回事 08/25 22:14
17F:→ sbrhsieh:我是提出來反對"因為效率上的考量而禁止"這個觀點 08/25 23:11
18F:推 tomap41017:原PO最後一段有清楚說明為何要這樣寫的理由,但你 08/26 23:05







like.gif 您可能會有興趣的文章
icon.png[問題/行為] 貓晚上進房間會不會有憋尿問題
icon.pngRe: [閒聊] 選了錯誤的女孩成為魔法少女 XDDDDDDDDDD
icon.png[正妹] 瑞典 一張
icon.png[心得] EMS高領長版毛衣.墨小樓MC1002
icon.png[分享] 丹龍隔熱紙GE55+33+22
icon.png[問題] 清洗洗衣機
icon.png[尋物] 窗台下的空間
icon.png[閒聊] 双極の女神1 木魔爵
icon.png[售車] 新竹 1997 march 1297cc 白色 四門
icon.png[討論] 能從照片感受到攝影者心情嗎
icon.png[狂賀] 賀賀賀賀 賀!島村卯月!總選舉NO.1
icon.png[難過] 羨慕白皮膚的女生
icon.png閱讀文章
icon.png[黑特]
icon.png[問題] SBK S1安裝於安全帽位置
icon.png[分享] 舊woo100絕版開箱!!
icon.pngRe: [無言] 關於小包衛生紙
icon.png[開箱] E5-2683V3 RX480Strix 快睿C1 簡單測試
icon.png[心得] 蒼の海賊龍 地獄 執行者16PT
icon.png[售車] 1999年Virage iO 1.8EXi
icon.png[心得] 挑戰33 LV10 獅子座pt solo
icon.png[閒聊] 手把手教你不被桶之新手主購教學
icon.png[分享] Civic Type R 量產版官方照無預警流出
icon.png[售車] Golf 4 2.0 銀色 自排
icon.png[出售] Graco提籃汽座(有底座)2000元誠可議
icon.png[問題] 請問補牙材質掉了還能再補嗎?(台中半年內
icon.png[問題] 44th 單曲 生寫竟然都給重複的啊啊!
icon.png[心得] 華南紅卡/icash 核卡
icon.png[問題] 拔牙矯正這樣正常嗎
icon.png[贈送] 老莫高業 初業 102年版
icon.png[情報] 三大行動支付 本季掀戰火
icon.png[寶寶] 博客來Amos水蠟筆5/1特價五折
icon.pngRe: [心得] 新鮮人一些面試分享
icon.png[心得] 蒼の海賊龍 地獄 麒麟25PT
icon.pngRe: [閒聊] (君の名は。雷慎入) 君名二創漫畫翻譯
icon.pngRe: [閒聊] OGN中場影片:失蹤人口局 (英文字幕)
icon.png[問題] 台灣大哥大4G訊號差
icon.png[出售] [全國]全新千尋侘草LED燈, 水草

請輸入看板名稱,例如:Tech_Job站內搜尋

TOP