您已经在
Java文档中很好地描述了它。
对于您的第一个问题,答案非常简单。不使用
-implicit
选项几乎就像使用
-implicit:class
(这是该选项的默认值),但通过明确使用该选项,您可以抑制某些警告:
编译器可能直到注释处理完成后才会发现某些类型信息的需求。当在源文件中找到类型信息且未指定
-implicit
选项时,编译器会发出警告,指出正在编译文件而没有被注释处理。要禁用警告,请在命令行上指定该文件(以便进行注释处理)或使用
-implicit
选项来指定是否应为此类源文件生成类文件。
现在回答您的第二个问题。正如文档所述:
编译器经常需要有关类型的信息来编译源文件,但是类型定义不在命令行上指定的源文件中。编译器需要每个在源文件中使用、扩展或实现的类或接口的类型信息。这包括在源文件中未显式提及但通过继承提供信息的类和接口。
例如,当您创建一个子类java.applet.Applet时,您还使用Applet的祖先类:
java.awt.Panel
、
java.awt.Container
、
java.awt.Component
和
java.lang.Object
。
让我们有三个类在三个文件中:Main、ImplicitClass、BaseImplicitClass。
Main.java:
public class Main {
public static void main(String[] args) {
ImplicitClass ec = new ImplicitClass();
System.out.println(ec.getClass());
}
}
ImplicitClass.java:
public class ImplicitClass extends BaseImplicitClass {
}
BaseImplicitClass.java:
public class BaseImplicitClass {
}
当您像以下这样从命令行编译它们时:
javac -cp . -implicit:class Main.java
或者
javac -cp . Main.java
所有三个*.class文件都已创建。
当您编译它时
javac -cp . -implicit:none Main.java
只有Main.class被创建。
当您编译它时
javac -cp . -implicit:none Main.java ImplicitClass.java
创建了两个*.class文件,Main.class
和ImplicitClass.class
(因为已经显式传递给编译器,所以ImplicitClass
现在已成为显式类),但没有创建BaseImplicitClass.class
,因为该类是隐式的,但实际上是需要的。