包和目录之间有关系,但这是您必须维护的关系。如果你有一个位于“mypackage1.mypackage2”中的类,这意味着该命令将期望在名为“mypackage1\mypackage2”的目录结构中找到它(假设“向后”Windows表示法),该目录结构进一步嵌入到一个目录(我们称之为“myjava”)中,其名称位于(或者直接在“当前目录”中)。java
classpath
因此,您的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(如果你使用它)有点混淆了这个问题,因为它“想要”提供目录和软件包名称,并且有时会(但并非总是)保持它们同步。
包为类提供逻辑命名空间。
这些包以目录级别的形式存储(它们被转换为嵌套目录),以为您的类提供物理分组(命名空间)。
另请注意,命名空间必须与命名空间一致。你不能在目录结构下有 ,它必须在 下,并且此目录被添加到类路径中,以便你的类在运行代码时对 JVM 可见。physical
logical
package com.demo
\com\demo\temp\
\com\demo\
假设您有以下目录结构: -
|
+-- 示例.java(包含包 B 下的演示类)
|
+-- 外.java(包含演示类 - 无包)
|
+--B
| |
|+-- 演示.class
|
+--C
| |
|+-- abc.class
|
+-- 演示.class
假设您的类 和(在目录 A 下)不是在任何包下定义的,而您的类(在目录 B 下)是在 下定义的。因此,您需要在类路径中有两个目录: - (对于两个类:- 和)和(对于类 )。。Abc.class
Demo.class
Demo.class
package B
\A
Demo.class
B.Demo.class
\A\C
Abc.class
- 不同包下的类可以使用相同的名称。这就是为什么上面定义的两者之间不会有任何冲突的原因。因为它们在不同的.这就是将它们划分为..这是有益的,因为您的类不会用完唯一的名称。
Demo.class
packages
namespaces
-
有没有办法让空包在Eclipse中可见? 在 Eclipse 中有没有办法看到空的父包?我在自由查看/访问仅包含2个子包的软件包时遇到问题: 我再次尝试创建该软件包,因为我认为我的eclipse项目中可能没有它,但它不会让我: 如何防
-
-
是否有用于打包枚举的 Java 约定?[已关闭] 是否有用于打包枚举的 Java 约定?如果没有,是否有最佳实践?我应该把它们都放在一个包“myapp.enum”中,还是应该把每个枚举放在它的相关包中?
-
Java 中包和目录之间的区别 在 Java 项目中,将所有.java文件保留在同一文件夹中是否意味着它们位于同一个包中? 与将所有项目文件保存在一个文件夹中相比,为我们的项目创建包有什么区别? 并没有真正解决我的问题
-