java中package(包)的使用理解

java中package(包)的使用理解

2017年02月05日 02:30:08 FengGLA 阅读数:17755 标签: java 更多

个人分类: java学习笔记

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/FengGLA/article/details/54869858

最近在学习java,在学习到对象和类这一部分时,接触了java中很重要的一个概念:package,也就是包。一开始对于package的使用我产生了许多疑惑,不仅是理论上的,在实际写代码的尝试中也出现了许多意想不到的错误。之后自己查阅了许多博客以及stackoverflow上的一些讲解,再结合编写代码试验,总算是稍微弄清楚了关于package的使用,在此为自己的理解做一个笔记。

package的简单定义如下:package是一个为了方便管理组织java文件的目录结构,并防止不同java文件之间发生命名冲突而存在的一个java特性。不同package中的类的名字可以相同,只是在使用时要带上package的名称加以区分。

在使用package的时候,如果java文件中使用了package,那么该java文件必须放在命名与package名称相同的目录下,比如:

 
  1. package test;

  2.  
  3. public class Test {}

该文件的目录结构则为:...test/Test.java

又如:

 
  1. package com.micheal.test

  2.  
  3. public class Test {}

java解释器会将package中的.解释为目录分隔符/,也就是说该文件的目录结构为:...com/micheal/test/Test.java

那么package中的类的访问权限是怎么样的呢?在同一package中的类是可以互相访问的,比如:

 
  1. //Test1.java

  2.  
  3. package test;

  4.  
  5. class Test1 {}

  6.  
  7. //Test2.java

  8.  
  9. package test;

  10.  
  11. public class Test2 {

  12. public static void main(String[] args) {

  13. Test1 t;

  14. }

  15. }

由于Test2与Test1在同一个package——test中,所以Test2能够直接调用Test1生成Test1的引用变量t;在命令行进行编译时,直接编译Test2.java即可:javac Test2.java(若没有进入Test1和Test2的目录,需在Test2前加上绝对路径)

若类在不同的package中,那么在一个类中要调用另一个package中的类(必须是public类,非public类不支持不同包间访问),需要在类名前明确加上package名称;不过,java中存在一个让java程序员偷懒的特性,叫做import关键字。使用import就可以在一个package中导入另一个package中的类,不过import和C语言和C++中的#include是不同的,import并不会在当前java文件中嵌入另一个package中的类的代码,只是告诉java文件,不属于该包的类能够到哪里去寻找而已:

 
  1. package p1;

  2.  
  3. //import p2.Test2

  4.  
  5. public class Test1 {

  6. public static void main(String[] args) {

  7. p2.Test2 t;//Test2 t if we import p2.Test2 before;

  8. }

  9. }

那么问题来了,java文件在编译时如何知道p2这个package在哪?这里要提到一个重要的变量:classpath。classpath是java在编译程序时查找类文件的路径,java编译器会在classpath中包含有的路径中查找java的类文件。

举个例子,比如说classpath的值(Windows下)是.(当前目录);C:/,那么编译器在查找类的时候,就只会在当前目录和C:/中查找。所以如果p2这个目录与p1在同一目录层次下,那么p2就能直接被查找到了,查找也就结束了;如果不在的话,比如说p1的目录结构是C:/document/java/project/p1,p2的目录结构是C:/document/java/test/p2,那么如果C:/document/java/test不在classpath中,java解释器是找不到p2这个package的位置的,那么就会提示错误,因此需要将C:/document/java/test加入到classpath中。

猜你喜欢

转载自blog.csdn.net/weixin_42082222/article/details/84567454