Java:将包语句丢弃会导致什么后果?

时间:2016-11-20 07:18:25

标签: java

我是Java的新手,仍然很难完全理解包和命名空间的概念。

显然,要将类放在与其包名称相同的目录中。如果我有嵌套包,则目录路径必须映射使用的包字符串。仅当目录路径使用Slash时,分别使用反斜杠来分隔包含字符串使用点的级别。

现在:如果我不得不用目录重现包字符串...... 为什么Java不能弄清楚一个类属于哪个包?为什么需要额外的包声明?

我问自己:无论如何,这应该是显而易见的,因为包含目录的规则始终是包名的名称。 ??

此外: 如果我有嵌套包,并且我不在其中一个包含的类中编写包语句,会发生什么?

2 个答案:

答案 0 :(得分:3)

类的完全限定名称完全由源文件定义,通过组合包名称和类名称。完全限定名称永远不会从Java源的位置派生。

请注意Java源文件"文件"不必存储在文件系统上。它们可以存储在数据库,网络或其他任何地方。

因此,当编译器查找引用的类时(可能是import语句),例如org.example.Foo,它将首先检查该类是否已经编译并且在类路径上。如果没有,它将在Source Path上查找源代码,因此它也可以编译它,以防它已经不在要编译的类列表中。

使用文件系统时,定位该源要求源位于右侧目录中正确名称的.java文件中,相对于在此目录中指定的源根目录来源路径。

如果编译器必须在源路径上查找源,那么这只是一个要求。如果明确列出所有源文件进行编译,那么源文件在技术上可以在任何地方。

E.g。如果您有两个包含类p1.Foop2.Bar的源文件,那么您可以在同一目录中创建两个文件x.javay.java并进行编译。编译器仍会创建p1/Foo.classp2/Bar.class

然而,如果编译器必须找到源,那么这样做会非常混乱并且不会起作用。如果您不遵循标准目录结构,大多数编译器会抱怨(警告或错误),以帮助您。

答案 1 :(得分:1)

  

为什么Java无法弄清楚一个类属于哪个包?为什么需要额外的包声明?

需要

包来解决类名冲突,并通过class loaders(在JVM内部)将正确的类加载到内存中。

假设您创建了两个名为Utils类的类(一个Utils类用于Maths,一个Utils用于Physics,然后JVM在类加载时必须知道& ;解决需要加载/需要哪个Utils类的问题。这就是软件包可以解决的问题,您可以定义com.maths.utilscom.physics.utils软件包,并将Utils类添加到正确的软件包中,以便我们以后可以使用{{1}在任何其他类中使用它} keyword用于指定我们所指的import,即简而言之,包为类文件提供完整的全名。

  • 可以将多个类(与相同功能相关)分组为 包。
  • 可以将多个包(与相同功能相关)分组为 JAR文件。
  

如果我有嵌套包,并且我不在其中一个包含的类中编写包语句,会发生什么?

如果您有嵌套包,并且如果您不使用类顶部的Utils关键字编写package名称,则代码将无法编译。

我建议你再详细阅读here