java中的package/import概念

來源:互聯網
上載者:User

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. 解讀一下: 把功能相似或相關的類型組織在一起,即一個包中。包中的檔案,儲存在相同的目錄層次中,C++沒有對應的功能。註:類型指的是:類<class>、介面<interface>、枚舉<enum>、註解<annotation>。枚舉及註解在java中,是一種特別的類型或介面。
包方便類型的尋找和使用。一行import語句(import comm.animals.*),就可以使用包中所有對外開放的類型。
包能避免名字衝突,一個包就是一個獨立的名字空間,只要包內不重名就可以,當同時調用兩個不同包中相同類名的類時,應該加上包名加以區別。比C++的 namesapce爽多了。 包也限定了存取權限,擁有包存取權限的類才能訪問某個包中的類,包中非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_thirdmaowenl@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.javaimport comm.animals.Person;   //Package path:/home/maowenl/package_thirdpublic 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 existimport 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$




聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.