没有显式导入的类之间的依赖关系 让我们考虑java中的简单类层次:
A类:没有显式导入的类之间的依赖关系 让我们考虑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
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();
}
}
可以看出,只有从classMain
直接导入a
。但是,我们正在调用从A.A()
返回的方法b
。
我的问题是,尽管我们在
Main
和B
之间没有直接的导入依赖关系,但它们仍然被认为是直接依赖的吗?例如,当我分析类之间的依赖关系时?是的,这是一种直接依赖关系。您不必向编译器声明它,因为它可以查看返回aB
的方法签名,并将为您解析类
如果编译器找不到B
(或要调用它的方法),您将得到一个关于缺少类的编译时错误
在运行时,当您加载一个类时,它还会加载方法签名中引用的所有类(如果找不到这些类,则会失败)
还请注意,
import
语句本身仅用于编译器。它们对生成的类文件没有影响。这意味着,如果您导入10个未使用的类,这些类将不会成为依赖项(编译器仍会抱怨导入部分中缺少这些类,但它们不会在运行时加载)。编译时,编译器会将依赖项链接起来
这意味着,由于使用并导入了a.a
,因此从a.a
导入的内容也会添加到编译(或链接,IIRC)中
因此,如果查看生成的.class
文件,您将看到它导入b.b
所以要回答您的问题:在java级别,它们是间接依赖的。编译后-直接依赖
(我可能错了,但这是我的理解。如果有人知道得更好,请务必纠正我:D)这是一个非常有趣的问题。:)