[此贴子已经被作者于2007-11-12 18:37:52编辑过]
----------------解决方案--------------------------------------------------------
昨天回去看了看。找到原因了。
原因就是final修饰符。
如果final修饰的是基本类型且这个基本类型已经赋了值。那么它就在编译器提前赋值。。那么在运行期就无须初始化而直接使用。此时就不用再加载包含它的类了。。所以K.i只打印一行。即i的值。
而如果final修饰类型为非基本类型,或以表达式赋值。那么它还是在运行期初始化。此时就需要加载包含它的类了。。
在此例中因为属性默认都是static的。所以在加载类的同时,都会初始化。所以K.j才会打印出三行来。
----------------解决方案--------------------------------------------------------
可是final在哪儿啊?
----------------解决方案--------------------------------------------------------
接口里属性默认是static final的。。。
----------------解决方案--------------------------------------------------------
你把你写的那段代码发上来看下吧
----------------解决方案--------------------------------------------------------
interface I {
int i = 1, ii = Outer.out("ii", 2);
}
interface J extends I {
int j = Outer.out("j", 3), jj = Outer.out1("jj", 4);
}
interface K extends J {
int k = Outer.out("k", 5), kk = Outer.out("kk", 6);
}
public class Outer {
public static void main(String[] args) {
System.out.println(K.j);
}
public static int out(String s, int i) {
System.out.println(s + "=" + i);
return i;
}
public static int out1(String s, int i){
System.out.println(s+"="+i);
return i;
}
}
原来如此,明白了,没注意到这个问题...
----------------解决方案--------------------------------------------------------
回去debug了半天。。。感觉是final的问题。。。在thinking in java里还真找到了。。。
这种折磨人的问题也只有找thinking in java了。。。。
----------------解决方案--------------------------------------------------------
很多细节问题都没注意到...要好好复习一下了
----------------解决方案--------------------------------------------------------
做开发很少遇到这种问题。。
谁没事写这种蹩脚的程序啊
以后还得多来看看开发太模式化了。
----------------解决方案--------------------------------------------------------
这程序还让我发现Intellij IDEA一个bug。。。
打印K.i的时候,直接运行打印1.。。debug就打印ii=2,1。。。郁闷半天。。。
----------------解决方案--------------------------------------------------------