本帖最后由 c4a4s4d4 于 2010-09-17 15:06:40 编辑

解决方案 »

  1.   

    不知道说的对不对噢:接口可以看做是以个抽象类,它其实也是个类,由于Java是单继承,为了实现多继承,以接口的形式实现多继承。
      

  2.   

    1 javac 自动处理依赖关系。2 常量是静态连接的。
      

  3.   

    能具体解释一下第二点么?
    是说,编译的时候,就把接口中的常量值 放到了子类的class文件中了么?
      

  4.   

    1)当用javac Test.java时 其实现的接口也会被编译
    因为接口是一种特殊的抽象类 
    里面的变量默认为public static final 
    里面的方法默认为public abstract 个人认为可以理解为继承了一个抽象类 
    当你继承一个类的时候 当然也会编译这个抽象类啦。因为你继承了它的属性和方法2)当你只修改并编译MyInterface的时候 这时Test.class没有被改变
    通过反编译工具可以查看得到 它会将变量test变为字符串内容打印出来Test.class 内容:import java.io.PrintStream;public class Test
      implements MyInterface
    {
      public static void main(String[] paramArrayOfString)
      {
        System.out.println("test");
      }
    }修改MyInterface之后 这个Test.class文件并没有改变 所以还是打印出 test 字符串但是不能把MyInterface.class删除
      

  5.   

    能从理论上 讲讲第二点么?
    重新编译MyInterface,但是打印出来的值还不变。
    还不能删除,这是什么原因?
    期待中... ...
      

  6.   

    6楼打错字?还是?
    System.out.println("test");
    不是打印test还能再打印什么?
    我试验重新编译MyInterface根本没有楼主说的这种情况。
    不知道你们都运行过没?
    还是我的理解错误了。
      

  7.   

    无语给你· 改了接口的代码之后··编译··然后执行子类的文件1!!!!!
    首先·你的第一个问题··为什么生成了两个class文件(接口的class文件也编译了)?
    这是因为子类对象本身包含了一个父类的对象··即使是接口也是一样的··当你编译子类的文件的时候··内存里堆空间里有一个子类的对象··它内部包含有一个父类对象··所以会产生两个class文件··
    然后·你的第二个问题···编译它javac MyInterface.java,然后执行java Test依旧显示:
    test
    为什么?
    你去编译了父接口··然后执行了子类文件··你说··会改变吗?重新编译和执行子类的文件··
      

  8.   

    因为接口中声明的变量时pubic static final 不可改变其值的
      

  9.   

    修改一下Test类
    如下:import java.lang.reflect.Field;
    public class Test implements MyInterface{
        public static void main(String[] args){
            Test t = new Test();
            Class c = t.getClass();
            Class[] classes = c.getInterfaces();
            for (int i = 0; i < classes.length; i++) {
                Field[] fields = classes[i].getFields();
                for (int j = 0; j < fields.length; j++) {
                    try {
                        System.out.println(fields[j].get(null));
                    } catch (IllegalArgumentException e) {
                        e.printStackTrace();
                    } catch (IllegalAccessException e) {
                        e.printStackTrace();
                    }
                }
            }
        }
    }
    如果这样,我该接口中的常量,只编译接口,执行子类。就能得到变化。
    楼上两位大虾 能解释一下原因么?
      

  10.   

    一直用eclipse还没有发现这个问题呢!