我是Java的新手,仍然很难完全理解包和命名空间的概念。
显然,要将类放在与其包名称相同的目录中。如果我有嵌套包,则目录路径必须映射使用的包字符串。仅当目录路径使用Slash时,分别使用反斜杠来分隔包含字符串使用点的级别。
现在:如果我不得不用目录重现包字符串...... 为什么Java不能弄清楚一个类属于哪个包?为什么需要额外的包声明?
我问自己:无论如何,这应该是显而易见的,因为包含目录的规则始终是包名的名称。 ??
此外: 如果我有嵌套包,并且我不在其中一个包含的类中编写包语句,会发生什么?
答案 0 :(得分:3)
类的完全限定名称完全由源文件定义,通过组合包名称和类名称。完全限定名称永远不会从Java源的位置派生。
请注意Java源文件"文件"不必存储在文件系统上。它们可以存储在数据库,网络或其他任何地方。
因此,当编译器查找引用的类时(可能是import
语句),例如org.example.Foo
,它将首先检查该类是否已经编译并且在类路径上。如果没有,它将在Source Path上查找源代码,因此它也可以编译它,以防它已经不在要编译的类列表中。
使用文件系统时,定位该源要求源位于右侧目录中正确名称的.java
文件中,相对于在此目录中指定的源根目录来源路径。
如果编译器必须在源路径上查找源,那么这只是一个要求。如果明确列出所有源文件进行编译,那么源文件在技术上可以在任何地方。
E.g。如果您有两个包含类p1.Foo
和p2.Bar
的源文件,那么您可以在同一目录中创建两个文件x.java
和y.java
并进行编译。编译器仍会创建p1/Foo.class
和p2/Bar.class
。
答案 1 :(得分:1)
需要为什么Java无法弄清楚一个类属于哪个包?为什么需要额外的包声明?
包来解决类名冲突,并通过class loaders(在JVM内部)将正确的类加载到内存中。
假设您创建了两个名为Utils
类的类(一个Utils
类用于Maths,一个Utils
用于Physics,然后JVM在类加载时必须知道& ;解决需要加载/需要哪个Utils
类的问题。这就是软件包可以解决的问题,您可以定义com.maths.utils
和com.physics.utils
软件包,并将Utils类添加到正确的软件包中,以便我们以后可以使用{{1}在任何其他类中使用它} keyword用于指定我们所指的import
,即简而言之,包为类文件提供完整的全名。
如果我有嵌套包,并且我不在其中一个包含的类中编写包语句,会发生什么?
如果您有嵌套包,并且如果您不使用类顶部的Utils
关键字编写package
名称,则代码将无法编译。
我建议你再详细阅读here。