您現在的位置是:首頁 > 垂釣
面向過程,面向物件的概念與區別
- 由 碼一碼 發表于 垂釣
- 2022-11-29
閾下影響是什麼意思
今日目標
面向物件和麵向過程
類和物件
物件記憶體圖
封裝
this 關鍵字
構造方法
一、面向物件
1、面向過程和麵向物件的對比
1。1 問題
1
什麼是面向過程
2
什麼是面向物件
1。2 答案
1。2。1 面向過程
面向過程(pop):是一種以過程為中心的程式設計思想,實現功能的每一步,都是自己實現的。
看名字它是注重過程的。當解決一個問題的時候,面向過程會把事情拆分成: 一個個方法和資料(用於方法的引數)。然後按照一定的順序,執行完這些方法(每個方法看作一個個過程),等方法執行完了,事情就搞定了
過程的特點:親力親為,每一步都是自己去完成,強調的是完成這件事的過程步驟
1。2。2 面向物件
面向物件(oop):是一種以物件為中心的程式設計思想,透過指揮物件實現具體的功能
例如:
解決產生隨機數的問題 ——-> Random物件
解決鍵盤錄入的問題 ——-> Scanner物件
Java講究萬物皆物件
面向物件思想小結:
可觀存在的任何一種事物,都可以看做為程式中的物件
使用面向物件思想可以將複雜的問題簡單化
將我們從執行者的位置,變成了指揮者
面向物件學什麼 ?
學習自己如何設計物件
學習已有的物件如何使用 (API階段)
2、類和物件的關係
2。1 問題
1
類的概念
2
類的組成
3
類和物件的關係
2。2 答案
2。2。1 類的概念
類是對現實生活中一類具有
共同屬性
和
行為
的事物的抽象。
【類】是對事物,也就是物件的一種
描述
,可以將類理解為一張設計圖,根據設計圖,可以創建出具體存在的事物
2。2。2 類的組成
屬性。該事物的各種特徵。例如黑馬學生事物的屬性:姓名、年齡、畢業院校…
行為。該事物存在的功能(能夠做的事情)。例如黑馬學生事物行為:學習、Java程式設計開發
2。2。3 類和物件的關係
前提 : Java中想要建立物件,必須要先有類的存在
類:是一組相關屬性和行為的集合, 將其看做為是物件的設計圖
物件:根據類(設計圖)創建出來的實體
關係:類是物件的描述,物件是類的實體
依賴關係 : 需要根據類建立物件
數量關係 : 一對多的關係, 根據一個類創建出多個物件
3、類的定義
3。1 問題
1 類的組成
2 類的定義步驟
3。2 答案
3。2。1 類的組成
屬性(名詞):在程式碼中透過成員變數來體現。跟之前定義變數的格式一樣, 只不過位置發生了改變, 類中方法外
行為(名詞):在程式碼中透過成員方法來體現。跟之前定義方法的格式一樣, 只不過去掉了static關鍵字
3。2。2 類的定義步驟
定義類
編寫類的成員變數
編寫類的成員方法
示例程式碼:
public
class
Student
{
String
name
;
int
age
;
public
void
eat
(){
。。。
}
}
注意 :
當類寫好了之後,需要在測試類中建立物件再使用
4、物件的建立和使用
4。1 問題
1
如何透過一個類建立一個物件
2
物件如何去使用
4。2 答案
4。2。1 根據類建立物件
如何透過一個類建立一個物件
類的例項化
建立類的物件
=
類的例項化
=
例項化類
落地實現
:
1
建立類設計類的成員。
2
建立類的物件。
3
透過物件
。
屬性。或物件
。
方法呼叫物件的成員結構。
建立物件的格式
類名
物件名
=
new
類名
();
範例:
Student
s
=
new
Student
();
4。2。2 物件的使用
物件如何去使用
1。
使用物件訪問成員變數
格式:物件名
。
成員變數名
;
範例:p
。
name
2。
使用物件訪問成員方法
格式:物件名
。
成員方法名
();
範例:p
。
study
();
5、案例手機類的建立和使用
需求:
首先定義一個手機類,然後定義一個手機測試類,在手機測試類中透過物件完成成員變數和成員方法的使用
思路:
①定義一個手機類(成員變數:品牌,價格;成員方法:打電話,發簡訊)
②定義手機測試類
③在手機測試類中透過物件完成成員變數和成員方法的使用
程式碼實現:
//手機類
public
class
Phone
{
//成員變數
String
brand
;
int
price
;
//成員方法
public
void
call
(
String
name
){
System
。
out
。
println
(
“給”
+
name
+
“打電話”
);
}
public
void
sendMessage
(){
System
。
out
。
println
(
“群發簡訊”
);
}
}
//測試類
public
class
TestPhone
{
/*
編寫一個手機測試類(TestPhone)建立手機類物件
並呼叫成員變數並列印,呼叫成員方法執行
*/
public
static
void
main
(
String
[]
args
) {
Phone
p
=
new
Phone
();
p
。
brand
=
“華為手機”
;
p
。
price
=
5999
;
System
。
out
。
println
(
p
。
brand
);
System
。
out
。
println
(
p
。
price
);
p
。
call
(
“阿強”
);
p
。
sendMessage
();
}
}
6、單個物件的記憶體圖
7、兩個物件的記憶體圖
8、兩個引用指向同一個物件的記憶體圖
垃圾回收
注意:
當堆記憶體中,
物件
或
陣列
產生的地址,透過任何方式都不能被找到後,就會被判定為記憶體中的
“垃圾”
垃圾會被Java垃圾回收器,空閒的時候自動進行清理
GC : Garbage Collection
“引用計數演算法”
引用計數是垃圾收集器中的早期策略。在這種方法中,堆中每個物件例項都有一個引用計數。當一個物件被建立時,且將該物件例項分配給一個變數,該變數計數設定為1。當任何其它變數被賦值為這個物件的引用時,計數加1(a
=
b
,
則b引用的物件例項的計數器
+
1
),但當一個物件例項的某個引用超過了生命週期或者被設定為一個新值時,物件例項的引用計數器減1。任何引用計數器為0的物件例項可以被當作垃圾收集。當一個物件例項被垃圾收集時,它引用的任何物件例項的引用計數器減1。
“可達性演算法”
該方法的基本思想是透過一系列的“GC
Roots”物件作為起點進行搜尋,如果在“GC
Roots”和一個物件之間沒有可達路徑,則稱該物件是不可達的,不過要注意的是被判定為不可達的物件不一定就會成為可回收物件。
一個物件的引用
強引用
軟引用
弱引用
虛引用
程式碼練習:
public
class
TestClass
{
public
static
void
main
(
String
[]
args
) {
// 1 第一個實驗
int
a
=
10
;
int
b
=
a
;
b
++
;
System
。
out
。
println
(
a
);
//列印多少
//2 實驗2
Student
s1
=
new
Student
();
//
Student
s2
=
s1
;
s2
。
age
++
;
System
。
out
。
println
(
s1
。
age
);
//現在age是多少?
}
}
class
Student
{
int
age
=
20
;
}
=======================================================================
public
class
TestClass
{
public
static
void
main
(
String
[]
args
) {
// 實驗1
int
m
=
10
;
changeInt
(
m
);
System
。
out
。
println
(
m
);
//列印多少
//實驗2
Student
s1
=
new
Student
();
changeAge
(
s1
);
System
。
out
。
println
(
s1
。
age
);
//列印多少。
//實驗3
Student
s2
=
new
Student
();
changeStudent
(
s2
);
System
。
out
。
println
(
s2
。
age
);
//列印多少。
}
public
static
void
changeInt
(
int
a
){
//a=10
a
++
;
}
`
public
static
void
changeAge
(
Student
s
){
//s=s1;
s
。
age
++
;
}
public
static
void
changeStudent
(
Student
s
){
//s=s2
s
=
new
Student
();
s
。
age
++
;
}
}
class
Student
{
int
age
=
20
;
}
總結
:
java中引數傳遞的規則
“值傳遞”
簡單型別的引數
傳值
物件型別的引數
傳地址
傳引用
實參和形參指向同一物件
(
一個電腦可以插多個鍵盤
)
。
9、成員變數和區域性變數的區別
9。1 問題
成員變數和區域性變數有什麼區別
9。2 答案
9。2。1 區別
10、private關鍵詞
10。1 問題
1
private關鍵字的含義是什麼
2
被private修飾的屬性有什麼特點
3
被private修飾的方法有什麼特點
10。2 答案
10。2。1 含義
是一個許可權修飾符,代表私有的意思,可以修飾成員(成員變數和成員方法)
10。2。2 private修飾屬性
只能本類內部使用,不能透過物件名 “。” 的形式呼叫
10。2。3 private修飾方法
只能本類內部使用,不能透過物件名 “。” 的形式呼叫
注意:
針對private修飾的成員變數,如果需要被其他類使用,提供相應的操作
提供“
get變數名()
”方法,用於獲取成員變數的值,方法用public修飾
提供“
set變數名(引數)
”方法,用於設定成員變數的值,方法用public修飾
11、private關鍵字的使用
一個標準類的編寫:
把成員變數用private修飾
提供對應的setXxx()/getXxx()方法
12、this關鍵字
12。1 問題
1
this的本質
2
this的作用
12。2 答案
12。2。1 this的本質
this 代表當前類物件的引用(地址)
12。2。2 this的作用
可以呼叫本類的成員(變數, 方法),解決區域性變數和成員變數的重名問題
13、this關鍵字記憶體圖
14、封裝
14。1 問題
1
什麼是封裝
2
封裝在程式碼中的體現
3
封裝的好處
14。2 答案
14。2。1 封裝的介紹
封裝是面向物件三大特徵之一(封裝,繼承,多型)
隱藏實現細節,僅對外暴露公共的訪問方式
14。2。2 封裝在程式碼中的常見體現
私有成員變數,提供setXxx和getXxx方法
將程式碼抽取到方法中,這是對程式碼的一種封裝
將屬性抽取到類當中,這是對資料的一種封裝
14。2。3 封裝的好處
提高了程式碼的安全性
提高了程式碼的複用性
15、構造方法的格式和執行時機
15。1 問題
1
什麼是構造方法
2
構造方法的格式
3
構造方法的執行時機
15。2 答案
15。2。1 構造方法的概述
構建、創造物件的時候,所呼叫的方法
15。2。2 格式
許可權修飾符
類名
(){}
例如:public
Student
(){}
1。
方法名與類名相同,大小寫也要一致
2。
沒有返回值型別,連void都沒有
3。
沒有具體的返回值(不能由return帶回結果資料)
15。2。3 執行時機
建立物件的時候呼叫,每建立一次物件,就會執行一次構造方法
不能手動呼叫構造方法
16、構造方法的作用
16。1 作用
本質作用:建立物件
結合構造方法執行時機:給物件中的屬性(成員變數)進行初始化
17、構造方法的注意事項
17。1 構造方法的分類
有參構造
無參構造
17。2 注意事項
17。2。1 構造方法的建立
如果沒有定義構造方法,系統將給出一個預設的無引數構造方法
如果定義了構造方法,系統將不再提供預設的構造方法
17。2。2 構造方法的過載
構造方法也是方法,允許過載關係出現
17。2。3 推薦的使用方式
無引數構造方法,和帶引數構造方法,都自己手動給出
17。3 構造方法記憶體圖解
18、標準類的程式碼編寫和使用
1。
自定義類
1。
私有化成員變數
2。
構造方法
無參構造
滿參構造
3。
set及get方法
4。
成員方法
5。
為了展示資料方便的show方法
2。
測試類
1。
main方法
2。
建立物件使用成員變數
,
成員方法
。。。
需求:定義標準學生類,
使用private修飾成員變數
(
name
,
age
,
性別gender
,
成績score
)
提供setXxx
/
getXxx方法
提供空參有參構造方法,有參構造方法為成員變數賦值
提供用於顯示資訊的show方法
測試類分別使用空參和有參構造方法建立物件
要求分別使用空參和有參構造方法建立物件,
空參建立的物件透過setXxx賦值,
有參建立的物件直接賦值,
並透過show方法展示資料。
19、練習:使用標準 JavaBean 封裝資料
步驟:
1。編寫飲水機類 WaterDispenser
2。定義四個成員變數(品牌 brand)(顏色 color)(容量 capacity)(模式 model)
3。私有成員變數,提供 setXxx\getXxx 方法
4。提供空參、帶參構造方法
5。提供成員方法 show - 用於展示出所有成員變數所記錄的值
6。編寫測試類 Test
7。使用帶參構造方法建立物件,給屬性賦值為(美的,紅色,5L,手動淨水)
8。呼叫show方法執行
9。將容量獲取出來,並判斷容量是否大於3L。
執行結果:
品牌為
:
美的
顏色為
:
紅色
容量為
:
5
模式為
:
手動淨水
容量大於3L
程式碼:
package
com
。
itheima
。
test
;
public
class
WaterDispenser
{
// 定義四個成員變數(品牌 brand)(顏色 color)(容量 capacity)(模式 model)
private
String
brand
;
private
String
color
;
private
int
capacity
;
private
String
model
;
// 空參構造
public
WaterDispenser
() {
}
// 帶參構造
public
WaterDispenser
(
String
brand
,
String
color
,
int
capacity
,
String
model
) {
this
。
brand
=
brand
;
this
。
color
=
color
;
this
。
capacity
=
capacity
;
this
。
model
=
model
;
}
// setXxx\getXxx
public
String
getBrand
() {
return
brand
;
}
public
void
setBrand
(
String
brand
) {
this
。
brand
=
brand
;
}
public
String
getColor
() {
return
color
;
}
public
void
setColor
(
String
color
) {
this
。
color
=
color
;
}
public
int
getCapacity
() {
return
capacity
;
}
public
void
setCapacity
(
int
capacity
) {
this
。
capacity
=
capacity
;
}
public
String
getModel
() {
return
model
;
}
public
void
setModel
(
String
model
) {
this
。
model
=
model
;
}
// show 方法
public
void
show
() {
System
。
out
。
println
(
“品牌為:”
+
brand
);
System
。
out
。
println
(
“顏色為:”
+
color
);
System
。
out
。
println
(
“容量為:”
+
capacity
);
System
。
out
。
println
(
“模式為:”
+
model
);
}
}
package
com
。
itheima
。
test
;
public
class
TestWaterDispenser
{
public
static
void
main
(
String
[]
args
) {
WaterDispenser
wd
=
new
WaterDispenser
(
“美的”
,
“紅色”
,
5
,
“手動淨水”
);
wd
。
show
();
if
(
wd
。
getCapacity
()
>
3
){
System
。
out
。
println
(
“容量大於3L”
);
}
else
{
System
。
out
。
println
(
“容量沒有大於3L”
);
}
}
}