该程序运行后,会有编译错误::ClassA 没有实现接口方法f()
这个可以理解,理解不了的是,为什么编译错误的程序还能生成字节码文件并且运行呢?
该程序运行结果是:I am ClassAinterface InterfaceA{
int max=100;
void f();
}
interface InterfaceB extends InterfaceA{
void g();
}
class ClassA implements InterfaceB{
public void g(){
System.out.print("I am ClassA");
}
}
public class E {
public static void main(String[] args) {
ClassA a=new ClassA();
a.g();
}
}

解决方案 »

  1.   

    补充说明一下,该程序在dos下编译,只能生成InterfaceA.class,InterfaceB.class,是不能运行的
    但是在eclipse下,写着有一处错误,但是却能生成E.class,也可以带着错误运行
    希望牛人能给解释一下
      

  2.   

    有一种可能,之前你的编译通过过,后在改变了接口或者修改了类,编译出现错误,运行时调用的仍然是之前的那个class。
      

  3.   

    eclipse用jdt编译的吧,他可以把错误的类编译出来,字节码你可以看下,其实里面就个类名和方法名字,
    等调用到才才知道错误的,也就是说字节码不保存各个类之间的关系个人简介,仅供参考
      

  4.   

    请大家看清楚我的问题
    我问的是为什么可以带着错误执行该文件,而不是错误本身。
    另外,我之前也没有编译过。5楼的同学比较有参考价值,我现在去看字节码文件,谢谢
    但是只有类名和方法名就可以执行出I am ClassA 么?
      

  5.   

    public class E {
    public static void main(String[] args) {
    ClassA a=new ClassA();
    a.f();
    }
    }这段会报错,我估计classloader载入类的时候并不检查类与类之间的关系,只是在调用的时候才去检查,这样做我估计是性能上的考虑,载入的时候检查可能会涉及到很多类,速度会很慢还有jvm默认你编译出来的文件是正确的,这一点jvm只做简单的检查,就是magic number