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

用Java编译类文件一直令人困惑,java,compilation,javac,Java,Compilation,Javac,我有三个.java文件,A.java,B.java和C.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.

我有三个
.java
文件,
A.java
B.java
C.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");
    }
}
public class B {

    public void display() {

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

        C c = new C();
        c.display();
    }
}
public class C {

    public void display() {

        System.out.println("In C");
    }
}
javac A.java
B.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");
    }
}
public class B {

    public void display() {

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

        C c = new C();
        c.display();
    }
}
public class C {

    public void display() {

        System.out.println("In C");
    }
}
javac A.java
C.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");
    }
}
public class B {

    public void display() {

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

        C c = new C();
        c.display();
    }
}
public class C {

    public void display() {

        System.out.println("In C");
    }
}
javac A.java
程序运行良好。我将其汇编为:

javac A.java
这将生成
A.class
B.class
C.class
文件

然后将其作为:

java A
它的输出:

In A
In B
In C
现在问题就在这里:
当我删除
A.class
C.class
,以及
B.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");
    }
}
public class B {

    public void display() {

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

        C c = new C();
        c.display();
    }
}
public class C {

    public void display() {

        System.out.println("In C");
    }
}
javac A.java
这只生成
A.class
B.class
已作为未删除项出现。
但是为什么这次没有生成
C.class


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

因为C类不是在A类中使用的,而是在B类中使用的。由于没有删除B类,编译器只生成A类。
一个类不依赖于C类,那么C类就不会被编译。

当你编译
A
时,它引用了
B
,所以它也必须编译它
A
不知道
C
所以它不编译它


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

您的a&B代码不会编译