没有显式导入的类之间的依赖关系 让我们考虑java中的简单类层次:

没有显式导入的类之间的依赖关系 让我们考虑java中的简单类层次:,java,import,dependencies,Java,Import,Dependencies,A类: package a; import b.B; public class A { public B a() { return new B(); } } B类: package b; public class B { public void b() { System.out.println("B!"); } } 班长: import a.A; public class Main { public static

A类:

package a;

import b.B;

public class A {
    public B a() {
        return new B();
    }
}
B类:

package b;

public class B {
    public void b() {
        System.out.println("B!");
    }
}
班长:

import a.A;

public class Main {
    public static void main(String[] args) {
        A a = new A();
        a.a().b();
    }
}
可以看出,只有从class
Main
直接导入
a
。但是,我们正在调用从
A.A()
返回的方法
b

我的问题是,尽管我们在
Main
B
之间没有直接的导入依赖关系,但它们仍然被认为是直接依赖的吗?例如,当我分析类之间的依赖关系时?

是的,这是一种直接依赖关系。您不必向编译器声明它,因为它可以查看返回a
B
的方法签名,并将为您解析类

如果编译器找不到
B
(或要调用它的方法),您将得到一个关于缺少类的编译时错误

在运行时,当您加载一个类时,它还会加载方法签名中引用的所有类(如果找不到这些类,则会失败)


还请注意,
import
语句本身仅用于编译器。它们对生成的类文件没有影响。这意味着,如果您导入10个未使用的类,这些类将不会成为依赖项(编译器仍会抱怨导入部分中缺少这些类,但它们不会在运行时加载)。

编译时,编译器会将依赖项链接起来

这意味着,由于使用并导入了
a.a
,因此从
a.a
导入的内容也会添加到编译(或链接,IIRC)中

因此,如果查看生成的
.class
文件,您将看到它导入
b.b

所以要回答您的问题:在java级别,它们是间接依赖的。编译后-直接依赖


(我可能错了,但这是我的理解。如果有人知道得更好,请务必纠正我:D)

这是一个非常有趣的问题。:)