今天做 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 包 和 物理目录 解惑的更多相关文章

  1. idea中的java web项目(添加jar包介绍)和java maven web项目目录结构

    java web项目 web项目下web根目录名称是可以更改的 idea中新建java web项目,默认src为Sources Root,当然也可以手动改,在Sources Root下右键只能新建Pa ...

  2. android工程gen目录中R.java包名是怎么确定

    新建一个工程,包名用的com.mythroad.adskiller, 后来觉得不好,又改成com.mythroad.adsinscepter,但是我发现gen下的R.java文件的包名还是原来的com ...

  3. 转:java两个jre目录和三个lib目录

    lib目录下放置着jar包.程序中的import语句找的就是这些文件!例如:import javax.servlet.RequestDispatcher;    问题在于,在cmd模式下编译,系统会提 ...

  4. java包和jar包

    1.包 package  pack;                             /*定义包,放在程序的第一行,包名所以字母小写*/ class PackageDemo{    publi ...

  5. Android 虚拟机Dalvik、Android各种java包功能、Android相关文件类型、应用程序结构分析、ADB

    Android虚拟机Dalvik Dalvik冲击 随着Google 的AndroidSDK 的发布,关于它的API 以及在移动电话领域所带来的预期影响这些方面的讨论不胜枚举.不过,其中的一个话题在J ...

  6. 在Eclipse工具里创建maven的web工程,在建立src/main/java包出现The folder is already a source folder.解决

    1. 与创建普通java工程一样,点击右键找到New菜单,在弹出的界面输入maven ---->>点击maven Project------>>点击next 2  进入下一个界 ...

  7. JavaSE复习日记 : java包机制

    这里是第一个文件,命名为JavaSE_01.java,我在这个文件里面声明了一个m1()方法,通过包机制,我将在另外一个文件夹里访问这个文件里的东西,确切的说是访问这个文件生成的一个class文件; ...

  8. 理解Java包

    本质上,包是一个唯一命名的类的集合,将类集合到包里面的主要原因,是为了当在应用程序中使用预先编写的类时避免与类自身可能引起的明明冲突.用于包中的类名不会妨碍另一个包或程序中的类名,因为此时,包中的类名 ...

  9. Android数据库框架——ORMLite轻量级的对象关系映射(ORM)Java包

    Android数据库框架--ORMLite轻量级的对象关系映射(ORM)Java包 事实上,我想写数据库的念头已经很久了,在之前写了一个答题系统的小项目那只是初步的带了一下数据库,数据库是比较强大的, ...

随机推荐

  1. <The Art of Readable Code> 笔记二 (上)

    第2章  封装信息到名字 (Packing information into names) 2.1  use specific words GetPage() 不如 FetchPage() 和 Dow ...

  2. angularjs中的interval定时执行功能

    一个例子,用来显示当前实时时间,1秒钟刷新一次: <!DOCTYPE html> <html ng-app="myApp"> <head> &l ...

  3. 反射方式,获取出集合ArrayList类的class文件对象

    /* * 定义集合类,泛型String * 要求向集合中添加Integer类型 * * 反射方式,获取出集合ArrayList类的class文件对象 * 通过class文件对象,调用add方法 * * ...

  4. hadoop 异常及处理总结-02(小马哥精品)

    一直以来,对hdfs的警告信息不报以理睬,今天突然关注了一下.每当我操作hdfs的时候就会出现这样一个警告: WARN util.NativeCodeLoader: Unable to load na ...

  5. android开发之数据库游标未关闭导致

    replacements=[Ljava.lang.String;@4192fea8HARDWARE=hw7d501lmatchers=[Ljava.lang.String;@4192fe28RADIO ...

  6. 表达式树ExpressionTree

    表达式树基础 转载需注明出处:http://www.cnblogs.com/tianfan/ 刚接触LINQ的人往往觉得表达式树很不容易理解.通过这篇文章我希望大家看到它其实并不像想象中那么难.您只要 ...

  7. jquery 图片懒加载

      jquery 图片懒加载 CreationTime--2018年7月1日14点45分 Author:Marydon 1.源码展示 (function(a){a.fn.lazyload=functi ...

  8. TypeScript 面向对象基础知识

    孙广东  2016.4.5 JavaScript如今到处都是.web.server(通过NodeJS).移动应用(通过各种框架).全部这些,TypeScript都能够使用,而且能够为JavaScrip ...

  9. 解析theme()

    drupal_render()只是对theme()的调用做了包装,真正做任务的还是theme(). function theme($hook, $variables = array()) { ... ...

  10. iOS 获得通讯录中联系人的所有属性--b

    ABAddressBookRef addressBook = ABAddressBookCreate(); CFArrayRef results = ABAddressBookCopyArrayOfA ...