2011-11-28 42 views
1

我的项目中有没有以任何方式解决的类会影响最终结果?他们甚至被编译?没有引用的类是否被编译?

如何使用静态成员的内部类,静态内部类或顶级类?

在此先感谢。 (对不起,如果我的问题有些宽泛。)

+0

除非您像右键单击,构建路径 - >排除,考虑它们。 – bestsss

回答

6

编译源文件中定义的所有类都会被编译,无论它们在运行时是否被使用,在编译阶段都是没有意义的。

但是永远不会使用的类永远不会在运行时加载。

如果您的“最终结果”是您的项目的运行时行为,那么编译但从未加载且从不使用的未使用的类将不会以任何方式影响“最终结果”。

但是,请注意,如果您的未使用的类有编译错误,那么它们将会停止您的项目编译(因此使您无法运行它),即使这些类在运行时不会被使用。

+1

实际上,Java不仅能够编译和运行项目,而且还能运行编译错误的类。尝试调用其中存在编译错误的方法,或者引用编译错误太严重以至于无法对类进行部分编译的类将导致运行时错误。 –

+0

嗯,这非常有趣。我不知道(但不幸找不到)JDK中的标准javac编译器所采用的任何选项:a。生成部分编译。适用于编译错误的Java类的类文件,或者b。当在同一命令上调用时,甚至是至少一个具有编译错误的.java文件,即使是没有错误的Java类也会生成类文件。您能否给我一个关于如何部分编译和运行带有编译错误的Java类的指针? –

+0

在Eclipse中创建示例项目(或Netbeans,两者的工作方式相同)。给它一个主要的方法,在该方法中写'System.out.println(“它正在运行!”); FOO();'。不要写'foo()'函数,然后按运行。当Eclipse抱怨错误时,请告诉它反正启动程序。它将打印“它正在运行!”到控制台,然后抛出一个指示编译问题的java.lang.Error。只要你没有遇到编译问题的代码行,你的程序就会运行得很好。我不确定它是否是javac的自动功能,但它显然是可能的。 –

1

是的,他们会得到编译......编译器不知道你的项目之外可能在编译时调用的东西。您可以随时查看已编译的.class文件。

0

是的,他们会被编译。

即使他们没有被你使用,其他人仍然可以使用你创建的任何公共类......如果你将一个jar导入到你的项目中,并将它用作依赖项,那么你'可能会使用该jar中的类,这些jar中的任何其他类都没有引用它们,它们仅供客户使用。

因此,Java编译器将编译您在项目中编写的每个类,您创建的项目不知道您是仅编写当前项目本地使用的类,还是编写库。

1

这取决于你的构建系统。一般来说,它们会被编译。

需要考虑的几点。

  1. 即使您的项目没有引用它们,您的项目可能会使用反射 - 在这种情况下,编译器应如何知道您不使用它们。你能证明吗?
  2. 如果这些类是公开的,其他人可以独立使用您的类。
  3. 关于内部类,使用静态成员的静态内部类或顶级类 - 它们将被编译的可能性很高。