在shell命令提示符下,如果我输入javac -help
,它会告诉我-implicit
选项指定“...是否为隐式引用的文件生成类文件”。 -implicit:
none
或class
有两种选择。
首先,使用-implicit:none
与不使用 - implicit
选项有什么区别?
其次,关于我的问题标题,我希望提供的示例可以帮助我理解隐式引用的文件是什么。非常感谢。
答案 0 :(得分:5)
你在Java documentation中已经很好地描述了它。
你的第一个问题的答案很简单。不使用-implicit
选项几乎就像使用-implicit:class
(这是选项的默认值),但通过显式使用该选项可以禁止某些警告:
编译器可能不会发现某些类型信息的需要 直到注释处理完成。当类型信息 在源文件中找不到,并且没有指定
-implicit
选项 编译器发出警告,表明文件正在编译而不是 受注释处理。要禁用警告,也可以 在命令行上指定文件(以便它将受到限制 注释处理)或使用-implicit
选项指定是否 或者不应该为这些源文件生成类文件。
现在是你的第二个问题。正如文档所述:
要编译源文件,编译器通常需要有关a的信息 类型,但类型定义不在指定的源文件中 命令行。编译器需要每个类的类型信息 或在源文件中使用,扩展或实现的接口。这个 包括源中未明确提及的类和接口 文件,但通过继承提供信息。
例如,当你创建一个子类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
现已变为显式,因为它已显式传递给编译器),但不是{{1}因为这个类是必需的,但却是隐含的。