Java中包和目录的区别

Java中包和目录的区别,java,directory,packages,Java,Directory,Packages,在Java项目中,将所有.Java文件保存在同一文件夹中是否意味着它们位于同一个包中 为我们的项目制作一个包与将所有项目文件保存在一个文件夹中有什么区别? 实际上并没有解决我的问题。包和目录之间有一种关系,但这是您必须维护的关系。如果您有一个在“mypackage1.mypackage2”中的类,这意味着java命令将期望在名为“mypackage1\mypackage2”的目录结构中找到它(假设使用“向后”Windows表示法),该目录结构将进一步嵌入到目录中(我们称之为“myjava”)其名

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

为我们的项目制作一个包与将所有项目文件保存在一个文件夹中有什么区别?


实际上并没有解决我的问题。

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

因此,您的Java类(内部称为
package mypackage1.mypackage2;
)位于,比如说“\Users\myName\myjava\mypackage1\mypackage2\”,您将“\Users\myName\myjava”放在类路径中,或者将当前目录设置为“\Users\myName\myjava”

如果您混淆了这一点,要么根本找不到该类,要么您将得到一个类似于模糊的“NoClassDefFoundError”的错误

至于为什么要使用包(和目录),原因与“名称空间”和“关注点分离”(查找它们)有关。如果没有包,并且所有的“Java.lang”、“Java.io”、“sun.misc”等类都在一起,那么Java就很难保持整洁。首先,必须使用名称“前缀”,以保持其笔直,避免名称冲突。而且大部分逻辑分组都将丢失

对于你自己的项目,你不需要为你自己编写的简单的小程序使用软件包,但是如果你写了一些你可能会送给别人的东西,那么使用诸如“myname.myproject”之类的软件包(当然要替换你的名字和项目)是礼貌的,因此,您将其提供给的人可以将其与其他人合并,而不会出现名称冲突

在大型应用程序中,您会发现使用更高级别的分离有助于保持函数的直线性,因此您知道所有内容的位置。它还阻止您在不同的功能领域之间“跨越边界”,这样您就不会进入不相关的逻辑

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

  • 为类提供逻辑命名空间

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

另外,请注意,
物理
命名空间必须与
逻辑
命名空间一致。。不能将带有
包com.demo
的类放在目录结构下:-
\com\demo\temp\
它必须放在
\com\demo\
下,并且该目录被添加到类路径中,这样当JVM运行代码时,您的类就可以可见

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

A

+--Sample.java(包含包B下的Demo类)

+--Outer.java(包含Demo类-无包)

+--B
|
+--Demo.class
|
+--C
|
+--Abc.class
|
+--Demo.class

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

  • 不同包下的类可以使用相同的名称。这就是为什么上面定义的两个
    Demo.class
    之间不会有任何冲突。。因为它们在不同的
    包中
    。这就是将它们划分为
    名称空间的关键所在。。这是有益的,因为您不会耗尽类的唯一名称

了解类加载器子系统将回答您的问题

关于

给定一个完全限定的类型名,原始类装入器必须在 以某种方式尝试查找具有该类型的简单名称plus的文件 “.class”。因此,JVM搜索存储在中的用户定义的目录路径 名为CLASSPATH的环境变量。原始装载机看起来 在每个目录中,按目录在 类路径,直到找到具有适当名称的文件:类型的 简单名称加“.class”。除非该类型是未命名类型的一部分 包中,原始加载程序希望该文件位于 类路径中一个目录的子目录。的路径名 子目录是根据类型的包名生成的。对于 例如,如果原始类装入器正在搜索类 java.lang.Object,它将在java\lang中查找Object.class 每个类路径目录的子目录


通过谷歌搜索你的标题,我不明白这个链接。请澄清。!这意味着,这个问题已经被问过了,你应该先查找这个和类似的问题。我知道,但是我不理解已经问过的问题的答案。是的,我认为另一个问题的答案有点糟糕。所以假设我在文件夹\java\limbo\中有一个.java文件,它需要使用一个类