在 shell 命令提示符下,如果我输入javac -help
,它会告诉我该-implicit
选项指定“...是否为隐式引用的文件生成类文件”。有两个选项与-implicit:
none
或一起使用class
。
-implicit:none
首先,使用和不使用 -implicit
选项有什么区别?
其次,关于我的问题标题,我希望提供的示例可以帮助我理解隐式引用的文件是什么。非常感谢。
在 shell 命令提示符下,如果我输入javac -help
,它会告诉我该-implicit
选项指定“...是否为隐式引用的文件生成类文件”。有两个选项与-implicit:
none
或一起使用class
。
-implicit:none
首先,使用和不使用 -implicit
选项有什么区别?
其次,关于我的问题标题,我希望提供的示例可以帮助我理解隐式引用的文件是什么。非常感谢。
您在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。
主.java:
public class Main {
public static void main(String[] args) {
ImplicitClass ec = new ImplicitClass();
System.out.println(ec.getClass());
}
}
隐式类.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
因为需要此类,而是隐式的。