[此贴子已经被作者于2007-11-12 18:37:52编辑过]
[此贴子已经被作者于2007-11-12 18:37:52编辑过]
昨天回去看了看。找到原因了。
原因就是final修饰符。
如果final修饰的是基本类型且这个基本类型已经赋了值。那么它就在编译器提前赋值。。那么在运行期就无须初始化而直接使用。此时就不用再加载包含它的类了。。所以K.i只打印一行。即i的值。
而如果final修饰类型为非基本类型,或以表达式赋值。那么它还是在运行期初始化。此时就需要加载包含它的类了。。
在此例中因为属性默认都是static的。所以在加载类的同时,都会初始化。所以K.j才会打印出三行来。
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;
}
}
原来如此,明白了,没注意到这个问题...
做开发很少遇到这种问题。。
谁没事写这种蹩脚的程序啊
以后还得多来看看开发太模式化了。