本章教學(xué)內(nèi)容:
3.1 面向?qū)ο笏枷?/h2>3.1.1 面向?qū)ο蠛喗?沒用)
????面向?qū)ο笫钱?dāng)前計算機界關(guān)心的重點,它是90年代以后軟件開發(fā)方法的的主流。目前面向?qū)ο蟮母拍詈蛻?yīng)用已超越了程序設(shè)計和軟件開發(fā),擴展到很寬的范圍。如數(shù)據(jù)庫系統(tǒng)、交互式界面、應(yīng)用結(jié)構(gòu)、應(yīng)用平臺、網(wǎng)絡(luò)管理結(jié)構(gòu)、人工智能等領(lǐng)域。
3.1.2 面向?qū)ο蠡靖拍?br>
1.對象
????在現(xiàn)實世界中,每個實體都是對象。
????面向?qū)ο蟪绦蛟O(shè)計是將人們認識世界過程中普遍采用的思維方法應(yīng)用到程序設(shè)計中。
????對象的特征分為靜態(tài)特征和動態(tài)特征兩種。靜態(tài)的特征指對象的外觀、性質(zhì)、屬性等;動態(tài)的特征指對象具有的功能、行為等。人們將對象的靜態(tài)特征抽象為屬性,用數(shù)據(jù)來描述,在 Java 語言中稱之為變量;將對象的動態(tài)特征抽象為行為,用一組代碼來表示,完成對數(shù)據(jù)的操作,在 Java語言中稱之為方法。
????一個對象由一組屬性和一組對屬性進行操作的方法構(gòu)成。
2.對象的狀態(tài)和行為
????對象具有狀態(tài),一個對象用數(shù)據(jù)值來描述它的狀態(tài)。
????對象還有操作,用于改變對象的狀態(tài),操作就是對象的行為。
????對象實現(xiàn)了數(shù)據(jù)和操作的結(jié)合,使數(shù)據(jù)和操作封裝于對象的統(tǒng)一體中。
3.類
????將具有相同屬性及相同行為的一組對象稱為類。廣義地講,具有共同性質(zhì)的事物的集合就稱為類。
????類是對某一類事物的描述,是抽象的、概念上的定義;對象是實際存在的該類事物的個體,因而也稱實例。圖3-1就能較明確地說明類與對象的關(guān)系。(類可以比作汽車設(shè)計圖,而實例對象是一輛輛生產(chǎn)出來的汽車)
4.類的結(jié)構(gòu)
????在客觀世界中有若干類,這些類之間有一定的結(jié)構(gòu)關(guān)系。通常有兩種主要的結(jié)構(gòu)關(guān)系,即一般--具體結(jié)構(gòu)關(guān)系,整體--部分結(jié)構(gòu)關(guān)系。
(1)一般——具體結(jié)構(gòu)稱為分類結(jié)構(gòu),也可以說是“或”關(guān)系,或者是“is a”關(guān)系。
(2)整體——部分結(jié)構(gòu)稱為組裝結(jié)構(gòu),它們之間的關(guān)系是一種“與”關(guān)系,或者是“has a”關(guān)系。
3.1.3 面向?qū)ο蟮奶卣?br>
1.封裝性
2.? 繼承性
3.多態(tài)性
????Java 語言中含有方法重載與成員覆蓋兩種形式的多態(tài)。
????繼承是面向?qū)ο蠓椒ㄖ械闹匾拍睿⑶沂翘岣哕浖_發(fā)效率的重要手段。
3.2 類與對象
3.2.1 類的定義
????類是Java中的一種重要的引用類型,它將多個對象所共有的屬性(對象的特征)和方法(對象數(shù)據(jù)的操作算法)封裝組合成一個單元。定義一個類,就是創(chuàng)建一種新的數(shù)據(jù)類型,本質(zhì)上是對象的結(jié)構(gòu)定義。
1.Java中定義類的語法格式:
[訪問符] [修飾符] class? <類名> [extends父類名] [implements接口列表]{
?[成員變量] [成員方法]
}
其中:
(1)訪問符:用于聲明類的訪問權(quán)限,具體可取public或缺省 。
(2)修飾符:用于說明所定義的類的特性??捎玫挠衋bstract,static或final等。
(3)class:是Java語言中定義類的關(guān)鍵字。
(4)類名:定義類的名字,類的命名必須符合Java標識符的命名規(guī)范。
(5)extends父類名:說明類的父類。具體用法詳見4.1小節(jié)。
(6)implements接口列表:說明一個類所實現(xiàn)的接口。
(7)成員變量:定義了該類所具有的屬性。
(8)成員方法:方法是類行為的體現(xiàn),其他對象可以根據(jù)類的方法對類進行訪問。
2.成員方法的定義
??[訪問符] 返回類型 方法名稱(參數(shù)列表){
方法體;
}
3.2.2對象的創(chuàng)建
1.創(chuàng)建對象
創(chuàng)建屬于某類的對象,需要通過下面兩個步驟來實現(xiàn):(兩步的類可以不同,但第一步的類不能是new的類的子類)
第一步:聲明該類的一個變量(引用變量),用以指向“由類所創(chuàng)建的對象”。
第二步:利用 new 運算符創(chuàng)建對象(即用new運算符在內(nèi)存中為該對象分配地址空間),并把該對象的引用(即存放該對象的首地址)賦給聲明好的引用變量。
2.使用對象
????當(dāng)創(chuàng)建完一個對象后,可以使用點操作符“.”來實現(xiàn)對屬性和方法的訪問。
????訪問形式如下:
????訪問屬性:對象名.屬性名
????訪問方法:對象名.方法名()
????例如:如果想訪問Employee類中的員工姓名和員工每月的薪水屬性,可以用如下方法來訪問:
????emp1.name?? //訪問Employee類中的name屬性
????emp1.salary?? //訪問Employee類中的salary屬性
3.null關(guān)鍵字的使用
????“null”關(guān)鍵字表示“空”,用于標識一個不確定的對象,即沒有內(nèi)存地址的對象。因此可以將null賦給引用類型變量,但不可以賦給基本類型變量。
3.2.3類的構(gòu)造方法
????定義構(gòu)造方法的一般形式:
????[訪問符] 類名稱(類型 1 參數(shù) 1,類型 2 參數(shù) 2,…)
????{
????程序語句;
????…??//構(gòu)造方法沒有返回值
????}
????默認構(gòu)造方法類似于下面代碼:
????public Employee (){
?????……
????}
3.2.4 this 關(guān)鍵字
????this是Java的一個關(guān)鍵字,代表當(dāng)前類的對象,用于解決變量的命名沖突和不確定性問題。當(dāng)方法的參數(shù)或者方法中的局部變量與類的屬性同名時,類的屬性就被屏蔽,此時要訪問類的屬性就要使用“this.屬性名”的方式。
????當(dāng)然在沒有命名沖突的情況下,可以直接使用屬性名。
this關(guān)鍵字的用法如下:
(1)可以調(diào)用當(dāng)前對象的其它方法或訪問當(dāng)前對象的實例變量。
如: this.g();
(2)使用this可以區(qū)分當(dāng)前作用域中同名的不同變量。
?String? x;?? //實例變量
?public Test(String x , int a) {
?? this.x=x;?
?}
(3)在一個構(gòu)造方法中調(diào)用本類的另一個構(gòu)造方法。
?public Test( int? x) {
??? this(x,0);??
}?
3.2.5 方法重載
????在Java程序中,如果同一個類中存在兩個相同的方法,即方法名相同,參數(shù)列表(參數(shù)個數(shù)、參數(shù)類型、類型排列次序)也一樣,該類將無法編譯通過。但在Java中允許多個方法可以重名,但要保證參數(shù)列表(即參數(shù)個數(shù)、類型、順序)不同,這種特性稱為方法重載(overload)。對于重載的方法,編譯器是根據(jù)參數(shù)列表來進行方法綁定的。
方法重載需遵循如下兩條規(guī)則:
1.方法名相同。
2.參數(shù)列表不同。
3.2.6參數(shù)傳遞
????當(dāng)方法被調(diào)用時,如果方法有參數(shù),參數(shù)必須要實例化,即必須給參數(shù)變量(形參)一個具體的值(實參),這個過程稱為參數(shù)傳遞。在Java中,給方法傳遞參數(shù)的方式有兩種:
1.按值傳遞
2.引用傳遞(指針,傳地址)
3.3 包(類似文件夾,里面放著類)
????包采用分層結(jié)構(gòu),是Java語言中有效地管理類的一個機制。當(dāng)一個大型程序由數(shù)個不同的組別或人員共同開發(fā)時,用到相同的類名稱是很有可能的事,為了避免類名的沖突,Java允許使用包對類進行組織管理,將自定義的類與其它源代碼庫中的類分開,以確保類名的唯一性
????Java提供的基礎(chǔ)類庫就是使用包來管理。不同包中的類名可以相同,例如:Java類庫提供了兩個Date類,但分別屬于java.util包和java.sql包,所以能夠同時存在。
1.包的創(chuàng)建
????創(chuàng)建包就是在指定目錄路徑下創(chuàng)建一個子文件夾,這個包中所有類的字節(jié)碼文件將存放在該文件夾下。通過關(guān)鍵字“package”可以創(chuàng)建一個包。package語句作為Java源文件的第一條語句,必須放在源文件的第一行,指明該源文件定義的類所在的包。
package語句的格式:package 包名;
2.包中類的訪問
??????當(dāng)定義完一個類后,就可以在其它類中訪問該類。如果這些類在同一個包中,類之間可以直接訪問;而對于其他包中的類,有如下兩種訪問方式:
(1)使用import語句導(dǎo)入所需的類
(2)在所需的類名前直接添加完整的包名
3.JDK 中常見的包
(1) java.lang 包:此包包含一些 Java 語言的核心類,如 String、Math、Integer、System和 Thread,提供常用功能。在 java.lang 包中還有一個子包:java.lang.reflect用于實現(xiàn) java 類的反射機制。
(2) java.awt 包:此包包含構(gòu)成抽象窗口工具集(abstract window toolkits)的多個類,這些類被用來構(gòu)建和管理應(yīng)用程序的圖形用戶界面(GUI)。
(3) javax.swing 包:此包用于建立圖形用戶界面,此包中的組件相對于 java.awt包而言是輕量級組件。
(4) java.applet 包:此包包含 applet運行所需的一些類。
(5) java.net 包:此包包含執(zhí)行與網(wǎng)絡(luò)相關(guān)的操作的類。
(6) java.io 包:此包包含能提供多種輸入/輸出功能的類。
(7) java.util 包:此包包含一些實用工具類。
3.4 訪問權(quán)限
Java為類中的成員設(shè)置了四種訪問權(quán)限,為類本身設(shè)置了兩種訪問權(quán)限。
1.類成員的訪問權(quán)限
????Java中定義了private、protected和public的訪問修飾符,同時也定義了一個默認的訪問級別,用于控制類中成員的訪問權(quán)限。
(1) public訪問修飾符
????使用public訪問修飾符,類的成員可被同一包或不同包中的所有類訪問,也就是說,public訪問修飾符可以使類的特性公用于任何類。
(2) protected訪問修飾符
使用protected訪問修飾符允許類本身、同一包中的所有類和不同包中的子類訪問。
(3) 默認的訪問修飾符
如果一個類或類的成員前沒有任何訪問修飾符時,它們獲得默認的訪問權(quán)限,默認的可以被同一包中的其他類訪問。如果一個子類與其父類位于不同的包中,子類也不能訪問父類中的默認成員。
(4) private訪問修飾符
private訪問修飾符是限制性最大的一種訪問修飾符,被聲明為private的成員只能被此類中的其他成員訪問,不能在類外看到。
2.類的訪問權(quán)限
????聲明一個類,可以使用的權(quán)限修飾符只有public和默認的兩種。但是private和protected可以用于修飾內(nèi)部類。
????(1) public修飾的類是公有類,在任意地方都可見,可以被任何一個類使用。
????(2) 默認類只能在當(dāng)前包中可見, 可以被同一包中的其他類使用。
3.5 static成員
????Java的類體中可以包含兩種成員:實例成員和靜態(tài)成員。簡單來說,類是一種類型而不是具體的對象,一般在類中定義的成員是每個由此類產(chǎn)生的對象所擁有的,因此稱之為實例成員,只有創(chuàng)建了對象后,才能由對象訪問實例成員。如果需要讓類的所有對象在類的范圍內(nèi)共享某個成員,則需要用“static”關(guān)鍵字將這個成員定義成屬于類而不屬于某個對象的,這種成員稱之為靜態(tài)成員或類成員。
1.實例變量和靜態(tài)變量
?2.實例方法和靜態(tài)方法