java 包 和 物理目录 解惑
今天做 JUnit 实验, 发现在物理实际不同的目录(src, testsrc)下可以使用相同的包名, 并且在这两个目录下, 都有个子目录 coolUnit (这个子目录是配合 package 使用的) 问题:
1. 那么包名和实际物理路径有什么关系?
答: 包名必须出现在实际路径中的一部分, 只是一段, 不可能是绝对路径. 而这个段的起点, 就是包含了classpath目录的一个.
可以看到如下代码, 是eclipse 自动生成的 .classpath文件, 其中classpath就包含了testsrc, src, 而这两个目录下都有个子目录 coolUnit, 这个就是包名的开始.
<?xml version="1.0" encoding="UTF-8"?>
<classpath>
<classpathentry kind="src" path="src"/>
<classpathentry kind="src" path="testsrc"/>
<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.6"/>
<classpathentry kind="con" path="org.eclipse.jdt.junit.JUNIT_CONTAINER/4"/>
<classpathentry kind="output" path="bin"/>
</classpath>
2. 相同包名 如果可以存储在不同物理路径下, java 编译器如何找到对应的类 ?
答: 当然可以存储在不同的物理路径下, 只不过这两个路径中, 有一部分必须相同, 即包名包括的部分. 置于java编译器如何找到, 简单, 就是把从包名的起点的上层目录添加到classpath中了, 这样就可以找到对应了类了. 类似上边的testsrc, src, 这两个目录都被添加进了classpath(当然这个工作是eclipse替我们完成的, 如果是我们自己编译, 不借助eclipse, 就需要指定 javac –classpath 把这两个目录加进去)
3. 这里肯定跟classpath 有关, 不可能你随便写个java类, java 编译器都能找到, 那么如何引入自己写的类呢?
如何引用自己的类的, 就是将自己的类的包名的起点的上层目录作为 javac –classpath参数传入, 这样的目的是让java编译器找到你的类所在的位置.
综上: 包名是抽象出来的类的空间, 虽然在物理上存储需要文件夹配合层次, 但是关键, 这个层次不是绝对路径, 只是路径中的一部分, 所以, 我们完全可以将代码放在不同路径下, 只要路径中对应包名的部分相同就可以了.
包
为了更好地组织类,Java提供了包机制。包是类的容器,用于分隔类名空间。如果没有指定包名,所有的示例都属于一个默认的无名包.
Java中的包一般均包含相关的类,例如,所有关于交通工具的类都可以放到名为Transportation的包中.
包语句格式:
package pkg1[.pkg2[.pkg3…]];
程序中如果有package语句,该语句一定是源文件中的第一条可执行语句,它的前面只能有注释或空行。另外,一个文件中最多只能有一条package语句.
包的名字有层次关系,各层之间以点分隔。包层次必须与Java开发系统的文件系统结构相同(并非绝对路径)。通常包名中全部用小写字母,这与类名以大写字母开头,且各字的首字母亦大写的命名约定有所不同。
当使用包说明时,程序中无需再引用(import)同一个包或该包的任何元素。import语句只用来将其他包中的类引入当前名字空间中。而当前包总是处于当前名字空间中.
如果文件声明如下:
package java.awt.image
则此文件必须存放在Windows的java\awt\image目录下或unix的java/awt/image目录下。
问题出现了: 因为路径不可能是绝对的, 即从根目录开始一直向下, 所以目录的开始位置, 只需要是classpath包含的位置就可以了.
这才是问题解决的关键. 从这点说, 包名是抽象的.
java 包 和 物理目录 解惑的更多相关文章
- idea中的java web项目(添加jar包介绍)和java maven web项目目录结构
java web项目 web项目下web根目录名称是可以更改的 idea中新建java web项目,默认src为Sources Root,当然也可以手动改,在Sources Root下右键只能新建Pa ...
- android工程gen目录中R.java包名是怎么确定
新建一个工程,包名用的com.mythroad.adskiller, 后来觉得不好,又改成com.mythroad.adsinscepter,但是我发现gen下的R.java文件的包名还是原来的com ...
- 转:java两个jre目录和三个lib目录
lib目录下放置着jar包.程序中的import语句找的就是这些文件!例如:import javax.servlet.RequestDispatcher; 问题在于,在cmd模式下编译,系统会提 ...
- java包和jar包
1.包 package pack; /*定义包,放在程序的第一行,包名所以字母小写*/ class PackageDemo{ publi ...
- Android 虚拟机Dalvik、Android各种java包功能、Android相关文件类型、应用程序结构分析、ADB
Android虚拟机Dalvik Dalvik冲击 随着Google 的AndroidSDK 的发布,关于它的API 以及在移动电话领域所带来的预期影响这些方面的讨论不胜枚举.不过,其中的一个话题在J ...
- 在Eclipse工具里创建maven的web工程,在建立src/main/java包出现The folder is already a source folder.解决
1. 与创建普通java工程一样,点击右键找到New菜单,在弹出的界面输入maven ---->>点击maven Project------>>点击next 2 进入下一个界 ...
- JavaSE复习日记 : java包机制
这里是第一个文件,命名为JavaSE_01.java,我在这个文件里面声明了一个m1()方法,通过包机制,我将在另外一个文件夹里访问这个文件里的东西,确切的说是访问这个文件生成的一个class文件; ...
- 理解Java包
本质上,包是一个唯一命名的类的集合,将类集合到包里面的主要原因,是为了当在应用程序中使用预先编写的类时避免与类自身可能引起的明明冲突.用于包中的类名不会妨碍另一个包或程序中的类名,因为此时,包中的类名 ...
- Android数据库框架——ORMLite轻量级的对象关系映射(ORM)Java包
Android数据库框架--ORMLite轻量级的对象关系映射(ORM)Java包 事实上,我想写数据库的念头已经很久了,在之前写了一个答题系统的小项目那只是初步的带了一下数据库,数据库是比较强大的, ...
随机推荐
- Word该值小于列表中的前一条目
在Word中进行多级编号时,前面一个二级标题是2.1,可后面一个二级标题是4.1,于是想把4.1改成2.2,使用 选中有问题的编号,右击"设置列表缩进",在打开的对话框中我们可以看 ...
- java实现双向循环链表
java实现循环链表:http://www.cnblogs.com/lixiaolun/p/4643911.html 在单链表中,查询下一个元素的时间是O(1).查询上一个元素的时间却是O(n). 为 ...
- tomcat支持中文文件名下载
http://blog.csdn.net/wnczwl369/article/details/7483806 Tomcat 是Java开发者使用得较多的一个Web服务器,因为它占用资源小,运行速度快等 ...
- 算法笔记_154:算法提高 日期计算(Java)
目录 1 问题描述 2 解决方案 1 问题描述 问题描述 已知2011年11月11日是星期五,问YYYY年MM月DD日是星期几?注意考虑闰年的情况.尤其是逢百年不闰,逢400年闰的情况. 输入格式 ...
- Android 4.4 KitKat 支持 u 盘功能
Android U 盘功能实现和分析 u 盘功能实现结果: u 盘会当成 usb storage 在 Settings Storage 里面显示. 准备工作 内核需支持 usb host,需支持 FU ...
- Maven构建项目时index.jsp文件报错
错误为:The superclass "javax.servlet.http.HttpServlet" was not found on the Java Build Path 原 ...
- Pytorch中的norm跟Numpy中的norm对比
- sql server数据库查询超时报错
报错信息如下: 链接服务器"DBJointFrame"的 OLE DB 访问接口 "SQLNCLI10" 返回了消息 "查询超时已过期". ...
- unity,List元素第一个成员最好是string类型
例如 List<CmyObj> m_list=new List<CmyObj>(); class CmyObj{ string m_name; int m_value; } c ...
- nexus 配置
1.下载 http://www.sonatype.org/nexus/go/ 例如:nexus-2.11.4-01-bundle.tar.gz 2.解压 tar -xzvf nexus-2.11.4 ...