JAVA基礎(chǔ) (包 與 Java API) 第二天 第四天
建立Java包,布局源文件和設(shè)置classpath參數(shù)之間相互影響。也相互關(guān)聯(lián)。正確建立和導(dǎo)入JAVA包,合理布局源文件,準(zhǔn)確設(shè)置CLASSPATH參數(shù),才能保證應(yīng)用程序順利執(zhí)行,并有效管理應(yīng)用程序。
包的建立方法
Java包通過package語句建立,基本語法是:
package cn.edu.jmu.graphis;
在定義類或接口的源文件開始處,通過package語句,可以將相應(yīng)的類或接口放入package所聲明的包里。包是相關(guān)類和接口的集合,提供了訪問級(jí)別控制和命名控件管理。
包的使用方法
每個(gè)源文件只能有一個(gè)包聲明,并且一定要求放在源文件的開始位置。如果一個(gè)源文件沒有包語句,則源文件所定義的類或接口唄系統(tǒng)放入默認(rèn)包中。包有層次,層次間由點(diǎn)分隔。
例如有一組與圖形相關(guān)的類,包括Circles,Rectangles,Lines和points類等,描述了畫圖所用到的各種圖形組件,另有抽象類Graphic標(biāo)識(shí)圖形組件的共性,接口Draggable表示用戶可以通過鼠標(biāo)拖拽成圖的圖形組件。在這種情況下,我們不僅需要,而且也應(yīng)該將這些相關(guān)類和接口組成包,可命名為graphics如:
//Graphics.java
package graphics;
public abstract class Graphic{
...
}
//Circle.java
package graphics;
public class Circle extends Graphic implements Draggable {
...
}
//Rectangle.java
package graphics;
public class Rectangle extends Graphic implements Draggable {
...
}
//Draggable.java
package graphics;
public interface Draggable{
...
}
通過創(chuàng)建和使用包,程序員不僅可以很容易地確定哪些類和接口是相關(guān)的,也可以很容易地找到提供特定功能的類和接口,例如,與畫圖有關(guān)的類和接口在graphics包中。
包的訪問權(quán)限
通過聲明類的訪問級(jí)別,可以控制對(duì)類的訪問權(quán)限。
類的訪問級(jí)別分為默認(rèn)級(jí)和public級(jí)。定義類的默認(rèn)訪問級(jí)別不需要任何關(guān)鍵字,唄聲明為默認(rèn)級(jí)的類只對(duì)同一個(gè)包中的類是可視的。也就是說只有同一個(gè)包內(nèi)的類實(shí)例可以訪問這個(gè)類,外界不能訪問它。如果用關(guān)鍵字public定義類,不但同一個(gè)包里的其他類可以訪問這個(gè)類,其他包中的類也可以訪問它。換句話說,同一個(gè)包中的類,相互之間有不受限制的訪問權(quán)限。而在不同包中,只有public類可以被訪問。
public修飾符不知用于定義類的訪問控制級(jí)別,也可以應(yīng)用于接口,方法或變量。public 接口同public類一樣,可以由應(yīng)用程序中的任何類訪問。而public方法或public屬性對(duì)任何可以訪問他的類或接口都是可視的。
除public修飾符之外,用于訪問控制的修飾符還有protected 和 private。
protected 或 private 僅用來定義方法或變量的訪問控制級(jí)別。protected 方法或protected變量?jī)H對(duì)同一個(gè)包內(nèi)的類或不同包中的子類來說是可視的。
private方法和pvivate變量對(duì)外部定義的類均不可視。
包的命名方式
包提供了心的命名控件,即使所定義的類使用與其他包中的類相同的名字,只要包類所屬的包不同名,就不會(huì)引起沖突。原因是這些類的全程限定名稱不同。類的全程限定包含了類的各層包名。這實(shí)質(zhì)上是應(yīng)用了面向?qū)ο蟮母拍睿瑢㈩惙庋b入包中。
包的訪問權(quán)限
通過聲明類的訪問級(jí)別,可以控制對(duì)類的訪問權(quán)限。
類的訪問級(jí)別分為默認(rèn)級(jí)和public級(jí)。定義類的默認(rèn)訪問級(jí)別不需要任何關(guān)鍵字,貝聲明為默認(rèn)級(jí)的類只對(duì)同一個(gè)包中的類是可視的。也就是說,只有同一個(gè)包內(nèi)的類實(shí)例可以訪問這個(gè)類,外界不能訪問它。如果用關(guān)鍵字public 定義類,不但同一個(gè)包里的其他類可以訪問這個(gè)類,其他包中的類也可以訪問它。換句話說,同一個(gè)包中的類,相互之間有不受限制的訪問權(quán)限。而在不同的包中,只有public類可以被訪問。
public 修飾符不只用于定義類的訪問控制級(jí)別,也可以應(yīng)用于接口,方法和變量。public接口同public類一樣,可以由應(yīng)用程序中的任何類訪問。而public方法或public變量對(duì)任何可以訪問他的類或接口都是可視的。
除public 修飾符之外,用于訪問控制的修飾符還有 protected 和private 。 protected或private僅用來定義方法或變量的訪問控制級(jí)別。protected方法或protected變量?jī)H對(duì)同一個(gè)包內(nèi)的類或不同包中的子類來說是可視的。private方法和private變量對(duì)外部定義的類均不可視。需要說明的是,通常不建議用默認(rèn)方式定義方法或成員變量的訪問級(jí)別。
對(duì)于沒有指定包名的java源文件,系統(tǒng)認(rèn)為他們都屬于同一個(gè)默認(rèn)的包。如果沒有把自己的Java類放入某個(gè)包中,那么任何默認(rèn)包里的對(duì)象都可以訪問它,并且不局限于同一個(gè)子目錄下,因此通常應(yīng)該在每個(gè)Java源文件的項(xiàng)目頂部使用 package語句,指明它所屬的包。
訪問包成員
對(duì)于包來說,只有它的public成員可貝外界訪問。若外界想要訪問包的public類,有3種方式可以實(shí)現(xiàn)。
(1)通過類的全程限定名訪問該類。
(2)通過import語句導(dǎo)入該類。
(3)通過import語句導(dǎo)入整個(gè)包。
如果某個(gè)類只貝訪問一次,那么可以直接使用類的全名。例如訪問cn.edu.jmu.graphics.Graphic類可以用一下方式:
cn.edu.jmu.graphics.Graphic aGraph = new cn.edu.jmu.graphics.Graphic();
這條語句創(chuàng)建了 cn.edu.jmu.graphics.Graphic類型的對(duì)象 aGraph。
可以看到,即是指創(chuàng)建一個(gè)對(duì)象,在變量定義和初始化時(shí)也用到兩次全名。當(dāng)使用Java約定的包命名方式時(shí),包名可能過長,此時(shí)用起來就更顯得繁瑣,容易出錯(cuò),也影響可讀性。
通常都應(yīng)該使用import語句直接導(dǎo)入所需類,或者導(dǎo)入該類所在的包。導(dǎo)入之后,程序中設(shè)計(jì)的這個(gè)類的地方就可以直接用類名訪問。
import 的基本語法形式為:
import <包名>[.<子包名>].<類名>; //導(dǎo)入指定類
或者:
import <包名>[.<子包名>].*; //導(dǎo)入整個(gè)包
例如:
import cn.edu.jmu.javaprogs.Timel;
import cn.edu.jmu.javaprogs.*;
import java.awt.*;
import java.awt.event.*;
import語句在package 語句之后,所有的類聲明之前。由于集中在程序首部,宜于直觀地了解程序所需的包,有助于維護(hù)程序的可移植性。
import 語句中的 * 用來匹配包中的所有類,但并不能用來匹配包中的所有類的某個(gè)子集。如語句
import java.awt.*;
導(dǎo)入java.awt包中的所有類。如果這樣的語句
import java.awt.A*;
它無法導(dǎo)入java.awt句中首字母為A的所有子類,相反還會(huì)出現(xiàn)編譯錯(cuò)誤,也就是說,使用import語句一次只能導(dǎo)入包的單一成員,或者導(dǎo)入整個(gè)包。
還有語句
import java.awt.*;
所導(dǎo)入的是java.awt包中的所有類,它包括接口。但不包括java.awt包中的子包。如果需要訪問java.awt.event子包中的類,仍需要用 import語句導(dǎo)入 java.awt.event子包。所以常常使用如下形式:
import java.awt.*;
import java.awt.event.*;
包的布局
類的全程受名稱與類所在目錄一一對(duì)應(yīng),例如:
import graphics.Rectangle 等同于文件路徑名:
Graphics\Rectangle.java
classpath參數(shù)
classpath參數(shù)用于設(shè)置Java包所在的頂級(jí)目錄。也就是說,通過classpath可以為Java包建立所依存的目錄列表。編譯和運(yùn)行Java 程序時(shí),系統(tǒng)會(huì)自動(dòng)從classpath環(huán)境變量中讀取包所在的目錄,文件所在目錄由系統(tǒng)通過classpath中的目錄和package語句中定義的目錄合成。
下面通過一個(gè)完整的實(shí)例程序,說明classpath參數(shù)的作用,同時(shí)展示源文件和字節(jié)碼文件的一種建議布局模式。
程序包含兩個(gè)類 Time 和 TestTime,TestTime為主類。程序?qū)τ脩糨斎氲谋硎拘r(shí)、分鐘和秒鐘的3個(gè)整型數(shù),經(jīng)過數(shù)據(jù)正確性驗(yàn)證,分別轉(zhuǎn)換為通用時(shí)間表示格式和標(biāo)準(zhǔn)時(shí)間表示格式,通過對(duì)話框顯示給用戶,運(yùn)行后如圖:
文件布局方式如下:創(chuàng)建 d:\javaSample 目錄存放java程序,創(chuàng)建 d:\javaSample\src 子目錄存放源文件,創(chuàng)建d:\javaSample\class 子目錄存放編譯后的字節(jié)碼文件。 具體實(shí)現(xiàn)方式是將文件 TestTime.java 存放在 D:\javaSample\src 子目錄下,為使 src 子目錄的結(jié)構(gòu)與 class 子目錄結(jié)構(gòu)相對(duì)應(yīng),創(chuàng)建 D:\javaSample\src\cn\edu\jmu\timer 子目錄存放 Time.java文件。類Time和類TestTime的布局如圖:
Time.java中的語句
package cn.edu.jmu.timer;
將Time類放入包c(diǎn)n.edu.jmu.timer中,源文件Time.java存放在與包相對(duì)應(yīng)的目錄結(jié)構(gòu)下。在類TestTime.java中通過語句 import cn.edu.jmu.timer.Time; 導(dǎo)入Time類。
需要設(shè)置classpath參數(shù),規(guī)定程序中的包 cn.edu.jmu.timer 編譯所依存的頂級(jí)目錄為 d:\javaSample\class,如:
set classpath = d:\javaSample\class;
編譯:
javac -d d:\javaSample\class
d:\javaSample\src\cn\edu\jmu\timer\Time.java
javac -d d:\javaSample\class d:\javaSample\src\TestTime.java
運(yùn)行:
java TestTime
posted on 2008-08-03 00:40 程序手記 閱讀(358) 評(píng)論(0) 編輯 收藏