第4章_面向對象程式設計(上)
目錄
類的成員之屬性
類的成員之方法
匿名對象的使用
方法的重載
可變個數的形參
關于變量指派
幾道網紅面試題
遞歸方法的使用(了解)
類的成員之一:屬性
屬性(成員變量) vs 局部變量
1.相同點:
1.1 定義變量的格式:資料類型 變量名 = 變量值
1.2 先聲明,後使用
1.3 變量都有其對應的作用域
2.不同點:
2.1 在類中聲明的位置的不同
- 屬性:直接定義在類的一對{}内
- 局部變量:聲明在方法内、方法形參、代碼塊内、構造器形參、構造器内部的變量
2.2 關于權限修飾符的不同
- 屬性:可以在聲明屬性時,指明其權限,使用權限修飾符。
常用的權限修飾符:private、public、預設(不寫)、protected ------>(類的封裝性部分會詳講)
目前學習階段,聲明屬性時,使用預設就可以了。
- 局部變量:不可以使用權限修飾符
2.3 預設初始化值的情況:
- 屬性:類的屬性,根據其類型,都有預設初始化值。
整型(byte、short、int、long):0
浮點型(float、double):0.0
字元型(char):0 (或'\u0000')
布爾型(boolean):false
引用資料類型(類、數組、接口):null
- 局部變量:沒有預設初始化值。意味着,我們在調用局部變量之前,一定要顯式指派。
- 特别地:形參在調用方式時指派。
2.4 在記憶體中加載的位置:
- 屬性:加載到堆空間中(非static)(static放在方法區)
- 局部變量:加載到棧空間
類的成員之二:方法
day08-CustomerTest.java
類中方法的聲明和使用
方法(函數):描述類應該具有的功能。
比如:
Math類:sqrt()\random() \...
Scanner類:nextXxx() ...
Arrays類:sort() \ binarySearch() \ toString() \ equals() \ ...
1.舉例:
public void eat(){}
public void sleep(int hour){}
public String getName(){}
public String getNation(String nation){}
2. 方法的聲明:
權限修飾符 傳回值類型 方法名(形參清單){
方法體
}
注意:static、final、abstract 來修飾的方法後面會講。
3. 說明:
3.1 關于權限修飾符:預設方法的權限修飾符先都使用public
Java規定的4種權限修飾符:private、public、預設、protected。------封裝性會細說
3.2 傳回值類型: 有傳回值 vs 沒有傳回值
- 如果方法有傳回值
則必須在方法聲明時,指定傳回值的類型。同時,方法中,需要使用return關鍵字來傳回指定類型的變量或常量:“return 資料”。
- 如果方法沒有傳回值,
則方法聲明時,使用void來表示。通常,沒有傳回值的方法中,就不需要使用return.但是,如果使用的話,隻能“return;”表示結束此方法的意思。
- 我們定義方法該不該有傳回值?
① 題目要求
② 憑經驗:具體問題具體分析
3.3 方法名:屬于辨別符,遵循辨別符的規則和規範,“見名知意”
3.4 形參清單: 方法可以聲明0個,1個,或多個形參。
- 3.4.1 格式:資料類型1 形參1,資料類型2 形參2,...
- 3.4.2 我們定義方法時,該不該定義形參?
① 題目要求
② 憑經驗:具體問題具體分析
3.5 方法體:方法功能的展現。
4.return關鍵字的使用
- 使用範圍:使用在方法體中
- 作用:
① 結束方法
② 針對于有傳回值類型的方法,使用"return 資料"方法傳回所要的資料。
- 注意點:return關鍵字後面不可以聲明執行語句。
5. 方法的使用中,可以調用目前類的屬性或方法
- 特殊的:方法A中又調用了方法A:遞歸方法。
- 方法中,不可以定義方法。
day09 InstanceTest.java
匿名對象的使用
1.了解:我們建立的對象,沒有顯式的賦給一個變量名。即為匿名對象
2.特征:匿名對象隻能調用一次。
3.使用:如下
方法的重載
方法的重載(overload)
OverLoadTest.java
- 1.定義:在同一個類中,允許存在一個以上的同名方法,隻要它們的參數個數或者參數類型不同即可。
"兩同一不同":
同一個類、相同方法名
參數清單不同:參數個數不同,參數類型不同,順序不同等
- 2. 舉例:
Arrays類中重載的sort() / binarySearch()
- 3.判斷是否是重載:
跟方法的權限修飾符、傳回值類型、形參變量名、方法體都沒有關系!
- 4. 在通過對象調用方法時,如何确定某一個指定的方法:
方法名+ 參數清單
可變個數的形參
- 1.jdk 5.0新增的内容
- 2.具體使用:
2.1 可變個數形參的格式:資料類型 ... 變量名
2.2 當調用可變個數形參的方法時,傳入的參數個數可以是:0個,1個,2個,。。。
2.3 可變個數形參的方法與本類中方法名相同,形參不同的方法之間構成重載
2.4 可變個數形參的方法與本類中方法名相同,形參類型為相同資料類型的數組之間不構成重載。換句話說,參數為可變參數的資料類型與數組資料類型,作用相同,二者不能共存。
2.5 可變個數形參在方法的形參中,必須聲明在末尾
2.6 可變個數形參在方法的形參中,最多隻能聲明一個可變形參。
關于變量指派
- 如果變量是基本資料類型,此時指派的是變量所儲存的資料值。
- 如果變量是引用資料類型,此時指派的是變量所儲存的資料的位址值。
方法的形參的傳遞機制:值傳遞
1.形參:方法定義時,聲明的小括号内的參數
實參:方法調用時,實際傳遞給形參的資料
2.值傳遞機制:
如果參數是基本資料類型,此時實參賦給形參的是實參真實存儲的資料值。
如果參數是引用資料類型,此時實參賦給形參的是實參存儲資料的位址值。
幾道網紅面試題
貌似是考查方法的參數傳遞
遞歸方法的使用(了解)
- 1.遞歸方法:一個方法體内調用它自身。
- 2. 方法遞歸包含了一種隐式的循環,它會重複執行某段代碼,但這種重複執行無須循環控制。 、
- 遞歸一定要向已知方向遞歸,否則這種遞歸就變成了無窮遞歸,類似于死循環。
面向對象的特征一:封裝與隐藏
3W:what? why? how?
一、問題的引入:
當我們建立一個類的對象以後,我們可以通過"對象.屬性"的方式,對對象的屬性進行指派。這裡,指派操作要受到屬性的資料類型和存儲範圍的制約。除此之外,沒有其他制約條件。但是,在實際問題中,我們往往需要給屬性指派加入額外的限制條件。這個條件就不能在屬性聲明時展現,我們隻能通過方法進行限制條件的添加。(比如:setLegs())同時,我們需要避免使用者再使用"對象.屬性"的方式對屬性進行指派。則需要将屬性聲明為私有的(private). 此時,針對于屬性就展現了封裝性。
二、封裝性的展現:
我們将類的屬性xxx私有化(private),同時,提供公共的(public)方法來擷取(getXxx)和設定(setXxx)此屬性的值
拓展:封裝性的展現有很多:① 如上 ② 不對外暴露的私有的方法 ③ 單例模式 ...
三、封裝性的展現,需要權限修飾符來配合。
- 1.Java規定的4種權限(從小到大排列):private、預設(不寫)、protected 、public
- 2.4種權限可以用來修飾類及類的内部結構:屬性、方法、構造器、内部類
- 3.具體的,4種權限都可以用來修飾類的内部結構:屬性、方法、構造器、内部類。修飾類的話,隻能使用:預設、public
總結封裝性:Java提供了4種權限修飾符來修飾類及類的内部結構,展現類及類的内部結構在被調用時的可見性的大小。
類的成員之三:構造器
類的結構之三:構造器(或構造方法、constructor)的使用
一、構造器的作用:
- 1.建立對象
- 2.初始化對象的資訊
建立類的對象:new + 構造器
二、說明:
- 1.如果沒有顯式的定義類的構造器的話,則系統預設提供一個空參的構造器
- 2.定義構造器的格式:權限修飾符 類名(形參清單){}
- 3.一個類中定義的多個構造器,彼此構成重載
- 4.一旦我們顯式的定義了類的構造器之後,系統就不再提供預設的空參構造器,空參構造器需要自己寫出來。
- 5.一個類中,至少會有一個構造器。
總結:屬性指派的先後順序
- ① 預設初始化
- ② 顯式初始化(定義類時的聲明屬性并初始化)
- ③ 構造器中初始化
- ④ 通過"對象.set方法" 或 "對象.屬性"的方式指派
以上操作的先後順序:① - ② - ③ - ④
JavaBean
JavaBean是一種Java語言寫成的可重用元件。
所謂JavaBean,是指符合如下标準的Java類:
- 類是公共的
- 有一個無參的公共的構造器
- 有屬性(一般為private),且有對應的get、set方法
UML類圖
this關鍵字
this關鍵字的使用:
- 1.this可以用來修飾、調用:屬性、方法、構造器
- 2.this修飾屬性和方法:
this了解為:目前對象 或 目前正在建立的對象
2.1 在類的方法中,我們可以使用"this.屬性"或"this.方法"的方式,調用目前對象屬性或方法。但是,通常情況下,我們都選擇省略"this."。特殊情況下,如果方法的形參和類的屬性同名時,我們必須顯式的使用"this.變量"的方式,表明此變量是屬性,而非形參。
2.2 在類的構造器中,我們可以使用"this.屬性"或"this.方法"的方式,調用目前正在建立的對象屬性或方法。但是,通常情況下,我們都選擇省略"this."。特殊情況下,如果構造器的形參和類的屬性同名時,我們必須顯式的使用"this.變量"的方式,表明此變量是屬性,而非形參。
- 3. this調用構造器
① 我們在類的構造器中,可以顯式的使用"this(形參清單)"方式,調用本類中指定的其他構造器
② 構造器中不能通過"this(形參清單)"方式調用自己
③ 如果一個類中有n個構造器,則最多有 n - 1構造器中使用了"this(形參清單)"
④ 規定:"this(形參清單)"必須聲明在目前構造器的首行
⑤ 構造器内部,最多隻能聲明一個"this(形參清單)",用來調用其他的構造器
package和import關鍵字
一、package關鍵字的使用
- 1.為了更好的實作項目中類的管理,提供包的概念
- 2.使用package聲明類或接口所屬的包,聲明在源檔案的首行
- 3.包,屬于辨別符,遵循辨別符的命名規則、規範(xxxyyyzzz)、“見名知意”
- 4.每"."一次,就代表一層檔案目錄。
補充:
同一個包下,不能命名同名的接口、類。
不同的包下,可以命名同名的接口、類。
二、import關鍵字的使用
import:導入
- 1. 在源檔案中顯式的使用import結構導入指定包下的類、接口
- 2. 聲明在包的聲明和類的聲明之間
- 3. 如果需要導入多個結構,則并列寫出即可
- 4. 可以使用"xxx.*"的方式,表示可以導入xxx包下的所有結構
- 5. 如果使用的類或接口是java.lang包下定義的,則可以省略import結構
- 6. 如果使用的類或接口是本包下定義的,則可以省略import結構
- 7. 如果在源檔案中,使用了不同包下的同名的類,則必須至少有一個類需要以全類名的方式顯示。此時導包會報錯。
- 8. 使用"xxx.*"方式表明可以調用xxx包下的所有結構。但是如果使用的是xxx子包下的結構,則仍需要顯式導入
- 9. import static:導入指定類或接口中的靜态結構:屬性或方法。