在Java中编译类文件一直令人困惑

时间:2014-09-30 18:44:37

标签: java compilation javac

我有三个.java个文件,A.javaB.javaC.java

A.java

public class A {

    public static void main(String[] args) {

        A a = new A();
        B b = new B();

        a.display();
        b.display();
    }


    public void display() {

        System.out.println("In A");
    }
}

B.java

public class B {

    public void display() {

        System.out.println("In B");

        C c = new C();
        c.display();
    }
}

C.java

public class C {

    public void display() {

        System.out.println("In C");
    }
}

程序运行正常。我编译为:

javac A.java

这会生成A.classB.classC.class个文件。

然后将其作为:

运行
java A

它的输出:

In A
In B
In C

现在问题在这里:
当我删除A.classC.class以及 B.java并重新编译A.java时:

javac A.java

这仅生成A.classB.class已经存在,因为未删除 但为什么这次没有生成C.class

注意C.classB.classA.class一起被删除时生成C.class。或者,如果我在B.java文件预编译中进行了任何更改。

2 个答案:

答案 0 :(得分:2)

编译A时,它引用了B,所以它也必须编译它。 A不了解C因此无法编译。

我建议您使用IDE或maven之类的构建工具,因为您将获得更复杂的项目,这将成为一个噩梦,试图跟踪更改时需要重新编译的文件一个文件。

答案 1 :(得分:1)

因为C类不是在A类中使用而是在B类中使用。由于您没有删除B类,因此编译器仅生成A类。 一个类不依赖于C类,因此不会编译C类。