Java 中包和目录之间的区别

2022-09-01 23:11:31

Java 项目中,将所有.java文件保留在同一文件夹中是否意味着它们位于同一个包中?

与将所有项目文件保存在一个文件夹中相比,为我们的项目创建包有什么区别?

这个线程并没有真正解决我的问题。


答案 1

包和目录之间有关系,但这是您必须维护的关系。如果你有一个位于“mypackage1.mypackage2”中的类,这意味着该命令将期望在名为“mypackage1\mypackage2”的目录结构中找到它(假设“向后”Windows表示法),该目录结构进一步嵌入到一个目录(我们称之为“myjava”)中,其名称位于(或者直接在“当前目录”中)。javaclasspath

因此,您的Java类(内部显示)位于“\Users\myName\myjava\mypackage1\mypackage2\”中,并且您将“\Users\myName\myjava”放在类路径中,否则您将当前目录设置为“\Users\myName\myjava”。package mypackage1.mypackage2;

如果你把它混为一谈,要么根本找不到这个类,要么你会得到一个错误,比如模糊不清的“NoClassDefFoundError”。

至于为什么会使用包(和目录),原因与“名称空间”和“关注点分离”(查找这些)有关。如果没有软件包,并且所有“java.lang”,“java.io”,“sun.misc”等类都在一起,那么Java将更难保持直线。首先,必须使用名称“前缀”来保持它们直通并避免名称冲突。而且大部分逻辑分组将丢失。

对于你自己的项目,你不需要将包用于你为自己编写的简单小程序,但是如果你写了一些你可能会给别人的东西,那么使用诸如“myname.myproject”之类的包是礼貌的(当然是替换你的名字和项目),所以你给它的人可以把它与其他人结合起来,而不会有名字冲突。

在大型应用中,您会发现使用更高水平的分离有助于您保持功能直截了当,因此您知道一切在哪里。它还不鼓励你“跨越边界”不同功能区域之间的界限,这样你就不会得到不相关的逻辑纠缠在一起。

Eclipse(如果你使用它)有点混淆了这个问题,因为它“想要”提供目录和软件包名称,并且有时会(但并非总是)保持它们同步。


答案 2
  • 为类提供逻辑命名空间。

  • 这些包以目录级别的形式存储(它们被转换为嵌套目录),以为您的类提供物理分组(命名空间)。

另请注意,命名空间必须与命名空间一致。你不能在目录结构下有 ,它必须 下,并且此目录被添加到类路径中,以便你的类在运行代码时对 JVM 可见physicallogicalpackage com.demo\com\demo\temp\\com\demo\

假设您有以下目录结构: -

|

+-- 示例.java(包含包 B 下的演示类)
|
+-- 外.java(包含演示类 - 无包)
|
+--B
| |
|+-- 演示.class
|
+--C
| |
|+-- abc.class
|
+-- 演示.class

假设您的类 和(在目录 A 下)不是在任何包下定义的,您的类(在目录 B 下)是在 下定义的。因此,您需要在类路径中有两个目录: - (对于两个类:- 和)和(对于类 )。。Abc.classDemo.classDemo.classpackage B\ADemo.classB.Demo.class\A\CAbc.class

  • 不同包下的类可以使用相同的名称。这就是为什么上面定义的两者之间不会有任何冲突的原因。因为它们在不同的.这就是将它们划分为..这是有益的,因为您的类不会用完唯一的名称。Demo.classpackagesnamespaces