包是一個(gè)文件夾散休,它是類的一種特殊性質(zhì)单鹿,可以更合理的管理大量的類文件馏予,設(shè)置他人對(duì)類成員的訪問權(quán)等天梧。
在Java開發(fā)大型項(xiàng)目時(shí),通常要把類分門別類地存到文件夾里霞丧,在將這些文件夾一起編譯執(zhí)行呢岗,這樣的程序代碼更易于維護(hù)。同時(shí)將類分割開后蛹尝,對(duì)于類的使用也就有了相應(yīng)的訪問權(quán)限后豫。
包(package)的基本概念
當(dāng)一個(gè)大型程序由多個(gè)不同的組別或人員共同開發(fā)時(shí),不可能保證每個(gè)人寫的類名稱是完全不同的突那,這樣一來就可能出現(xiàn)同文件覆蓋的問題挫酿。那么為了解決這樣的麻煩確保程序可以正常運(yùn)行,就必須通過使用package關(guān)鍵字來幫忙愕难。所謂的包(package)指的就是一個(gè)文件夾早龟,即在不同的文件夾之中可以保存同名的類文件。
包的使用方法:在類或接口當(dāng)然最上面一行加上package的聲明猫缭。通常包全部用小寫字母命名葱弟。
package package 名稱[.package 名稱2.package 名稱3…];
程序中如果有package語句,該語句一定是源文件中第一條可執(zhí)行語句猜丹,它的前面只能有注釋或空行芝加。另外一個(gè)文件中最多只能有一條package語句。
經(jīng)過package的聲明之后居触,同一文件內(nèi)的接口或類就都會(huì)被保存在相同的package中妖混。
包的名字有層次關(guān)系老赤,各層以點(diǎn)分隔轮洋。包層次必須與Java開發(fā)系統(tǒng)的文件系統(tǒng)結(jié)構(gòu)相同。
若包聲明如下:package java.awt.a抬旺,則文件中的接口和類都存放在…java\awt\a目錄下弊予。
package的使用
package demo.java; //聲明package,相當(dāng)于將Perso類和TestPerson1類放入demo\java文件夾之下
class Person
{
public String talk()
{
return"Person>>>>talk()";
}
}
class TestPackage1
{
public static void main(String args[])
{
System.out.println(new Person().talk());
}
}
包的導(dǎo)入
使用包可以將功能相似的若干類保存在一個(gè)文件目錄之中开财,但這樣一來就有可能出現(xiàn)包之間的互相訪問問題汉柒,當(dāng)一個(gè)程序需要其他包中類的時(shí)候可以通過import完成導(dǎo)入操作。package導(dǎo)入方法如下
import package 名稱.類名稱;
若某個(gè)類需要被訪問時(shí)责鳍,則必須把這個(gè)類公開出來碾褂,即此類必須聲明public。通過import命令历葛,可將某個(gè)package內(nèi)的整個(gè)類導(dǎo)入正塌,后續(xù)程序可直接使用類名稱嘀略,而不用再寫上被訪問的package的名稱。
若在不同的package中存在相同類名的public類乓诽,若要訪問某個(gè)public類的成員時(shí)帜羊,
在程序代碼內(nèi)必須明確指明“被訪問package的名稱.類名稱”。
包的導(dǎo)入使用范例
package demo.java.a;
public class Person
{
public String talk() //類中的方法
{
return "Person>>>talk()";
}
}
//聲明一個(gè)demo.java.b包 并調(diào)用demo.java.a中的類方法
package demo.java.b;
import demo.java.a.Peraon;
//將demo.java.a包中的Person類導(dǎo)入此包中
class TestPerson2
{
public static void main(String args[])
{
//調(diào)用demo.java.a中的方法并輸出
System.out.println(new Person().talk());
}
}
第一句聲明一個(gè)demo.java.b包將TestPerson2類放入此包中鸠天。
第二句使用import語句讼育,將demo.java.a包中的Person類導(dǎo)入到此包中。
最后一句調(diào)用demo.java.a包中的Person類中的talk()方法稠集。
提示:如果一個(gè)項(xiàng)目中有幾百個(gè)類時(shí)奶段,為了方便導(dǎo)入可以使用“包.”的形式完成。雖然使用的是“包.”剥纷,但實(shí)際上并不表示此包之中所有類都會(huì)被導(dǎo)入忧饭,導(dǎo)入的時(shí)候也只是導(dǎo)入所需要的類,不需要的類是不會(huì)有任何加載的筷畦,所以分開導(dǎo)入和使用“*”導(dǎo)入從性能上講是完全一樣的词裤。
上面程序也可以寫成如下形式:
package demo.java.b;
class TestPerson3
{
public static void main(String args[])
{
//在程序中將寫出所用類的具體位置
System.out.println(new demo.java.a.Person().talk());
}
}
程序中沒有使用import語句,但是使用Person類
的時(shí)候使用了“包名.類名”的方式鳖宾,所以在程序中也可以使用此方法來使用
非本類所在包中的類吼砂。
很多時(shí)候有可能在程序開發(fā)之中導(dǎo)入的包里面有同名的類,則這個(gè)時(shí)候再使用類的話就
必須寫上類的完整名稱“包名.類名”才可以正確操作鼎文。
JDK中常見的包
包名 | 描述 |
---|---|
java.lang | java.lang包含一些java語言的核心類渔肩,如String,Math拇惋,Integer周偎,System和Thread,提供常用功能撑帖。在java.lang包中還有一個(gè)子包:java.lang.reflect蓉坎,用于實(shí)現(xiàn)java類的反射機(jī)制(Java1.2以后所有版本中java.lang這個(gè)包會(huì)自動(dòng)導(dǎo)入,對(duì)于其中的類胡嘿,不需要使用import語句來導(dǎo)入蛉艾,如System類)。 |
java.awt | java.awt包含構(gòu)成抽象窗口工具集(abstract window toolkits)的多個(gè)類衷敌,這些類被用來構(gòu)建和管理應(yīng)用程序的圖形用戶界面(GUI)勿侯。 |
avax.swing | avax.swing此包用于建立圖形用戶界面,包含的組件相對(duì)于java.awt包而言是輕量級(jí)組件缴罗。 |
java.applet | java.applet包含applet運(yùn)行所需要的一些類助琐。可以實(shí)現(xiàn)圖形繪制面氓、字體和顏色控制兵钮、動(dòng)畫和聲音的插入沟堡、人機(jī)交互及網(wǎng)絡(luò)交流等功能.Apple還提供各種名為抽象窗口工具箱 |
java.net | java.net包含執(zhí)行與網(wǎng)絡(luò)相關(guān)的操作的類。 |
java.io | java.io包含能提供多種輸入/輸出功能的類矢空。 |
java.util | java.util包含一些實(shí)用工具類航罗,如定義系統(tǒng)特性與日期日歷相關(guān)的方法。 |
導(dǎo)入一個(gè)Applet程序所需要的包
package demo.java; //聲明包demo.java
import java.applet.*; //導(dǎo)入java.applet中所有包
import java.awt.*; //導(dǎo)入java.awt中所有包
public class MyApplet extends Applet //聲明一個(gè)MyApplet類繼承Applet類屁药。
{
public void paint(Graphics g)
{
g.drawString("世界粥血,你好!",30,30); //輸出一行字酿箭,調(diào)用Java中自帶的方法在圖形化窗口輸出一行字
g.drawLine(50,50,100,100); //畫一條線复亏,調(diào)用Java中自帶的方法在圖形化窗口輸出一條線段
}
}
第2,3行導(dǎo)入實(shí)現(xiàn)小窗口應(yīng)用程序的包缭嫡。
Applet程序必須繼承一個(gè)Applet類缔御,Java是單繼承局限,所以此程序不會(huì)在用了妇蛀。Applet程序和Application程序有一個(gè)最大區(qū)別:Applet不是依靠主方法運(yùn)行耕突,而Application是依靠主方法運(yùn)行的,Applet已經(jīng)成為了一個(gè)過去评架。
類成員的訪問控制權(quán)限
Java中四種訪問控制權(quán)限眷茁,private,default纵诞,protected上祈,public。
private:如果一個(gè)成員方法或成員變量名前使用private訪問控制符浙芙,那么這個(gè)成員只能在這個(gè)類內(nèi)部使用登刺。
default:如果一個(gè)成員方法或成員變量名前沒有使用任何訪問控制符,那么這個(gè)成員擁有的是默認(rèn)的(default)訪問控制符嗡呼。默認(rèn)的訪問控制成員可以被這個(gè)包中的其他類訪問纸俭。如果一個(gè)子類與其父類位于不同包中,子類也不能訪問父類中的默認(rèn)訪問控制成員晤锥。
protected:如果一個(gè)成員方法或成員變量名前使用protected訪問控制符掉蔬,那么這個(gè)成員既可以被同一個(gè)包中的其他類訪問,也可以被不同包中的子類訪問矾瘾。
public:如果一個(gè)成員方法或成員變量名前使用了public訪問控制符,那么這個(gè)成員可以被所有的類訪問箭启,不管類與被訪問類是否在同一個(gè)包中壕翩。
權(quán)限 | private | default | protected | public |
---|---|---|---|---|
同一類 | √ | √ | √ | √ |
同一包中的類 | √ | √ | √ | |
不同包的子類 | √ | √ | ||
其他包中的類 | √ |
類成員的訪問控制權(quán)限使用范例
范例1
package demo.java.b;
import demo.java.a.*; //通過導(dǎo)入demo.java.a.*;而導(dǎo)入所需要的Person類
public class Student extends Person
{
public Student(String name)
{
this.name=name; //Stude類訪問Person類中的name屬性
}
public String talk()
{
return "Person>>talk(),"+this.name;
}
}
范例
package demo.java.c;
import demo.java.b.*;
class TestPackage
{
public static void main(String args[])
Student s=new Student("javafans");
s.name="javafans"; //通過對(duì)象調(diào)用受保護(hù)的屬性
System.out.println(s.talk());
}
}
Java命名規(guī)范
JDK中類的聲明傅寡,方法的聲明放妈,常量的聲明有一定規(guī)律
1北救,包名中的字母一律小寫,如demo.java芜抒。
2珍策,類名、接口名應(yīng)當(dāng)使用名詞宅倒,每個(gè)單詞首字母大寫攘宙。如TestPerson。
3拐迁,變量名(屬性名)第一個(gè)單詞小寫蹭劈,后面單詞的首字母大寫。如newLxh线召。
4铺韧,方法名的第一個(gè)單詞小寫,后面每個(gè)單詞大寫缓淹,如talkMySelf()哈打。
5,常量名中的每個(gè)字母一律大寫讯壶,如COUNTRY前酿。
打包工具>>>jar命令的使用
jar文件即java archive file的縮寫,其應(yīng)用與Java息息相關(guān)鹏溯。jar文件就是一種壓縮文件罢维,與常見的ZIP壓縮文件格式兼容,習(xí)慣上稱之為jar包丙挽。如果開發(fā)者開發(fā)了許多類肺孵,當(dāng)需要把這些類提供給用戶時(shí),通常都會(huì)將這些類壓縮到j(luò)ar文件中颜阐,以jar包的方式提供給用戶使用平窘。只要?jiǎng)e人的classpath環(huán)境變量的設(shè)置中包含這個(gè)jar文件,Java虛擬機(jī)就能自動(dòng)在內(nèi)存中解壓這個(gè)jar文件凳怨,把這個(gè)jar文件當(dāng)做一個(gè)目錄瑰艘,在這個(gè)jar文件中去尋找所需要的類名及包名所對(duì)應(yīng)的目錄結(jié)構(gòu)。
jar命令是Java中提供的一個(gè)非常有用的一個(gè)命令肤舞,可以用來對(duì)大量的類(.class文件)進(jìn)行壓縮紫新,然后存為.jar文件。jar壓縮文件可以方便管理大量的類文件李剖,芒率,進(jìn)行壓縮也減少了文件所占的空間。
只要在命令行中使用以下命令就可以將一個(gè)包打成一個(gè)jar文件篙顺。
jar-cvf create.jar demo
-c:創(chuàng)建新的存檔
-v:生成詳細(xì)輸出到標(biāo)準(zhǔn)輸出上偶芍。
-f:指定存檔文件名充择。
create.jar:是生成jar文件的名稱。
demo:要打成jar文件的包
單例設(shè)計(jì)模式
package demo.java.b
class Singleton
{
private static Singleton inst=new Singleton(); //實(shí)例化對(duì)象
private Singleton(){} //此時(shí)類中不會(huì)再生成無參的什么都不做的構(gòu)造
public static Singleton getInst()
{
return inst;
}
public void print()
{
System.out.println("HelloWorld");
}
}
class Test1
{
public static void main(String args[])
{
Singleton inst=null; /聲明對(duì)象
inst=Singleton.getainst();
inst.print();
}
}
如果想要產(chǎn)生類的實(shí)例化對(duì)象匪蟀,那么一定要調(diào)用構(gòu)造方法椎麦,如果把一個(gè)類的構(gòu)造方法卡死了,那么就表示外部無法調(diào)用此構(gòu)造材彪,就意味著外部無法產(chǎn)生實(shí)例化對(duì)象观挎。同時(shí)在類內(nèi)部定義的本類實(shí)例化對(duì)象使用的是static定義,static特點(diǎn)是在全局?jǐn)?shù)據(jù)區(qū)之中保存查刻,是一個(gè)公共屬性键兜。那么不管外部聲明多少個(gè)對(duì)象實(shí)際上只是取得了唯一的一個(gè)實(shí)例化對(duì)象。這樣的設(shè)計(jì)模式稱之為單例設(shè)計(jì)模式穗泵。
多例設(shè)計(jì)模式
多例設(shè)計(jì)模式指的是一個(gè)類可以定義指定多個(gè)對(duì)象普气,不管是單例還是多例,構(gòu)造方法都不可以使用public定義佃延。
public demo.java.d;
classSex //性別
{
private String title; //保存信息
private static final Sex MALE=new Sex("男");
private static final Sen FEMALE=new Sen("女");
private Sex(String title)
{
this.title=title;
}
public static Sex getInst(int ch)
{
switch(ch)
{
case 0:
return MALE;
case 1:
return FEMALE;
default:
return null;
}
}
public String toString()
{
return this.title;
}
}
public class Test
{
public static void main(String args[])
{
System.out.println(Sex.getInst(0));
}
}