JavaSE入门学习17:Java面向对象之package(包)
? ? ? ?一Java包(package)
? ? ? ?為了更好地組織類,Java提供了包機制,用于差別類名的命名空間。
? ? ? ?包的作用:
? ? ? ?A把功能類似或相關的類或接口組織在同一個包中,方便類的查找和使用。
? ? ? ?B如同文件夾一樣。包也採用了樹形文件夾的存儲方式。同一個包中的類名字是不同的。不同的包中的類的名字是
能夠同樣的,當同一時候調用兩個不同包中同樣類名的類時,應該加上包名加以差別。因此。包能夠避免名字沖突。
? ? ? ?C包也限定了訪問權限。擁有包訪問權限的類才干訪問某個包中的類。
? ? ? ?Java使用包(package)這樣的機制是為了防止命名沖突,訪問控制。提供搜索和定位類(class)、接口、枚舉
(enumerations)和凝視(annotation)等。
? ? ? ?包語句的語法格式為:
? ? ? ?package pkg1[.pkg2[.pkg3…]];
? ? ? ?比如,一個Something.java 文件它的內容:
<span>package net.java.util;
public class Something{
//...
}</span>
? ? ? ?那么它的路徑應該是 net/java/util/Something.java 這樣保存的。
package(包)的作用是把不同的java程序分類保
存,更方便的被其它java程序調用。
? ? ? ?一個包(package)能夠定義為一組相互聯系的類型(類、接口、枚舉和凝視),為這些類型提供訪問保護和命名空間
管理的功能。
? ? ? 以下是一些Java中的包:
<span>1)java.lang包:java的核心類庫,包括了執行java程序不可缺少的系統類,如基本數據類型、基本數學函數、字符串 處理、線程、異常處理類等,系統缺省載入這個包。 2)java.io包:java語言的標準輸入/輸出類庫,如基本輸入/輸出流、文件輸入/輸出、過濾輸入/輸出流等等。3)java.util包:包括如處理時間的date類,處理變成數組的Vector類,以及stack和HashTable類。
4)java.awt包:構建圖形用戶界面(GUI)的類庫,低級畫圖操作Graphics類,圖形界面組件和布局管理如Checkbox 類、Container類、LayoutManger接口等,以及界面用戶交互控制和事件響應,如Event類。 5)java.awt.image包:處理和操縱來自于網上的圖片的java工具類庫。
6)java.wat.peer包:非常少在程序中直接用到。使得同一個java程序在不同的軟硬件平臺上執行。 7)java.applet包。 8)java.net包:實現網絡功能的類庫有Socket類、ServerSocket類。 9)java.corba包和java.corba.orb包。 10)java.lang.reflect包:提供用于反射對象的工具。 11)java.util.zip包:實現文件壓縮功能。 12)java.awt.datatransfer包:處理傳輸數據的工具類,包括剪貼板,字符串發送器等。 13)java.awt.event包。 14)java.sql包:實現JDBC的類庫。 15)java.rmi 提供遠程連接與載入的支持。
16)java.security 提供安全性方面的有關支持。
</span>
? ? ? ?開發人員能夠自己把一組類和接口等打包,并定義自己的package。并且在實際開發中這樣做是值得提倡的。當你
自己完畢類的實現之后。將相關的類分組,能夠讓其它的編程者更easy地確定哪些類、接口、枚舉和凝視等是相關
的。
? ? ? 因為package創建了新的命名空間(namespace),所以不會跟其它package中的不論什么名字產生命名沖突。
使用包這
種機制,更easy實現訪問控制,并且讓定位相關類更加簡單。
? ? ? ?二創建包
? ? ? ?創建package的時候,你須要為這個package取一個合適的名字。之后。假設其它的一個源文件包括了這個包提
供的類、接口、枚舉或者凝視類型的時候,都必須將這個package的聲明放在這個源文件的開頭。
? ? ? ?包聲明應該在源文件的第一行,每一個源文件僅僅能有一個包聲明,這個文件里的每一個類型都應用于它。假設一個源
文件里沒有使用包聲明,那么當中的類,函數,枚舉。凝視等將被放在一個無名的包(unnamed package)中。
? ? ? ?實例:
? ? ? ?讓我們來看一個樣例,這個樣例創建了一個叫做animals的包。通常使用小寫的字母來命名避免與類、接口名字的
沖突。
? ? ? ?在animals包中增加一個接口(interface):
<span>/* 文件名稱: Animal.java */
package animals;
interface Animal {
public void eat();
public void travel();
}</span>
? ? ? ?接下來,在同一個包中增加該接口的實現:
<span>/* 文件名稱 : Mammal.java */
package animals;
public class Mammal implements Animal{
public void eat(){
System.out.println("Mammal eats");
}
public void travel(){
System.out.println("Mammal travels");
}
public int noOfLegs(){
return 0;
}
}</span>
? ? ? ?然后。編譯這兩個文件:
? ? ? ?編譯后的文件夾:
? ? ? ?animals包中的字節碼文件(class文件):
? ? ? ?三importkeyword
? ? ? ?為了能夠使用某一個包的成員,我們須要在Java程序中明白導入該包。使用"import"語句可完畢此功能。
? ? ? 在java源文件里import語句應位于package語句之后。全部類的定義之前,能夠沒有。也能夠有多條,其語法格式
為:import package1[.package2…].(classname|*);
? ? ? 假設在一個包中,一個類想要使用本包中的還有一個類。那么該包名能夠省略。
? ? ? 實例:
? ? ? 以下的payroll包已經包括了Employee類,接下來向payroll包中增加一個Boss類。Boss類引用Employee類的時候
能夠不用使用payroll前綴,Boss類的實比例如以下:
<span>package payroll;
public class Boss{
public void payEmployee(Employee e){
e.mailCheck();
}
}</span>
? ? ? ?假設Boss類不在payroll包中又會如何?Boss類必須使用以下幾種方法之中的一個來引用其它包中的類:
? ? ? ?1)使用類全名描寫敘述,比如:
? ? ? ? payroll.Employee
? ? ? ?2)使用用importkeyword引入,使用通配符(*)
? ? ? ? import payroll.*;
? ? ? ?3)使用importkeyword引入Employee類
? ? ? ?import payroll.Employee;
? ? ? ?注意:
? ? ? ?類文件里能夠包括隨意數量的import聲明。import聲明必須在包聲明之后,類聲明之前。
? ? ? ?我們繼續接著來看創建包過程中的那個實例:
? ? ? ?我們再在源文件的文件夾下創建一個Test.java源文件:
<span>import animals.*;
public class Test{
public static void main(String[] args){
Mammal m=new Mammal();
m.eat();
m.travel();
}
}</span>
? ? ? ?編譯這個類出現例如以下問題:
<img src="http://img.blog.csdn.net/20160129165127110?
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="" />
? ? ? ?這就須要我們把創建animals包的兩個源文件刪除或者又一次移到別的文件夾下。我把它放在了source文件夾下:
? ? ? ?再次編譯Test.java源文件和執行字節碼文件:
? ? ? ?四package的文件夾結構
? ? ? ?類放在包中會有兩種基本的結果:
? ? ? ?A包名成為類名的一部分,正如我們前面討論的一樣。
? ? ? ?B包名必須與相應的字節碼所在的文件夾結構相吻合。
? ? ? ?以下是管理你自己java中文件的一種簡單方式:
? ? ? ?將類、接口等類型的源代碼放在一個文本中。這個文件的名字就是這個類型的名字,并以.java作為擴展名。
比如:
<span>//文件名稱 : Car.java
package vehicle;
public class Car {
//類實現
}</span>
? ? ? ?接下來,把源文件放在一個文件夾中,這個文件夾要相應類所在包的名字:....vehicleCar.java
? ? ? ?如今。正確的類名和路徑將會是例如以下樣子:
? ? ? ?類名 -> vehicle.Car
? ? ? ?路徑名 -> vehicleCar.java (in windows)
? ? ? ?通常,一個公司使用它互聯網域名的顛倒形式來作為它的包名.比如:互聯網域名是apple.com,全部的包名都以
com.apple開頭。包名中的每一個部分相應一個子文件夾。
? ? ? ?比如:這個公司有一個com.apple.computers的包。這個包包括一個叫做Dell.java的源文件,那么相應的。應該有
如以下的一連串子文件夾:....comapplecomputersDell.java
? ? ? ?編譯的時候。編譯器為包中定義的每一個類、接口等類型各創建一個不同的輸出文件,輸出文件的名字就是這個類
型的名字,并加上.class作為擴展后綴。 比如:
<span>// 文件名稱: Dell.java
package com.apple.computers;
public class Dell{
//
}
class Ups{
//
}</span>
? ? ? ?如今,我們用-d選項來編譯這個文件,例如以下:
javac -d . Dell.java
? ? ? ?這樣會像以下這樣放置編譯了的文件:
.comapplecomputersDell.class
.comapplecomputersUps.class
? ? ? ?你能夠像以下這樣來導入全部 comapplecomputers中定義的類、接口等:
import com.apple.computers.*;
? ? ? ?編譯之后的.class文件應該和.java源文件一樣。它們放置的文件夾應該跟包的名字相應起來。
可是,并不要求.class
文件的路徑跟相應的.java的路徑一樣。你能夠分開來安排源代碼和類的文件夾。
<path-one>sourcescomapplecomputersDell.java
<path-two>classescomapplecomputersDell.class
? ? ? ?這樣。你能夠將你的類文件夾分享給其它的編程人員,而不用透露自己的源代碼。用這樣的方法管理源代碼和類文件能夠
讓編譯器和java虛擬機(JVM)能夠找到你程序中使用的全部類型。
? ? ? ?類文件夾的絕對路徑叫做class path。設置在系統變量CLASSPATH中。編譯器和java虛擬機通過將package名字加
到class path后來構造.class文件的路徑。
? ? ? ?<path- two>classes是class path,package名字是com.apple.computers。而編譯器和JVM會在 <path-
two>classescomapplecompters中找.class文件。
? ? ? ?一個class path可能會包括好幾個路徑。多路徑應該用分隔符分開。
默認情況下,編譯器和JVM查找當前文件夾。
JAR文件按包括Java平臺相關的類,所以他們的文件夾默認放在了class path中。
? ? ? ?五設置CLASSPATH系統變量
? ? ? ?1)用以下的命令顯示當前的CLASSPATH變量:
? ? ? ?Windows平臺(DOS 命令行下)-> C:> set CLASSPATH
? ? ? ?UNIX平臺(Bourne shell下)-> % echo $CLASSPATH
? ? ? ?2)刪除當前CLASSPATH變量內容:
? ? ? ?Windows平臺(DOS 命令行下)-> C:> set CLASSPATH=
? ? ? ?UNIX平臺(Bourne shell下)-> % unset CLASSPATH; export CLASSPATH
? ? ? ?3)設置CLASSPATH變量:
? ? ? ?Windows平臺(DOS 命令行下)-> set CLASSPATH=C:usersjackjavaclasses
? ? ? ?UNIX平臺(Bourne shell下)-> % CLASSPATH=/home/jack/java/classes; export?CLASSPATH??
? ? ? ?關于包的理解眼下就這些了。有些地方還是不太理解,須要在以后的實踐中逐步加深對Java包的理解。錯誤的地
方請指出。
總結
以上是生活随笔為你收集整理的JavaSE入门学习17:Java面向对象之package(包)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 分享25个优秀的活动邀请网站设计案例
- 下一篇: RTMP、RTSP、HTTP视频协议详解