java中的package/import概念

Java使用包(package)这种机制是为了防止命名冲突,访问控制,提供搜索和定位类(class)、接口、枚举(enumerations)和注释(annotation)等。

  • Java 包的概念:

先看下官文文档的解释( Packages ) :

To make types easier to find and use, to avoid naming conflicts, and to control access, programmers bundle groups of related types into packages.


Definition: A package is a grouping of related types providing access protection and name space management. Note that types refers to classes, interfaces, enumerations, and annotation types. Enumerations and annotation types are special kinds of classes and interfaces, respectively, so types are often referred to in this lesson simply as classes and interfaces.

The types that are part of the Java platform are members of various packages that bundle classes by function: fundamental classes are injava.lang, classes for reading and writing (input and output) are injava.io, and so on. You can put your types in packages too.

解读一下:
  1. 把功能相似或相关的类型组织在一起,即一个包中。包中的文件,存储在相同的目录层次中,C++没有对应的功能。注:类型指的是:类<class>、接口<interface>、枚举<enum>、注解<annotation>。枚举及注解在java中,是一种特别的类型或接口。
  2. 包方便类型的查找和使用。一行import语句(import comm.animals.*),就可以使用包中所有对外开放的类型。
  3. 包能避免名字冲突,一个包就是一个独立的名字空间,只要包内不重名就可以,当同时调用两个不同包中相同类名的类时,应该加上包名加以区别。比C++的 namesapce爽多了。
  4. 包也限定了访问权限,拥有包访问权限的类才能访问某个包中的类,包中非public类,是包类私有的类,外部不可访问,C++提供不了类类型的访问限制,只能限止类内的成员函数或数据成员。


  • 一个例子(编译环境 ubuntu 命令行)

/* Main.java */ //默认包,没使用import语句,全路径访问其它包的类。从这里也能看出,import与include根本就是不一类东东,没法比
public class Main {
    public static void main(String[] args) {
        System.out.println("Enter ...");
        comm.my_package.MyClass myClass = new comm.my_package.MyClass();  //全路径访问:comm.my_package.MyClass
        myClass.dump();
    }
}


/*File name : MyClass.java */
package comm.my_package;     //此class属于comm.my_package包</span>
import comm.animals.Person ; //导入comm.animals包中的Person类,此文件即可直接使用Person。即包使得类型的使用更便利。

public class MyClass{
   Person mPerson = new Person();
   public void dump(){
      mPerson.eat();      
   }
}


/* 文件名 : Person.java */
package comm.animals;

public class Person implements Animal{
   public void eat(){
      System.out.println("Person eats");
   }

   public void travel(){
      System.out.println("Person travels");
   } 
} 

/* 文件名: Animal.java */
package comm.animals;

interface Animal {
   public void eat();
   public void travel();
}
编译:

编译所有源文件,本例子,源文件没有按包的层次结构存放

maowenl@enjoy:$ ls animals/
Animal.java  Main.java  MyClass.java  Person.java
maowenl@enjoy:$ javac -d build animals/*       


/运行,因为包的根目录在build目录下,所在要在build目录执行

maowenl@enjoy:$ cd build/; java Main                   
Enter ...
Person eats

查看生成的目录结构:
Person.class & Animal.class 属于comm.animals,所以都在comm/Animal目录下
MyClass.class 属于comm.my_package,所以都在comm/my_package目录下。
Main.class 属于默认包,放在了根目录,根目录为编译选项-d 指定的目录

maowenl@enjoy:$ find build/ -name "*.class"     
build/comm/animals/Person.class
build/comm/animals/Animal.class                       
build/comm/my_package/MyClass.class           
build/Main.class                                                        


maowenl@enjoy:$

  • IDE(intellij idea)中,源文件的组织,也是有层次结构的,这里就不说明了。


  • 如何引用第三方的package
  • 将第三方包放到指定目录

maowenl@enjoy:$ mkdir ~/package_third
maowenl@enjoy:$ cp -rf comm ~/package_third/
maowenl@enjoy:$ ls ~/package_third/comm/
animals  my_package

  • 引用第三方的包

/*File name : Main.java */    //Full    path: /home/maowenl/tmp/Main.java
import comm.animals.Person;   //Package path:/home/maowenl/package_third
public class Main {
    public static void main(String[] args) {
        
        Person myClass = new Person();
        myClass.eat();
    }
}

  • 编译

CLASSPATH环境变量。作用是指定类搜索路径,要使用已经编写好的类,前提当然是能够找到它们了,JVM就是通过CLASSPTH来寻找类的。我们需要把用得到的库设置到CLASSPATH中,当然,当前目录“.”也必须加入到该变量中,目录间以":"分隔。

maowenl@enjoy:~/tmp$ javac -d . Main.java 
Main.java:2: error: package comm.animals does not exist
import comm.animals.Person;
                   ^
Main.java:6: error: cannot find symbol
        Person myClass = new Person();
        ^
  symbol:   class Person
  location: class Main

找不到包路径:comm.animals.Person,在编译及运行时指定classpath或设置环境变量(CLASSPATH)即可。

  • 编译时指定classpath

maowenl@enjoy:~/tmp$ javac -d . -classpath /home/maowenl/package_third Main.java
maowenl@enjoy:~/tmp$ java -cp .:/home/maowenl/package_third  Main                
Enter ...
Person eats

  • 设置环境变量

maowenl@enjoy:~/tmp$ export CLASSPATH=.:/home/maowenl/package_third
maowenl@enjoy:~/tmp$ javac -d .  Main.java                            
maowenl@enjoy:~/tmp$ java Main
Enter ...
Person eats
maowenl@enjoy:~/tmp$




  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值