4對(duì)象與類
- 面向?qū)ο蟪绦蛟O(shè)計(jì)
- 如何創(chuàng)建標(biāo)準(zhǔn)java類庫(kù)中的類對(duì)象
- 如何編寫(xiě)自己的類
4.1概述
- 程序由對(duì)象構(gòu)成,每個(gè)對(duì)象包含對(duì)用戶公開(kāi)的特定功能部分和隱藏的實(shí)現(xiàn)部分洛史。一些對(duì)象來(lái)自于標(biāo)準(zhǔn)庫(kù)虹菲,一些是自定義的掉瞳。在OOP中陕习,不必關(guān)心對(duì)象的具體實(shí)現(xiàn)该镣,只要能滿足用戶需求即可损合。
.1類
- 類(class)是構(gòu)造對(duì)象的模板或藍(lán)圖嫁审。由類構(gòu)造(construct)對(duì)象的過(guò)程稱為創(chuàng)建類的實(shí)例(instance)律适。用java編寫(xiě)的所有代碼都位于某個(gè)類的內(nèi)部捂贿。
- 封裝(encapsulation)厂僧,將數(shù)據(jù)和行為組合在一個(gè)包中颜屠,并對(duì)對(duì)象的使用者隱藏了數(shù)據(jù)的實(shí)現(xiàn)方式汽纤。
- 對(duì)象中的數(shù)據(jù)稱為實(shí)例域(instance field)蕴坪,操縱數(shù)據(jù)的過(guò)程稱為方法(method)背传。
- 實(shí)現(xiàn)封裝的關(guān)鍵在于絕對(duì)不能讓類中的方法直接地訪問(wèn)其他類的實(shí)例域径玖。程序僅通過(guò)對(duì)象的方法與對(duì)象數(shù)據(jù)進(jìn)行交互梳星,即“黑盒”特性。
- 可以通過(guò)拓展一個(gè)類來(lái)建立一個(gè)新的類辕近,所有類都來(lái)自于一個(gè)超類Object移宅。通過(guò)拓展一個(gè)類來(lái)建立另一個(gè)類的過(guò)程稱為繼承(inheritance)漏峰。
.2對(duì)象
- OOP中浅乔,對(duì)象的三個(gè)主要特征:
- 對(duì)象的行為(behavior):可以對(duì)對(duì)象施加哪些操作童擎,或可以對(duì)對(duì)象施加哪些方法
- 對(duì)象的狀態(tài)(state):當(dāng)施加那些方法時(shí)顾复,對(duì)象如何響應(yīng)
- 對(duì)象標(biāo)識(shí)(identify):如何辨別具有相同行為和狀態(tài)的不同對(duì)象
- 每個(gè)對(duì)象都包含著描述當(dāng)前特征的信息芯砸,即對(duì)象的狀態(tài)。狀態(tài)是非自發(fā)的动羽,對(duì)象狀態(tài)的改變必須通過(guò)調(diào)用方法實(shí)現(xiàn)运吓,如若不然拘哨,則封裝性受到破壞倦青。作為一個(gè)類的實(shí)例,每個(gè)對(duì)象的標(biāo)識(shí)永遠(yuǎn)是不同的,狀態(tài)也經(jīng)常存在差異贾虽。
.3識(shí)別類
- 首先從設(shè)計(jì)類開(kāi)始,然后再往每個(gè)類中添加方法菇肃。
.4類之間的關(guān)系
- 在類之間,最常見(jiàn)的關(guān)系有:
- 依賴(uses-a)
- 聚合(has-a)
- 繼承(is-a)
- 依賴(dependence):如果一個(gè)類的方法操控另一個(gè)類的對(duì)象取募,我們就說(shuō)一個(gè)類依賴于另一個(gè)類琐谤。應(yīng)該盡可能將相互依賴的關(guān)系減至最少,即讓類之間的耦合度最小玩敏。
- 聚合(aggregation):類A的對(duì)象包含類B的對(duì)象斗忌。
- 繼承(inheritance):是用于表示特殊與一般關(guān)系的。
4.2使用預(yù)定義類
.1對(duì)象與對(duì)象變量
- 要想使用對(duì)象旺聚,就必須首先構(gòu)造對(duì)象,并指定其初始狀態(tài)砰粹。然后唧躲,對(duì)對(duì)象應(yīng)用方法。
- 在java語(yǔ)言中碱璃,使用構(gòu)造器(constructor)構(gòu)造新實(shí)例弄痹。構(gòu)造器名應(yīng)該與類名相同。
- 例如:
new Name();
- 通常將對(duì)象存放在一個(gè)變量中:
Name name = new Name();
嵌器,以便多次使用肛真。 - 定義對(duì)象變量之后,必須先初始化爽航,才可以引用對(duì)象/應(yīng)用方法蚓让。
- 一個(gè)對(duì)象變量并沒(méi)有實(shí)際包含一個(gè)對(duì)象,而僅僅引用一個(gè)對(duì)象岳掐。在Java中凭疮,任何對(duì)象變量的值都是對(duì)存儲(chǔ)在另一個(gè)地方的一個(gè)對(duì)象的引用。new操作的返回值也是一個(gè)引用串述。
- 局部變量不會(huì)自動(dòng)地初始化為null执解,而必須通過(guò)調(diào)用new或?qū)⑺鼈冊(cè)O(shè)置為null進(jìn)行初始化。
- 所有Java對(duì)象都存儲(chǔ)在堆中。
.2Java類庫(kù)中的GregorianCalendar類
- 紀(jì)元(epoch)衰腌,UTC時(shí)間新蟆,1970年1月1日00:00:00
- Date類表示時(shí)間點(diǎn),GregorianCalendar類表示日歷右蕊。
- Date可以使用before/after方法表示早于/晚于:
today.before(birthday)
- GregorianCalendar構(gòu)造器表達(dá)式:
new GregorianCalendar();
new GregorianCalendar(1999, 11, 31);//年月日
new GregorianCalendar(1999, Calendar.DECEMBER, 31);//常量
new GregorianCalendar(1999, Calendar.DECEMBER, 31, 23, 59, 59);//時(shí)間
.3更改器方法與訪問(wèn)器方法
- 對(duì)實(shí)例域做出修改的方法稱為更改器方法(mutator method)琼稻,僅訪問(wèn)實(shí)例域而不進(jìn)行修改的方法稱為訪問(wèn)器方法(accessor method)。通常為get和set饶囚。
4.3用戶自定義類
- 要想創(chuàng)建一個(gè)完整的程序帕翻,應(yīng)該將若干類組合在一起。
.1Employee類
- 實(shí)例域萝风、構(gòu)造器嘀掸、方法
.2多個(gè)源文件的使用
.3剖析Employee類
- 類通常包含類型屬于某個(gè)類類型的實(shí)例域。
.4構(gòu)造器
- 構(gòu)造器總是伴隨著new操作符的執(zhí)行被調(diào)用规惰,而不能對(duì)一個(gè)已經(jīng)存在的對(duì)象調(diào)用構(gòu)造器來(lái)達(dá)到重新設(shè)置實(shí)例域的目的睬塌。
- 構(gòu)造器與類同名
- 每個(gè)類可以有一個(gè)以上的構(gòu)造器
- 構(gòu)造器可以有0個(gè)、1個(gè)或多個(gè)參數(shù)
- 構(gòu)造器沒(méi)有返回值
- 構(gòu)造器總伴隨著new操作一起調(diào)用
- ps:不要在構(gòu)造器中定義與定義域重名的局部變量
.5隱式參數(shù)與顯式參數(shù)
public void raiseSalary(double byPersent){
double raise = Salary * byPersent / 100;
Salary += raise;
}
number007.raiseSalary(5);
- 隱式(implicit)參數(shù)歇万,是出現(xiàn)在方法名前的類對(duì)象揩晴;顯式(explicit)參數(shù),位于方法名后面的括號(hào)中贪磺。顯式參數(shù)明顯地列在方法聲明中硫兰,隱式參數(shù)沒(méi)有出現(xiàn)在方法聲明中。在每一個(gè)方法中缘挽,關(guān)鍵字this表示隱式參數(shù)瞄崇。
.6封裝的優(yōu)點(diǎn)
- 一個(gè)只讀域,一旦在構(gòu)造器中設(shè)置完畢壕曼,就沒(méi)有任何一個(gè)辦法可以對(duì)它進(jìn)行修改苏研,這樣來(lái)確保域不會(huì)受到外界的破壞。
- 在有些時(shí)候腮郊,需要獲得或設(shè)置實(shí)例域的值摹蘑,應(yīng)提供以下三項(xiàng)內(nèi)容:
- 一個(gè)私有的數(shù)據(jù)域
- 一個(gè)公有的域訪問(wèn)器方法
- 一個(gè)公有的域更改器方法
- 有下列優(yōu)勢(shì):
- 可以改變內(nèi)部實(shí)現(xiàn),除了該類的方法之外轧飞,不會(huì)影響其他代碼
- 更改器方法可以執(zhí)行錯(cuò)誤檢查
- ps:不要編寫(xiě)返回可變對(duì)象的訪問(wèn)器方法(4.2.1對(duì)象引用)衅鹿。如果需要返回一個(gè)可變對(duì)象的引用,首先應(yīng)該對(duì)它進(jìn)行克隆(clone)过咬。
class Employee{
private Date hireDay;
...
public Date getHireDay(){
return hireDay.clone();
}
...
}
4-5
.7基于類的訪問(wèn)權(quán)限
class Employee{
...
public boolean equals(Employee other){
return name.equals(otehr.name);
}
}
if(harry.equals(boss))...
- 該方法訪問(wèn)了harry的私有域大渤,也訪問(wèn)了boss的私有域。這是合法的掸绞,因?yàn)閎oss是Employee類對(duì)象泵三,而Employee類的方法可以訪問(wèn)Employee類的任何一個(gè)對(duì)象的私有域。
.8私有方法
- 只要方法是私有的,它就不會(huì)被外部的其他類操作調(diào)用烫幕,可以將其刪去俺抽。如果方法是公有的,就不能將其刪去较曼,因?yàn)槠渌a可能依賴它磷斧。
.9final實(shí)例域
- 將實(shí)例域定義成fianl,構(gòu)建對(duì)象時(shí)必須初始化這樣的域捷犹。也就是說(shuō)弛饭,必須確保在每一個(gè)構(gòu)造器執(zhí)行之后,這個(gè)域的值被設(shè)置伏恐,并且在后面的操作中孩哑,不能在對(duì)它進(jìn)行修改。
- fianl修飾符大都應(yīng)用于基本(primitive)類型域翠桦,或不可變(immutable)類的域。對(duì)于可變的類胳蛮,使用final修飾符可能會(huì)給讀者造成混亂销凑。
4.4靜態(tài)域與靜態(tài)方法
.1靜態(tài)域
- 如果將域定義為static,每個(gè)類中都只有一個(gè)這樣的域仅炊。而每一個(gè)對(duì)象對(duì)于所有實(shí)例域卻都有自己的一份拷貝斗幼。例:
class Employee{
private static int nextId = 1;
private int id抚垄;
...
} - 現(xiàn)在蜕窿,每一個(gè)雇員對(duì)象都有一個(gè)自己的id域,但這個(gè)類的所有實(shí)例域?qū)⒐蚕硪粋€(gè)nextId域呆馁。換句話說(shuō)桐经,如果有1000個(gè)Employee類的對(duì)象,則有1000個(gè)實(shí)例域id浙滤,但是只有一個(gè)靜態(tài)域nextId阴挣。即使沒(méi)有一個(gè)Employee對(duì)象,靜態(tài)域nextId也存在纺腊。它屬于類畔咧,而不屬于任何獨(dú)立的對(duì)象脯厨。
.2靜態(tài)常量
public static fianl double PI = 3.141592653;
.3靜態(tài)方法
靜態(tài)方法是一種不能向?qū)ο髮?shí)施操作的方法员魏。換句話說(shuō),沒(méi)有隱式的參數(shù)塔鳍∫妓冢可以認(rèn)為靜態(tài)方法是沒(méi)有this參數(shù)的方法拜隧。Employee類的靜態(tài)方法不能訪問(wèn)Id實(shí)例域,因?yàn)樗荒懿僮鲗?duì)象。但是虹蓄,靜態(tài)方法可以 訪問(wèn)自身類中的靜態(tài)域犀呼。例:
public static int getNextId(){
return nextId;//returns static field
}
int n = Employee.getNextId();-
建議使用類名,而不是對(duì)象來(lái)調(diào)用靜態(tài)方法薇组。在如下兩種情況下使用靜態(tài)方法:
- 一個(gè)方法不需要訪問(wèn)對(duì)象狀態(tài)外臂,其所需參數(shù)都是通過(guò)顯式參數(shù)提供。
- 一個(gè)方法只需要訪問(wèn)類的靜態(tài)域律胀。
.4工廠方法
- 靜態(tài)方法的一種常見(jiàn)用途宋光。如NumberFormat類使用工廠方法產(chǎn)生不同風(fēng)格的格式對(duì)象。
- NumberFormat類不利用構(gòu)造器完成操作的原因:
- 無(wú)法命名構(gòu)造器炭菌。構(gòu)造器的名字必須與類名相同罪佳,但是這里希望各種實(shí)例采用不同的名字。
- 當(dāng)使用構(gòu)造器時(shí)黑低,無(wú)法改變所構(gòu)造的對(duì)象類型
.5main方法
- 不需要使用對(duì)象調(diào)用靜態(tài)對(duì)象赘艳。同理,main函數(shù)也是一個(gè)靜態(tài)方法克握。main方法不對(duì)任何對(duì)象進(jìn)行操作蕾管。事實(shí)上,在啟動(dòng)程序時(shí)還沒(méi)有任何一個(gè)對(duì)象菩暗。靜態(tài)的main方法將執(zhí)行并創(chuàng)建程序所需要的對(duì)象掰曾。
4.5方法參數(shù)
- 術(shù)語(yǔ):按值調(diào)用(call by value)表示方法接收的是調(diào)用者提供的值。按引用調(diào)用(call by reference)表示方法接收的是調(diào)用者提供的變量地址停团。一個(gè)方法可以修改引用所對(duì)應(yīng)的變量值旷坦,而不能修改傳遞值調(diào)用所對(duì)應(yīng)的變量值。Java總是采用按值調(diào)用佑稠。也就是說(shuō)秒梅,方法得到的是所有參數(shù)值的一個(gè)拷貝。特別是讶坯,方法不能修改傳遞給它的任何參數(shù)變量的內(nèi)容番电。
public static void tripleValue(double x){
x=3*x;//doesn't work
}
double percent = 10;
tripleValue(percent); - 對(duì)于基本數(shù)據(jù)類型的參數(shù)。無(wú)論怎樣調(diào)用辆琅,percent的值都不會(huì)改變漱办。x只是被初始化為percent值的一個(gè)拷貝。
public static void tripleSalary(Employee x){
x.raiseSalary(200);//raise to 200%
}
harry = new Employee(...);
tripleSalary(harry); - 對(duì)于對(duì)象引用婉烟,具體的執(zhí)行過(guò)程為:
- 1)x被初始化為harry值得拷貝娩井,這里是一個(gè)對(duì)象的引用。
- 2)raiseSalary方法應(yīng)用于這個(gè)對(duì)象引用似袁。x和harry同時(shí)引用的那個(gè)Employee對(duì)象的薪金提高了200%洞辣。
-
3)方法結(jié)束后咐刨,參數(shù)變量x不再使用。當(dāng)然扬霜,對(duì)象變量harry繼續(xù)引用那個(gè)薪金增至300%的雇員對(duì)象定鸟。
4-7
- 所以說(shuō),實(shí)現(xiàn)一個(gè)改變對(duì)象參數(shù)狀態(tài)的方法并不是一件難事著瓶。理由是联予,方法得到的是對(duì)象引用的拷貝,對(duì)象引用及其他的拷貝同時(shí)引用同一個(gè)對(duì)象材原。
-
Java總是采用按值調(diào)用沸久。對(duì)于Java采用引用調(diào)用的反例:
public static void swap(Employee x, Employee y){
Employee temp = x;
x = y;
y = temp;
}
swap(a, b);//never work - 如果Java對(duì)對(duì)象采用的是引用調(diào)用,那么該方法就能夠?qū)崿F(xiàn)交換數(shù)據(jù)的效果余蟹。實(shí)際上方法沒(méi)有改變存儲(chǔ)在變量a和b中的對(duì)象引用卷胯。在方法結(jié)束時(shí),參數(shù)變量x和y被丟棄了威酒。原來(lái)的a,b仍然引用這個(gè)方法調(diào)用之前所引用的對(duì)象窑睁。
- Java中方法參數(shù)的使用情況:
- 一個(gè)方法不能修改一個(gè)基本數(shù)據(jù)類型的參數(shù)
- 一個(gè)方法可以改變一個(gè)對(duì)象參數(shù)的狀態(tài)
- 一個(gè)方法不能讓對(duì)象參數(shù)引用一個(gè)新的對(duì)象
4.6對(duì)象構(gòu)造
.1重載
- 重載(overloading):多個(gè)方法有相同的名字、不同的參數(shù)兼搏,便產(chǎn)生了重載卵慰。編譯器通過(guò)匹配挑選出相應(yīng)的方法,若不存在便會(huì)報(bào)錯(cuò)佛呻。
- 返回類型不是方法簽名的一部分,所以不能有兩個(gè)名字相同病线、參數(shù)類型也相同卻返回不同類型值的方法吓著。
.2默認(rèn)域初始化
- 如果在構(gòu)造器中沒(méi)有顯示地給域賦予初值,那么就會(huì)自動(dòng)地賦為默認(rèn)值:數(shù)值為0送挑,布爾值為false绑莺,對(duì)象引用為null。局部變量必須明確初始化惕耕,域中變量不初始化會(huì)被賦予初值(這樣不好)纺裁。
.3無(wú)參數(shù)構(gòu)造器
- 如果在編寫(xiě)一個(gè)類時(shí)沒(méi)有編寫(xiě)構(gòu)造器,那么系統(tǒng)就會(huì)提供一個(gè)無(wú)參數(shù)的構(gòu)造器司澎。這個(gè)構(gòu)造器將所有的實(shí)例域設(shè)置為默認(rèn)值欺缘。
- 如果類中提供了至少一個(gè)構(gòu)造器,但是沒(méi)有提供無(wú)參數(shù)的構(gòu)造器挤安,則在構(gòu)造對(duì)象時(shí)如果沒(méi)有提供參數(shù)就會(huì)被視為不合法谚殊。
.4顯示域初始化
- 由于類的構(gòu)造器方法可以重載,所以可以采用多種形式設(shè)置類的實(shí)例域的初始狀態(tài)蛤铜,以確保不管怎樣調(diào)用構(gòu)造器嫩絮,每個(gè)實(shí)例域都可以被設(shè)置為一個(gè)有意義的初值丛肢。
- 在構(gòu)造器執(zhí)行之前,先執(zhí)行賦值操作剿干。初始值不一定是常量蜂怎。例:
class Employee{
private static int nextId;
private int id = assignId();
...
private static int assignId(){
int r = nextId;
nextId++;
return r;
}
...
}
.5參數(shù)名
- 參數(shù)名有字面意思更好。
- 用this訪問(wèn)實(shí)例域置尔。例:
public Employee(String name, double salary){
this.name = name;
this.salary = salary;
}
.6調(diào)用另一個(gè)構(gòu)造器
- 關(guān)鍵字this引用方法的隱式參數(shù)杠步。
- 如果構(gòu)造器的第一個(gè)語(yǔ)句形如this(...),這個(gè)構(gòu)造器將調(diào)用同一個(gè)類的另一個(gè)構(gòu)造器撰洗。例:
public Employee(double s){
//call Employee(String, double)
this("Employee #"+nextId, s);
nextId++;
}
調(diào)用new Employee(60000)時(shí)篮愉,Employee(double)構(gòu)造器將調(diào)用Employee(String, double)。
.7初始化塊
- 初始化數(shù)據(jù)域:1)在構(gòu)造器中設(shè)置值差导;2)在聲明中賦值
- 3)初始化塊(initialization block)试躏,例:
class Employee{
private static int nextId;
private int id;
private String name;
private double salary;
//object initialization block
{
id = nextId;
nextId++;
}
public Employee(String n, double s){
name = n;
salary = s;
}
public Employee(){
name = "";
salary = 0;
}
...
}
建議將初始化塊放在域定義之后。 - 調(diào)用構(gòu)造器的具體步驟:
- 1)所有數(shù)據(jù)域被初始化為默認(rèn)值(0设褐、false或null)
- 2)按照在類聲明中出現(xiàn)的次序颠蕴,依次執(zhí)行所有域初始化語(yǔ)句和初始化塊
- 3)如果構(gòu)造器第一行調(diào)用了第二個(gè)構(gòu)造器,則執(zhí)行第二個(gè)構(gòu)造器主體
- 4)執(zhí)行這個(gè)構(gòu)造器主體
4.7包(Package)
- 從編譯器角度看助析,嵌套的包之間沒(méi)有任何關(guān)系犀被。如,java.util與java.util.jar毫無(wú)關(guān)系外冀。
.1類的導(dǎo)入
- 一個(gè)類可以使用所屬包中的所有類寡键,以及其他包中的公有類(public class)。
- 訪問(wèn)其他包中的公有類雪隧,第一種方式是在每個(gè)類名之前添加完整的包名西轩。第二種是使用import語(yǔ)句。
- 導(dǎo)入的包內(nèi)類發(fā)生命名沖突時(shí)脑沿,需要指定藕畔。
.2靜態(tài)導(dǎo)入
- import增加了導(dǎo)入靜態(tài)方法和靜態(tài)域的功能。如:
import static java.lang.System.*
就可以使用System類的靜態(tài)方法和靜態(tài)域庄拇,而不必加類名前綴注服。
.3將類放入包中
- 將包名放在源文件的開(kāi)頭,如果沒(méi)有該語(yǔ)句措近,則放置在一個(gè)默認(rèn)包(defaulf package)中溶弟。
.4包作用域
- 標(biāo)記為public的部分可以被任意的類使用,標(biāo)記為private的部分只能被定義它們的類使用熄诡。如果沒(méi)有指定可很,這個(gè)部分可以被同一個(gè)包中的所有方法訪問(wèn)。包密封(package sealing)
4.8類路徑
- 類存儲(chǔ)在文件系統(tǒng)的子目錄中凰浮,類的路徑必須與包名匹配我抠。另外苇本,類文件也可以存儲(chǔ)在JAR文件中。
- 為了使類能夠被多個(gè)程序共享菜拓,需要做到以下幾點(diǎn):
- 1)把類放到一個(gè)目錄中
- 2)將JAR文件放在一個(gè)目錄中
- 3)設(shè)置類路徑(class path)瓣窄,類路徑是所有包含文件的路徑的集合。類路徑包括:
- 1)基目錄/home/user/classdir或c:\classes纳鼎;
- 2)當(dāng)前目錄俺夕;
- 3)JAR文件/home/user/archives/archive.jar或c:\archives\archive.jar
4.9文檔注釋
.1注釋的插入
-
javadoc實(shí)用程序(utility)從下面幾個(gè)特性中抽取信息:
- 包
- 公有類與接口
- 公有的和受保護(hù)的構(gòu)造器及方法
- 公有的和受保護(hù)的域
- 每個(gè)注釋在標(biāo)記/**...*/之后緊跟著自由格式文本(free-form text)。標(biāo)記有@開(kāi)頭贱鄙,第一句應(yīng)該是一個(gè)概要行的句子劝贸,javadoc會(huì)自動(dòng)將這些句子抽取出來(lái)形成概要頁(yè)。
.2類注釋
- 類注釋放在import語(yǔ)句之后逗宁,類定義之前映九。
.3方法注釋
- 每一個(gè)方法注釋必須放在所描述的方法之前。除了通用標(biāo)記以外瞎颗,還可以使用以下標(biāo)記:
- @param變量描述
- @return描述
- @throws類描述
.4域注釋
- 只需要對(duì)公有域(通常指的是靜態(tài)常量)建立文檔
.5通用注釋
- 下列標(biāo)記可以用在類文檔的注釋中:
- @author姓名:作者
- @version文本:版本描述
- @since文本:對(duì)引入特性的版本描述
- @see引用:提供javadoc中的超鏈接
.6包與概述注釋
- 想要產(chǎn)生包注釋件甥,就需要在每一個(gè)包目錄中添加一個(gè)單獨(dú)的文件『甙危可以選擇:
- 1)提供一個(gè)以package.html命名的HTML文件引有。在標(biāo)記<body>...</body>之間的所有文本都會(huì)被抽取出來(lái)
- 2)提供一個(gè)以package-info.java命名的Java文件。這個(gè)文件必須包含一個(gè)初始的以/**和*/界定的Javadoc注釋倦逐,緊跟在報(bào)語(yǔ)句之后譬正。它不應(yīng)該包含更多的代碼和注釋。
.7注釋的抽取
- 步驟:
- 1)切換到包含想要生成文檔的源文件目錄檬姥。
- 2)如果是一個(gè)包导帝,應(yīng)該運(yùn)行命令:
javadoc -d docDirectory nameOfPackage
還有多個(gè)文件和在默認(rèn)包中的情況。
4.10類設(shè)計(jì)技巧
- 1)一定要保證數(shù)據(jù)私有穿铆,絕對(duì)不要破壞封裝性
- 2)一定要對(duì)數(shù)據(jù)域初始化
- 3)不要再類中使用過(guò)多的基本類型
- 4)不是所有的域都需要獨(dú)立的域訪問(wèn)器和域更改器
- 5)將職責(zé)過(guò)多的類進(jìn)行分解
- 6)類名和方法名要能夠提現(xiàn)它們的職責(zé)