第三章 面向?qū)ο螅ㄉ希?/a>
第三講 面向?qū)ο?br>
理解面向?qū)ο蟮母拍?/span>
● 面向過(guò)程
在一個(gè)結(jié)構(gòu)體中定義窗口的大小,位置,顏色,背景等屬性,對(duì)窗口操作的函數(shù)與窗口本身的定義沒(méi)有任何關(guān)系,如HideWindow,MoveWindow,MinimizeWindow,這些函數(shù)都需要接受一個(gè)代表要被操作的窗口參數(shù),是一種謂語(yǔ)與賓語(yǔ)的關(guān)系。
● 面向?qū)ο?/span>
定義窗口時(shí),除了要指定在面向過(guò)程中規(guī)定的那些屬性,如大小,位置,顏色,背景等外,還要指定該窗口可能具有的動(dòng)作,如隱藏,移動(dòng),最小化等。這些函數(shù)被調(diào)用時(shí),都是以某個(gè)窗口要隱藏某個(gè)窗口要移動(dòng)的語(yǔ)法格式來(lái)使用的,這是一種主語(yǔ)與謂語(yǔ)的關(guān)系。
● 面向?qū)ο蟮娜筇卣?/span>
▂封裝
▂繼承
▂多態(tài)
類與對(duì)象
類是對(duì)某一類事物的描述,是抽象的,概念上的定義;對(duì)象是實(shí)際存在的該類事物的每個(gè)個(gè)體,因而也稱實(shí)例(instance)。
如果將對(duì)象比作汽車,那么類就是汽車的設(shè)計(jì)圖紙。所以面向?qū)ο蟪绦蛟O(shè)計(jì)的重點(diǎn)是類的設(shè)計(jì),而不是對(duì)象的設(shè)計(jì)。
類的定義
public class Person()
{
int age;
void shout()
{
System.out.println("I am age "+age);
}
}
● age是類的屬性,也叫類成員變量
● shout是方法也叫類的成員函數(shù)。
● shout方法可以直接訪問(wèn)同一類中的age變量,如果一個(gè)方法中有與成員同名的局部變量,該方法中對(duì)這個(gè)
變量名的訪問(wèn)是局部變量,而不是成員變量。
在類中創(chuàng)建的成員變量會(huì)被初始化,局部變量不會(huì)被初始化。
對(duì)象的使用
創(chuàng)建新的對(duì)象之后,我們就可以使用“對(duì)象名.對(duì)象成員”的格式,來(lái)訪問(wèn)對(duì)象的成員(包括屬性和方法)
class Person
{
int age;
void shout()
{
System.out.println("age="+age);
}
}
class TestPerson
{
public static void main(String[]args)
{
Person p1=new Person();
p1.age=20;
p1.shout();
Person p2=new Person();
p2.shout();
}
}
上面程序運(yùn)行的內(nèi)存布局如下:
對(duì)象的比較
● “==”運(yùn)算符與equals()方法的區(qū)別
“==”用來(lái)比較值是否相等,equals()方法用來(lái)比較兩個(gè)對(duì)象的內(nèi)容是否相等
● 怎樣比較兩個(gè)數(shù)組對(duì)象的內(nèi)容是否相等
arrays.equals(ary1[],ary2[]);
匿名對(duì)象
● 我們也可以不定義對(duì)象的句柄,而直接調(diào)用這個(gè)對(duì)象的方法。這樣的對(duì)象叫做匿名對(duì)象,
如:new Person().shout();
● 如果對(duì)一個(gè)對(duì)象只需要進(jìn)行一次方法調(diào)用,那么就可以使用匿名對(duì)象。
● 我們經(jīng)常將匿名對(duì)象作為實(shí)參傳遞給一個(gè)函數(shù)調(diào)用。
實(shí)現(xiàn)類的封裝性
● 如果外面的程序可以隨意修改一個(gè)類的成員變量,會(huì)造成不可預(yù)料的程序錯(cuò)誤,就象一個(gè)人身高,不能被外部隨意修改,只能通過(guò)各種攝取營(yíng)養(yǎng)的方法去修改這個(gè)屬性。
● 在定義一個(gè)類的成員(包括變量和方法)時(shí),使用private關(guān)鍵字說(shuō)明這個(gè)成員的訪問(wèn)權(quán)限,這個(gè)成員成了 類的私有成員,只能被這個(gè)類其他成員方法調(diào)用,而不能被其他類中的方法所調(diào)用。
● 為了實(shí)現(xiàn)良好的封裝性,我們通常將類的成員變量聲明為private,再通過(guò)public方法來(lái)對(duì)這個(gè)變量進(jìn)行訪問(wèn)。對(duì)一個(gè)變量操作,一般都有讀取和賦值操作,我們分別定義兩個(gè)方法來(lái)實(shí)現(xiàn)這兩種操作,一個(gè)是getXxx()方法(Xxx表示要訪問(wèn)的成員變量的名字),用來(lái)讀取這個(gè)成員變量操作,另外一個(gè)是setXxx()用來(lái)對(duì)這個(gè)變量賦值。
● 一個(gè)類通常就是一個(gè)小的模塊,我們應(yīng)該讓模塊僅僅公開(kāi)必須要讓外界知道的內(nèi)容,而隱藏其它一切內(nèi)容。我們?cè)谶M(jìn)行程序的詳細(xì)設(shè)計(jì)時(shí),應(yīng)盡量避免一個(gè)模塊直接修改或操作另外一個(gè)模塊的數(shù)據(jù),模塊設(shè)計(jì)追求強(qiáng)內(nèi)聚(許多功能盡量在類的內(nèi)部獨(dú)立完成,不讓外面干預(yù)),弱耦合(提供給外部盡量少的方法調(diào)用)。
class Person
{
private int age;
void shout()
{
System.out.println(age);
}
public void setAge(int x)
{
if(x<0)
return;
age=x;
}
public int getAge()
{
return age;
}
}
class TestPerson
{
public static void main(String[]args)
{
Person p=new Person();
p.setAge(18);
p.shout();
System.out.println(p.getAge());
}
}
構(gòu)造函數(shù)的定義與作用
● 構(gòu)造函數(shù)的特征
▁它具有與類相同的名稱;
▁它不含返回值
▁它不能在方法中用return語(yǔ)句返回一個(gè)值
注意:在構(gòu)造方法里不含返回值的概念是不同于“void”的,在定義構(gòu)造方法時(shí)加了”voiid”,結(jié)果這個(gè)方法就不再被自動(dòng)調(diào)用。
● 構(gòu)造方法的作用:當(dāng)一個(gè)類的實(shí)例對(duì)象剛產(chǎn)生時(shí),這個(gè)類的構(gòu)造方法就會(huì)被自動(dòng)調(diào)用,我們可以在這個(gè)方法中加入要完成初始化工作的代碼。
構(gòu)造方法的重載
● 和一般的方法重載一樣,重載的構(gòu)造方法具有不同個(gè)數(shù)或不同類型的參數(shù),編譯器就可以根據(jù)這一點(diǎn)判斷出用new 關(guān)鍵字產(chǎn)生對(duì)象時(shí),該調(diào)用哪個(gè)構(gòu)造方法了。產(chǎn)生對(duì)象的格式是:new 類名(參數(shù)列表);
● 重載構(gòu)造方法可以完成不同初始化的操作,如:p3=new Person(“Tom”18);語(yǔ)句,會(huì)做這樣幾件事:創(chuàng)建指定類的新實(shí)例對(duì)象,在堆內(nèi)存中為實(shí)例對(duì)象分配內(nèi)存空間,并調(diào)用指定類的構(gòu)造方法,最后將實(shí)例對(duì)象的首地址賦值給引用變量p3。
This引用句柄的應(yīng)用
● 一個(gè)類中成員方法可以直接調(diào)用同類中的其他成員,其實(shí)我們?cè)谝粋€(gè)方法內(nèi)部使用“this.其他成員”的引用方式和直接使用“其他成員”的效果是一樣的,那this還有多大的作用呢?在有些情況下,我們是非得用this關(guān)鍵字不可的:
▁讓類的成員變量名和對(duì)其進(jìn)行賦值的成員方法的形參變量同名是必要的,這樣的代碼誰(shuí)看了都能明白這兩個(gè)變量是彼此相關(guān)的。
▁假設(shè)我們有一個(gè)容器類和一個(gè)部件類,在容器類的某個(gè)方法中創(chuàng)建部件類的實(shí)例對(duì)象,而部件類的構(gòu)造方法要接收一個(gè)代表其所在容器的參數(shù)。
▁構(gòu)造方法是在產(chǎn)生對(duì)象時(shí)被java系統(tǒng)自動(dòng)調(diào)用的,我們不能在程序中象調(diào)用其他方法一樣去調(diào)用構(gòu)造方法。但我們可以在一個(gè)構(gòu)造方法里調(diào)用其他重載的構(gòu)造方法,不是用構(gòu)造方法名,而是用this(參數(shù)列表)形式,根據(jù)其中的參數(shù)列表,選擇相應(yīng)的構(gòu)造方法。
垃圾回收過(guò)程分析
● c++中的析構(gòu)方法
● java中的finalize()方法
● System.gc的作用
Static靜態(tài)變量
當(dāng)我們編寫(xiě)一個(gè)類時(shí),其實(shí)就是在描述其對(duì)象的屬性和行為,而并沒(méi)有產(chǎn)生實(shí)質(zhì)上的對(duì)象,只有通過(guò)new關(guān)鍵字才會(huì)產(chǎn)生出對(duì)象,這時(shí)系統(tǒng)才會(huì)分配內(nèi)存空間對(duì)象,其方法才可以供外部調(diào)用。我們有時(shí)候希望無(wú)論是否產(chǎn)生了對(duì)象或無(wú)論產(chǎn)生了多少對(duì)象的情況下,某些特定的數(shù)據(jù)在內(nèi)存空間里只有一份。
編寫(xiě)使用靜態(tài)變量統(tǒng)計(jì)一個(gè)類產(chǎn)生的實(shí)例對(duì)象的個(gè)數(shù)的程序。
class Person
{
private String name;
private static int count=0;
static String country="中國(guó)";
public Person()
{
System.out.println(name+":"+ ++count);
}
public Person(String name)
{
this.name=name;
System.out.println(name+":"+ ++count);
}
void shout()
{
System.out.println(name);
}
}
class TestPerson
{
public static void main(String[]args)
{
Person p=new Person("張三");
new Person();
p.shout();
new Person("李四").shout();
System.out.println(Person.country);
}
}
運(yùn)行結(jié)果:
張三:1
null:2
張三
李四:3
李四
中國(guó)
Static靜態(tài)方法
● 在靜態(tài)方法里只能直接調(diào)用同類中其它的靜態(tài)成員(包括變量和方法),而不能直接訪問(wèn)類中的非靜態(tài)成員。這是因?yàn)椋瑢?duì)于非靜態(tài)的方法和變量,需要先創(chuàng)建類的實(shí)例對(duì)象后才可使用,而靜態(tài)方法在使用前不用創(chuàng)建任何對(duì)象。
● 靜態(tài)方法不能以任何方式引用this和super關(guān)鍵字。與上面的道理一樣,因?yàn)殪o態(tài)方法在使用前不用創(chuàng)建任何實(shí)例對(duì)象,當(dāng)靜態(tài)方法被調(diào)用時(shí),this所引用的對(duì)象根本就沒(méi)有產(chǎn)生。
● main()方法是靜態(tài)的,因此JVM在執(zhí)行main方法時(shí)不創(chuàng)建main方法所在的類的實(shí)例對(duì)象,因而在main()方法中,我們不能直接訪問(wèn)該類中的非靜態(tài)成員,必須創(chuàng)建該類的一個(gè)實(shí)例對(duì)象后,才能通過(guò)這個(gè)對(duì)象去訪問(wèn)類中的非靜態(tài)成員。
單態(tài)設(shè)計(jì)模式
● 設(shè)計(jì)模式是在大量的實(shí)踐中總結(jié)和理論化之后優(yōu)選的代碼結(jié)構(gòu)、編程風(fēng)格、以及解決問(wèn)題的思考方式。
● 所謂類的單態(tài)設(shè)計(jì)模式,就是采取一定的方法保證在整個(gè)的軟件系統(tǒng)中,對(duì)某個(gè)類只能存在一個(gè)對(duì)象實(shí)例,并且該類只提供一個(gè)取得其對(duì)象實(shí)例的方法。如果我們要讓類在一個(gè)虛擬機(jī)中只能產(chǎn)生一個(gè)對(duì)象,我們首先必須將類的構(gòu)造方法的訪問(wèn)權(quán)限設(shè)置為private,這樣就不能用new操作符在類的外部產(chǎn)生類的對(duì)象了,但在類的內(nèi)部仍可以產(chǎn)生該類的對(duì)象。因?yàn)樵陬惖耐獠块_(kāi)始還無(wú)法等到類的對(duì)象,只能調(diào)用該類的某個(gè)靜態(tài)方法以返回類內(nèi)部創(chuàng)建的對(duì)象,靜態(tài)方法只能訪問(wèn)類中的靜態(tài)成員變量,所以,指向類內(nèi)部產(chǎn)生的該類對(duì)象的變量也必須定義成靜態(tài)的。
class Chinese
{
static Chinese obj=new Chinese();
public static Chinese getInstance()
{
return obj;
}
private Chinese()
{
System.out.println("ss");
}
}
class TestChinese
{
public static void main(String[]args)
{
Chinese obj1=Chinese.getInstance();
Chinese obj2=Chinese.getInstance();
System.out.println(obj1==obj2);
//如果相等返回true,否則返回false.
}
}
運(yùn)行結(jié)果:
ss
true
內(nèi)部類
——在類中直接定義的內(nèi)部類(嵌套類)
● 內(nèi)部類(嵌套類)可以直接訪問(wèn)外部類(嵌套它的類)的成員,包括private成員,但是,內(nèi)部類(嵌套類)的成員卻不能被外部類(嵌套它的類)直接訪問(wèn)。
● 在內(nèi)部類對(duì)象保存了一個(gè)對(duì)外部類對(duì)象的引用,當(dāng)內(nèi)部類的成員方法中訪問(wèn)某一變量時(shí),如果在該方法和內(nèi)部類中都沒(méi)有定義過(guò)這個(gè)變量,內(nèi)部類中對(duì)this的引用會(huì)被傳遞給那個(gè)外部類對(duì)象的引用。
● 如果用static修飾一個(gè)內(nèi)部類,這個(gè)類就相當(dāng)于是一個(gè)外部定義的類,所以static的內(nèi)部類中可聲明static成員,但是,非static的內(nèi)部類中的成員是不能聲明為static。Static的內(nèi)部類不能再使用外層封裝的非static的成員變量,這個(gè)道理不難想象,所以static嵌套類很少使用。
class Outer
{
int outer_i=100;
void test()
{
Inner inner=new Inner();
inner.display();
}
class Inner
{
void display()
{
System.out.println(outer_i);
}
}
public static void main(String[]args)
{
Outer outer=new Outer();
outer.test();
}
}
● 如果函數(shù)的局部變量(函數(shù)的參數(shù)也是局部變量)、內(nèi)部類的成員變量、外部類的成員變量重名,我們應(yīng)該按下面的程序代碼所使用的方式來(lái)明確指定我們真正要訪問(wèn)的變量。
public class Outer
{
private int size;
public class Inner
{
private int size;
public void doStuff(int size)
{
size++;//引用的是doStuff函數(shù)的形參
this.size++;//引用的是Inner類中的成員變量
Outer.this.size++;//引用的是Outer類中的成員變量
}
}
}
內(nèi)部類如何被外部引用
class Outer
{
private int size=100;
public class Inner
{
public void doStuff()
{
System.out.println(++size);
}
}
}
public class TestInner
{
public static void main(String[]args)
{
Outer outer=new Outer();
Outer.Inner inner=outer.new Inner();
inner.doStuff();
}
}
在方法中定義的內(nèi)部類
● 嵌套類并非只能在類中定義,也可以在幾個(gè)程序塊的范圍之內(nèi)定義內(nèi)部類。例如,在方法中,或甚至在for循環(huán)體內(nèi)部,都可以定義嵌套類。
● 在方法中定義的內(nèi)部類只能訪問(wèn)方法的fianl類型的局部變量,用final定義的局部變量相當(dāng)于是一個(gè)常量,它的生命周期超出方法運(yùn)行的生命周期。
posted on 2007-06-07 23:33 大頭劍客 閱讀(395) 評(píng)論(0) 編輯 收藏 所屬分類: 學(xué)習(xí)筆記