推 lachtchlee:你這個Outer.java根本通不過編譯器那一關 是不是 ? 08/23 22:29
→ mars90226:因為就不允許了不是嗎? 08/23 22:47
推 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)
推 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)
→ lachtchlee:因為VERSION始終指向同一個位址 08/23 23:18
→ lachtchlee:你很用功佩服Java Rules Douglas Dunn Addison-Wesley 08/23 23:22
→ lachtchlee:2002 一書 有相關資料 有性趣的話 不仿瞧瞧 good luck 08/23 23:27
→ sbrhsieh:哪方面的資料? 08/23 23:29
→ lachtchlee:興趣 08/23 23:30
→ lachtchlee:something about static & inner class 08/23 23:32
→ sbrhsieh:為甚麼我需要看這些資料?我到覺得你比較需要多多研究 08/23 23:37
推 lachtchlee:你太自大了 08/23 23:48
→ sbrhsieh:不敢,這方面還不如你。 08/23 23:52
→ 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)
→ leeyh:我覺得你說法有點奇怪, 這是語法上面不允許的 08/25 22:11
→ leeyh:這跟VM能不能執行這種概念, 有沒有缺失完全是兩回事 08/25 22:14
→ sbrhsieh:我是提出來反對"因為效率上的考量而禁止"這個觀點 08/25 23:11
推 tomap41017:原PO最後一段有清楚說明為何要這樣寫的理由,但你 08/26 23:05