Java中的包(package)和类路径的说明

   我看书的时候,有个疑问,写在最前面记录一下。书中是这么说的,编译器在编译源文件的时候不检查目录结构。例如,假定有一个源文件开头有下列语句:

      package com.mycompany;

     即使这个源文件不在子目录com/mycompany下,也可以进行编译。如果它不依赖于其他包,就不会出现编译错误。但是,最终的程序将无法运行,这是因为虚拟机找不到类文件。(对于这部分我不是很懂,class文件不是就在那里吗,怎么就不能执行了,我自己试了一下的确如此。一定要目录结构对准,和用java来加载类的时候,必须用完整包名,即com.mycompany.xx来执行。)   

    Java允许使用包将类组织起来。借助于包可以方便地组织自己的代码,并将自己的代码与别人提供的代码库分开管理。使用包的主要原因是确保类名的唯一性。同名的类放置在不同的包中,就不会产生冲突。如同硬盘的目录嵌套一样,也可以使用嵌套层次组织包。

   为了保证包名的绝对唯一性,Sun公司建议将公司的因特网域名以逆序的形式作为包名,并且对于不同的项目使用不同的子包。所以,我们经常在类库中看到一堆包名像这样的:com.sun和org.apache等等。

  这里我要说明一下的就是不要认为import与C/C++中的#include是相同作用的。其实,java编译器可以查看其他文件的内部,所以根本不需要把文件的内容include进来,因此java不需要include机制,而只要告诉类文件在哪里就可以了。

   其实,import语句唯一的好处是简捷。这说明我们完全可以不用import语句来写出所有程序,只不过这样会很麻烦而已。其实,Java的包机制与C++的命名空间(namespace)非常类似,都是用来防止重名冲突的。在Java中,package和import语句类似于C++中的namespace和using 指令。

  注意,从编译器的角度来看,嵌套的包之间没有任何关系、例如,java.util包和java.util.jar包毫无关系。每一个都拥有独立的类集合。

 还有,只要使用星号(*)来导入一个包,而不能使用import java.*来导入以java为前缀的所有包。而且,如果要同时使用两个类名相同的类,只能在使用的时候给出类的完整包名。

在包中定位类是编译器的工作。因此,class文件中的字节码是使用完整的包名来引用其他的类。这样JVM就会直接根据这个包名来找到对应的class文件。

import语句不仅可以导入类,还可以导入静态方法和静态域。例如通过import static java.lang.System.*;就可以使用System类的静态方法和静态域,而不必加类名前缀。

接着说下包作用域。标记为public的部分可以被任意的类使用。而如果没什么修饰符都没写,这个部分(类、方法和变量)就只可以被同一个包的所有方法访问。所以说,对于一个包,只有public的类才可以被其他包的类访问,其他的非公有类,你import了也没用!

JAR文件使用ZIP格式组织class文件和目录。

 类路径就是Java编译器和JVM寻找class文件的默认路径。通常有:基目录/home/user/classdir、当前目录(.)和JAR文件目录/home/user/archives/archive.jar等等。

你可能感兴趣的:(Java基础学习总结)