第八章 基于對象的編程
1.用關(guān)鍵字public定義的類(lèi)必須存于與該類(lèi)同名的文件中,并且文件擴展名為.java。在同一個(gè)文件中定義多于一個(gè)public類(lèi)是語(yǔ)法錯誤。
2.java中定義一個(gè)類(lèi)時(shí)總要繼承已有的類(lèi)定義,最基本的繼承Object類(lèi)。它是最基本的超類(lèi)或叫基類(lèi),它有一個(gè)主要的方法toSting。如果一個(gè)類(lèi)在定義時(shí)不顯試的使用關(guān)鍵字extends,這個(gè)類(lèi)會(huì )隱試的繼承Object類(lèi)。
3.一個(gè)類(lèi)中通常帶有幾個(gè)構造函數,這是通過(guò)方法的重載實(shí)現的,構造函數也可以帶參數,但不能返回值。構造函數和其他方法的一個(gè)重要的差異是構造函數不允許返回值,void也不行。
4.java中的每一個(gè)類(lèi)都是包的一部分,如果編程人員沒(méi)有為類(lèi)指定包,類(lèi)會(huì )自動(dòng)的放到缺省的包中,它包含當前目錄下已編譯的類(lèi)。
5.一個(gè)字符串與任意對象的鏈接會(huì )產(chǎn)生對該對象toString方法的隱試調用。如:“\nImplicit toString()call:”+t;
6.Java API中的每一個(gè)類(lèi)和接口屬于一個(gè)特定的包,它包含一組相關(guān)聯(lián)的類(lèi)和接口。包實(shí)際上是對類(lèi)和接口進(jìn)行組織的目錄結構。包提供了一種軟件復用的機制。
7.創(chuàng )建一個(gè)可以復用的類(lèi)的步驟如下:
1)定義一個(gè)public類(lèi),如果類(lèi)不是public,它只能被同一包中的其他類(lèi)使用。
2)選擇一個(gè)包名,并把package語(yǔ)句加到可復用的類(lèi)的源代碼文件中。
3)編譯這個(gè)類(lèi)。這樣,它就被放到適當的包目錄結構中,以供編譯器和解釋器使用。
4)把這個(gè)可復用的類(lèi)導入到需要用它的程序中?,F在就可以使用它了。
8.為使每個(gè)包有惟一的名字,Sun Microsystem公司提出了一個(gè)為包命名的約定,每個(gè)包名字由你所在的Internet的域名的逆序開(kāi)始。如:com.deitel.jhtp3.ch08.Time1。
9.如果類(lèi)中沒(méi)有定義構造函數,編譯器會(huì )自動(dòng)創(chuàng )建一個(gè)不帶參數的缺省構造函數,也叫無(wú)參數構造函數。類(lèi)的缺省構造函數將調用直接超類(lèi)的缺省構造函數,并以缺省的方式初始化成員變量。
10.在定義類(lèi)的方法或變量時(shí),如果不為它們提供訪(fǎng)問(wèn)權限修飾符,那么這些方法或變量被視為包訪(fǎng)問(wèn)。
11.this引用被隱式地用于引用一個(gè)對象的實(shí)例變量和方法。另一個(gè)this引用的用法是實(shí)現“連接方法調用”,也叫“級連方法的調用”。如:t.setHour(18).setMinute(30).setSecond(22);
“.”運算符從左至右的結合,因此上述表達式首先計算t.setHour(18),然后此方法返回一個(gè)對象t的引用。又如:t.setTime(20,20,20).toString();
12.java執行自動(dòng)的內存“垃圾收集”,將內存收回系統。當程序不再使用一個(gè)對象(即沒(méi)有對對象的引用)時(shí),對象會(huì )被標識,以供垃圾收集。當“垃圾收集”執行時(shí),這個(gè)對象所占的內存會(huì )被收回。因此,其他語(yǔ)言如C,C++,常見(jiàn)的內存浪費(因它不是自動(dòng)回收的)不會(huì )發(fā)生在java中,讓而其他資源的浪費卻是可能的。
13.java的每個(gè)類(lèi)都有一個(gè)finalizer方法,用于將資源返回給系統。在垃圾收集器回收一個(gè)對象的內存之前,該對象的finalizer方法一定會(huì )被調用。執行此對象的結束事務(wù)處理。類(lèi)finalizer方法的名字是finalize,它不接受任何參數,也不返回任何值。一個(gè)類(lèi)只能有一個(gè)finalize方法。finalize方法最初在Object類(lèi)中定義,它是一個(gè)空的方法,什么也不做。但這樣保證了每個(gè)類(lèi)都有一個(gè)finalize方法,以供垃圾收集器調用。
14.類(lèi)的每個(gè)對象中都有類(lèi)所有實(shí)例變量的一個(gè)拷貝,當只需要某個(gè)變量的一個(gè)拷貝供類(lèi)的所有對象共享時(shí),可以使用static類(lèi)變量。static類(lèi)變量只具有類(lèi)作用域,public static類(lèi)成員可以通過(guò)類(lèi)的任一對象引用訪(fǎng)問(wèn),也可以用類(lèi)名加點(diǎn)操作符(如Math.random())訪(fǎng)問(wèn)。而private static類(lèi)成員只能通過(guò)類(lèi)的方法訪(fǎng)問(wèn)。
實(shí)際上,即使一個(gè)類(lèi)對象都不存在,static類(lèi)成員也會(huì )存在,執行時(shí)類(lèi)被裝入內存后就有了它們。當不存在類(lèi)對象是,想要訪(fǎng)問(wèn)public static成員,只需在類(lèi)成員前面加上類(lèi)名和點(diǎn)操作符;而想要訪(fǎng)問(wèn)private static類(lèi)成員,則必須提供一個(gè)public方法,而且在方法調用時(shí)必須在方法名前加上類(lèi)名和點(diǎn)操作符。
聲明為static的方法不能訪(fǎng)問(wèn)非static類(lèi)的成員,此外與非static方法不同,static方法并無(wú)this引用,因為static類(lèi)變量和static類(lèi)的方法的存在獨立與類(lèi)的任何對象。并存在與類(lèi)的任何對象被實(shí)例化之前。
15.實(shí)例分析
1)源代碼
//類(lèi)Employee2的定義;
package Employee2;
public class Employee2 extends Object{
private String fsname;
private String lsname;
private static int count; //聲明靜態(tài)私有變量count;
//類(lèi)Emloyee2的構造函數;
public Employee2(String fname,String lname) {
fsname=fname;
lsname=lname;
count++; //當創(chuàng )建一個(gè)實(shí)例時(shí),實(shí)例數目加1;
System.out.println("Employee object constract:"+fsname+" "+lsname);
}
//類(lèi)Emloyee2的finalize()函數;
protected void finalize(){
--count; //當撤銷(xiāo)一個(gè)實(shí)例時(shí),實(shí)例數目減1;
System.out.println("Enployee object finalizer:"+fsname+" "+lsname+
";count= "+count);
}
public String getFullName(){return (fsname+" "+lsname);}
public static int getcount(){return count;} //靜態(tài)方法getcount()返回靜態(tài)變量count的值;
}
//測試Emloyee2的類(lèi)Employee2Test
package Employee2;
import javax.swing.JOptionPane ;
public class Employee2Test{
public static void main(String arg[]){
String output;
output="Employee before instantiation:"+Employee2.getcount ();/*用類(lèi)的靜態(tài)方法得到實(shí)例變量的數目;*/
Employee2 e1=new Employee2("susan","baker");
Employee2 e2=new Employee2("jake","bone");
output+="\n\nEmployees after instantiation:"+
"\nvia e1.getcount (): "+e1.getcount()+
"\nvia e2.getcount (): "+e2.getcount()+
"\nvia Employee2.getcount (): "+Employee2.getcount ();
output+="\n\nEmployee 1:"+e1.getFullName()+
"\nEmployee 2:"+e2.getFullName ();
e1=null; //撤銷(xiāo)對象實(shí)例;
e2=null;
System.gc(); //顯式調用垃圾收集程序;
output+="\n\nEmployee after gc():"+
Employee2.getcount ();
JOptionPane.showMessageDialog (null,output,
"Static menbers and garbage collection",
JOptionPane.INFORMATION_MESSAGE);
System.exit (0);
}
}
聯(lián)系客服