靈雪的java修煉之路day07
day07
類與物件
#### 什麼是類
-
類:是一組相關【屬性】和【行為】的集合。可以把類看成一類事物的模板,使用事物的屬性特徵和行為特徵來描述該類事物。
-
現實中,描述一類事物:
屬性:描述該類事物的一種【狀態】資訊。
行為:描述該類事物具備的功能,能夠做什麼。
什麼是物件
類的定義
##### 事物與類的對比
現實中的一類事物:
屬性:事物的狀態資訊
行為:事物能夠做什麼,具備的功能
Java中的類描述事物也是如此:
成員變數:對應事物的屬性
成員方法:對應事物的行為
類的定義格式:
public class ClassName {
// 成員變數
// 成員方法
}
- 定義類:定義類的成員,包括成員變數和成員方法
- 成員變數:和之前定義變數的格式一模一樣,只不過【位置】不同,成員變數定義在類中,方法外
- 成員方法:和之前定義的方法幾乎是一樣的,只不過去掉【static】。
物件的使用
##### 物件的使用格式:
物件建立的格式:
類名 物件名 = new 類名();
使用物件訪問類的成員資訊:
物件名.成員變數名;
物件名.成員方法();
成員變數的預設值
資料型別 | 預設值 | |
---|---|---|
整數(byte short int long) | 0 | |
基本型別 | 浮點型別(float double) | 0.0 |
字元型(char) | ‘\u0000’ | |
布林型別(boolean) | false | |
引用型別 | 陣列、類、介面 | null |
備註:方法內定義的變數沒有初始化,不能被使用。
如果成員變數沒有進行賦值,系統會自動給一個預設值,規則和陣列一樣的。
類與物件的練習
定義一個類,用來模擬"手機"事物,屬性:品牌、價格、顏色;行為:打電話、開關機、群發簡訊。
測試訪問手機的屬性和行為
物件的記憶體圖解
一個物件,呼叫一個方法記憶體圖解
備註:在棧記憶體當中執行的方法,遵循“先進後出,後進先出”的原則,此時變數phone指向堆記憶體當中的空間,尋找方法資訊,執行該方法。
兩個物件,呼叫同一個方法記憶體圖解
物件呼叫方法時,根據物件當中方法標記(地址值),去類中尋找方法資訊,這樣哪怕是多個物件,方法資訊只儲存一份,節約記憶體空間。
成員變數和區域性變數的區別
變數根據定義的【位置不同】,我們給變數起了不同的名字
public class People {
String name = "小明";// 成員變數
public void eat() {
String food = "雞蛋撈麵";// 區域性變數
System.out.println(name + "中午吃的是:" + food);
}
}
-
在類中定義的位置不同 【重點】
成員變數:類中、方法外
區域性變數:方法中或者方法宣告上(形式引數)
-
作用範圍不同 【重點】
成員變數:類中
區域性變數:方法中
-
初始值不同 【重點】
成員變數:有預設值
區域性變數:沒有預設值,必須先定義賦值,才能使用
-
在記憶體當中儲存的位置不同 【瞭解】
成員變數:堆記憶體當中
區域性變數:棧記憶體當中
-
生命週期不同 【瞭解】
成員變數:隨著物件的建立而存在,隨著物件的消失而消失
區域性變數:隨著方法的呼叫而存在,隨著方法呼叫結束而消失。
-
修飾符不同 【瞭解】
成員變數:可以使用修飾符
區域性變數:不可以使用修飾符
封裝
#### 封裝概述
概述
物件導向程式語言模擬客觀世界,客觀世界裡的成員變數都是隱藏在物件內部的,外界無法直接操作和修改。封裝可以認為是一個保護屏障,防止該類的程式碼和資料被其他類隨意訪問和修改。要訪問該類的資料,必須要通過指定的方式才可以。適當的封裝,可以讓我們的程式碼更容易維護和理解,也加強了程式碼的安全性。
原則
將【屬性隱藏】起來,如果想要訪問類中的某個屬性,提供【公共的方法】對其訪問。
封裝步驟
1. 使用【private】關鍵字來修飾成員變數
2. 對需要訪問的成員變數,提供對應的一對 getXxx方法和setXxx方法。
封裝的操作----private關鍵字
##### private的含義
-
private是一個許可權修飾符,代表最小許可權
-
可以修飾成員變數,也可以修飾成員方法
-
被private修飾後的成員變數和成員方法,只能在本類中訪問。
private使用格式
private 資料型別 變數名;
public class Man {
// 1.使用private關鍵字修飾成員變數
private String name;
private int age;
// 2.提供對應的getXxx方法和setXxx方法,可以訪問類中的成員變數
// getXxx 獲取類中的成員變數值
public String getName() {
return name;
}
// setXxx 設定類中的成員變數值
public void setName(String name) {
name = name;
}
// 提供age的getXxx方法和setXxx方法
public int getAge() {
return age;
}
public void setAge(int age) {
age = age;
}
}
封裝優化1 ---- this關鍵字
我們發現setXxx()方法當中形參名字不符合我們識別符號的命名規範–見名知意,如果修改成和成員變數名字相同,會觸發Java程式當中的就近原則,會把方法內的變數統統設定為形參變數,會導致賦值失敗。我們可以採用【this】關鍵字 來解決變數重名問題。
this的含義
this代表所在類的當前物件的引用(地址值),即物件對自己的引用。
備註:意思方法被哪個物件呼叫,方法中的this就代表那個物件。即誰呼叫,this就是誰。
this的使用格式
this.成員變數名
使用this關鍵字修飾方法當中的成員變數,解決成員變數被隱藏的問題:
public class Man {
// 1.使用private關鍵字修飾成員變數
private String name;
private int age;
// 2.提供對應的getXxx方法和setXxx方法,可以訪問類中的成員變數
// getXxx 獲取類中的成員變數值
public String getName() {
return name;
}
// setXxx 設定類中的成員變數值
public void setName(String name) {
this.name = name;
}
// 提供age的getXxx方法和setXxx方法
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
備註:方法當中只有一個變數名,預設也是使用this修飾,可以省略不寫。
封裝優化2-----構造方法
當一個物件被建立出來的時候,構造方法用來初始化物件,給物件的成員變數賦初始值。
備註:無論你是否在類中定義構造方法,當類被定義出來的時候,系統會自動給該類分配一個構造方法—無參的構造方 法,一旦在類中顯式的定義構造方法,Java自動提供的預設無參構造方法就會失效(被收回)。
構造方法的定義格式
修飾符 構造方法名(引數列表) {
// 方法體內容
}
// 構造方法沒有返回值,構造方法名和類名完全一致,不需要void。
練習構造方法的使用
public class Dog {
private String name;
private int age;
private String brand;
private String color;
// 優化封裝 使用構造方法
public Dog(String name,String brand,int age,String color) {
// 方法體內容
this.name = name;
this.brand = brand;
this.age = age;
this.color = color;
}
// Java提供的預設的無參構造方法
//public Dog() {
//}
}
練習 Person類,成員變數:性別、年齡、體重、民族、姓名,定義Person類的構造方法,無參構造方法、全參構造方法。例項化並對類中的成員變數賦初始值。
注意事項
- 構造方法名稱必須和所在的類名完全一樣,就連大小寫一樣
- 構造方法不用宣告返回值型別,連void也不需要
- 構造方法不能用return一個具體的返回值。
- 如果定義類時沒有顯式定義構造方法,系統會提供一個預設的無參構造方法
- 一旦自定義了一個構造方法,那麼編譯器將會收回預設提供的構造方法
- 構造方法可以過載:方法名稱相同,引數列表不同
標準類-------JavaBean
JavaBean是Java語言編寫類的一種標準規範。符合JavaBean的類,包含四部分:
-
所有的成員變數都要使用private關鍵字修飾
-
要為每一個成員變數提供一對公共的getXxx和setXxx方法
-
編寫一個無參的構造方法
-
最好再提供一個全參的構造方法。
這樣標準的類就叫做Java Bean
練習JavaBean類的定義 要求如下:
定義一個電腦筆記本類
成員變數:品牌、價格、廠商、生產地址、顏色
相關文章
- 前端修煉之路前端
- IT人員修煉之路
- Java工程師修煉之路(校招總結)Java工程師
- Java程式設計師從“0到1”的修煉之路Java程式設計師
- 程式碼修煉之路-木桶佈局
- Double Kill!! 資料聯邦修煉之路
- 軟體測試經理修煉之路
- 一個架構師的快取修煉之路架構快取
- 不四:產品工程師的修煉之路工程師
- 【分享】騰訊業務系統監控的修煉之路
- Java程式設計師修煉之路(一)我們為什麼選擇JavaJava程式設計師
- Java工程師修煉之路(從小白到BAT的兩年學習歷程)Java工程師BAT
- 7年iOS開發,自述通往架構師的修煉之路iOS架構
- 實驗室裡的AI激情:騰訊優圖的升級修煉之路AI
- 程式設計師修煉之路 - 設計能力提升途徑程式設計師
- 優秀ASP.NET程式設計師修煉之路(收藏)ASP.NET程式設計師
- 程式設計師的成長秘籍:個人程式設計能力的修煉之路程式設計師
- java教程Java系統程式設計師修煉之道Java程式設計師
- JavaScript修煉之道JavaScript
- 煉數成金(dataguru)IT技能修煉
- Day07——Java新手學習Java
- 程式設計師成長祕籍:個人程式設計能力的修煉之路程式設計師
- 推薦閱讀:<<Java程式設計師的修煉之道>>Java程式設計師
- 《Java程式設計師修煉之道》作者Ben Evans訪談問題有獎徵集(圖靈訪談)Java程式設計師圖靈
- 一枚角度漸變描邊 loading 圖示的 SVG 修煉之路SVG
- typescript修煉指南(三)TypeScript
- typescript修煉指南(四)TypeScript
- typescript修煉指南(一)TypeScript
- typescript修煉指南(二)TypeScript
- Kotlin修煉指南Kotlin
- 系統架構師的修煉架構
- 資料分析修煉指南
- Android修煉之混淆Android
- Java程式設計師修煉之道—併發程式設計Java程式設計師
- 開發者技能修煉的五個等級
- 程式設計師的修煉之道2程式設計師
- 程式設計師的修煉之道3程式設計師
- 問鼎大師我的OCM之路——王雪婷