结果如下:
1
j=3
jj=4
3

解决方案 »

  1.   

    1
    j=3
    jj=4
    3
    说说问这个问题的原因
      

  2.   

    谁能说清楚它的执行过程?为什么不会输出:ii=2?为什么会输出:jj=4?
      

  3.   

    因为j是i的子类﹐所以jj覆盖了ii
      

  4.   

    : liuhai_2599(大海) 不是吧,两个类的变量名字不同呀
      

  5.   

    "因为j是i的子类﹐所以jj覆盖了ii"
    怎么可能,变量名不同也能覆盖?从没听过。
      

  6.   

    上面的我理解不了,不过大家可以看看下面这个:
    public class Test{
        
        public static void main(String[] args) {
            System.out.println(J.i);
            System.out.println(K.j);
        }
        static int out(String s, int i) {
            System.out.println(s + "=" + i);
            return i;
        }
        
    }
    class I {
    public static int i = 1, ii = Test.out("ii", 2);
    }
    class J extends I {
    public static int j = Test.out("j", 3), jj = Test.out("jj", 4);
    }
    class K extends J {
    public static int k = Test.out("k", 5);
    }
    猜猜输出是什么?比上面的容易理解吧。
      

  7.   

    : liuhai_2599(大海) 
    final变量不能覆盖。大鸟呢?出来解释一下吧
      

  8.   

    Sorry﹐没有看清楚就在乱发言.我的错!
      

  9.   

    真正的原因可以从Java Language Specification中找到
    这是一个其中关于类和接口处世化的例子,我在这抛砖引玉一下这是一个关于Interface初始化的问题为何这样输出的原因是这样的实现了一个Inteface I的类或者子接口初始化的时候I不一定要求被处世化,这和类不同.一个接口被初始化的必要条件是这样的
    1.是个接口的Field被赋值
    2.一个接口的Field被引用并且这个Field不是一个编译时期的常量
    3.对一个Field的引用只会引起定义这个Field的Class或Interface的初始化(注:
    1.接口的所有Field默认都是public static final的,
    2.对编译时期的常量的引用都会被编译器在编译时刻替换为改常量的拷贝,所以并不会引起对这个接口的初始化
    )所有,通过以上的分析可以知道
    当引用J.i时,由于j是个编译时刻的常量,所以并未引起J的初始化,所以不打印ii=22,只打印了1
    而引用K.j时,由于j不是编译时刻变量,所有未在编译时被赋值,一定要到运行时刻才可以被赋值,又因为刚才条款3,所以只有J这个接口被初始化,所以就打印j=3, jj=4,然后又打印了3
    ==================
    别忘给分啊:))))))
    呵呵,这是我的签名
    ==================
      

  10.   

    真正的原因可以从Java Language Specification中找到
    这是一个其中关于类和接口处世化的例子,我在这抛砖引玉一下这是一个关于Interface初始化的问题为何这样输出的原因是这样的实现了一个Inteface I的类或者子接口初始化的时候I不一定要求被处世化,这和类不同.一个接口被初始化的必要条件是这样的
    1.是个接口的Field被赋值
    2.一个接口的Field被引用并且这个Field不是一个编译时期的常量
    3.对一个Field的引用只会引起定义这个Field的Class或Interface的初始化(注:
    1.接口的所有Field默认都是public static final的,
    2.对编译时期的常量的引用都会被编译器在编译时刻替换为改常量的拷贝,所以并不会引起对这个接口的初始化
    )所有,通过以上的分析可以知道
    当引用J.i时,由于j是个编译时刻的常量,所以并未引起J的初始化,所以不打印ii=22,只打印了1
    而引用K.j时,由于j不是编译时刻变量,所有未在编译时被赋值,一定要到运行时刻才可以被赋值,又因为刚才条款3,所以只有J这个接口被初始化,所以就打印j=3, jj=4,然后又打印了3
    ==================
    别忘给分啊:))))))
    呵呵,这是我的签名
    ==================
      

  11.   

    真正的原因可以从Java Language Specification中找到
    这是一个其中关于类和接口处世化的例子,我在这抛砖引玉一下这是一个关于Interface初始化的问题为何这样输出的原因是这样的实现了一个Inteface I的类或者子接口初始化的时候I不一定要求被处世化,这和类不同.一个接口被初始化的必要条件是这样的
    1.是个接口的Field被赋值
    2.一个接口的Field被引用并且这个Field不是一个编译时期的常量
    3.对一个Field的引用只会引起定义这个Field的Class或Interface的初始化(注:
    1.接口的所有Field默认都是public static final的,
    2.对编译时期的常量的引用都会被编译器在编译时刻替换为改常 量的拷贝,所以并不会引起对这个接口的初始化
    )所有,通过以上的分析可以知道
    当引用J.i时,由于j是个编译时刻的常量,所以并未引起J的初始化,所以不打印ii=22,只打印了1
    而引用K.j时,由于j不是编译时刻变量,所有未在编译时被赋值,一定要到运行时刻才可以被赋值,又因为刚才条款3,所以只有J这个接口被初始化,所以就打印j=3, jj=4,然后又打印了3
      

  12.   

    System.out.println(J.i);输出:1 
    System.out.println(K.j);输出:j=3
    jj=4
    3
    楼上这位说的对啊!没错!
      

  13.   

    初始化完J后,K.j就被赋予值3,所以就打印出来了3啊
      

  14.   

    是不是这个过程:
    j=3
    jj=4
    是interface初始化时候调用test.out()的结果。
    3
    是真正System.out.println(K.j);的输出?
      

  15.   

    interface I {
    int i = 1, ii = Test.out("ii", 2);
    }
    class Test {
    public static void main(String[] args) {
    System.out.println(J.i);
    System.out.println(K.j);
    }
    static int out(String s, int i) {
    System.out.println(s + "=" + i);
    return i;
    }
    }
    这段程序是怎么运行的呢?请大家告诉我好不?因为我太菜了:(
      

  16.   

    建议把Test,I,J,K,i,j,k等等改为有意义的名字,便于你分析结果,然后再分析一下interface、extends的概念,就比较好理解了。
      

  17.   

    大家看看superswords(supersword)的问题啊。挺有意思。
    为什么输出会是这样的呢?
    ii=2
    1
    j=3
    jj=4
    3
      

  18.   

    因为,J继承了I的静态变量,K继承了J的静态变量,
    在"J.i"时,会开始初始化I类变量值,在"K.j"的时候会初始化J类变量值,但J类继承下来的I类变量值已经初始化过了,所以,这时只会初始化J类增加的变量值
    我也是采鸟,不知道是不是这样的。大家都来探讨探讨呀!
      

  19.   

    喜欢java的朋友可以一起学习
    msn:[email protected]
    icq:142555425
      

  20.   

    考!又糊肚了。
    怎么区分编译时期常量和编译时期变量?
    interface I {
    int i = 1, ii = Test.out("ii", 2);
    }
    i是编译时期常量,以为一上来就付值1
    ii是编译时期变量?可是Test.out("ii", 2);的结果是一定的呀。
    脑子突然混乱了!!给我整理整理!谢!
      

  21.   

    class Z {
    static int peek() { return j; }
    static int i = peek();
    static int j = 1;
    }
    class Test {
    public static void main(String[] args) {
    System.out.println(Z.i);
    }
    }
    再加一题
      

  22.   

    这个好像颇有点研究Java的味道了,实际程序里面谁去给interface定义变量谁就死定了
      

  23.   

    class Z {
    static int peek() { return j; }
    static int i = peek();
    static int j = 1;
    }
    class Test {
    public static void main(String[] args) {
    System.out.println(Z.i);
    }
    }
    再加一题
      

  24.   

    是0
    System.out.println(Z.i);时候
    i=peek();->peek()=j;->j并没有初始化,所以j=0
    所以i=0
    Is it right?
      

  25.   

    class Super {
    static String greeting() { return "Goodnight"; }
    String name() { return "Richard"; }
    }
    class Sub extends Super {
    static String greeting() { return "Hello"; }
    String name() { return "Dick"; }
    }
    class Test {
    public static void main(String[] args) {
    Super s = new Sub();
    System.out.println(s.greeting() + ", " + s.name());
    }
    }再贴一题,大家最好能说说原因,分析一下
      

  26.   

    你这些题目都是Java Language Specification中的例子我也没兴趣再解了,大家可以自己去看,应该时第12章的,关于类的处世化
      

  27.   

    请大鸟解释一下为何在打印"Z.i"时输出为"0"
    而在打印"Z.peek()"时输出为"1" ?
      

  28.   

    to Erazor(Erazor):
    为什么在打印"Z.peek()"时输出为"1" 呢?这时的j不都没初始化吗???
    在i=peek()的前提下,Z.i和Z.peek()有什么区别呢?
      

  29.   

    to  qdstar(大鸟):
    kao,怎么输出会是Goodnight, Dick
    语句Super s = new Sub();到底声明的是Super对象还是Sub对象啊?
      

  30.   

    静态方法调用以它的引用类型为准,s是super的引用,当然调用时候调用super.greet();
    和Delphi的静态方法调用一样,到那个平台这个道理都一样吧。
      

  31.   

    to Erazor(Erazor):
    为什么在打印"Z.peek()"时输出为"1" 呢?这时的j不都没初始化吗???
    在i=peek()的前提下,Z.i和Z.peek()有什么区别呢?
      

  32.   

    to Erazor(Erazor):
    为什么在打印"Z.peek()"时输出为"1" 呢?这时的j不都没初始化吗???
    在i=peek()的前提下,Z.i和Z.peek()有什么区别呢?
      

  33.   

    难道这样的问题人们都不屑回答吗?shit!
      

  34.   

    是啊,真不知道这java论坛都谈些什么
      

  35.   

    to colin1022 学习也要心平气和啊,我前两天没上网,休息去了,呵呵
    现在给你解答以下
    输出0的原因是调用Z.i时,要初始化Z,是按照书写循序来的,所以当调用i时,j还没有初始化,这是j的值时默认的0,所以i就被赋予了值0(java编译器时不检查这种由方法来初始化的变量的,所以不会报错,否则类似于
    static int i=j+1;
    static j = 3;
    是要报错的,这是非法的向前引用,你如果学过编译原理便晓得其中道理)
    而调用Z.peak时,Z已初始化完毕了,自然就返回了j的实际的值,
    推荐你反编译一下该程序便可知其中奥妙