
【☕Java】,千呼萬喚始出來,終于可以給自己new對象了——Java類和對象
🗽類與對象的初步認知
🗽類和類的執行個體化
🗽類的執行個體化
🗽類的成員
⭐字段 / 屬性 / 成員變量
⭐方法(method)
⭐static 關鍵字
⭐小結
🗽封裝
⭐private 實作封裝
⭐getter 和 setter方法
🗽構造方法
⭐基本文法
⭐this關鍵字
🗽認識代碼塊
⭐什麼是代碼塊
⭐普通代碼塊
⭐構造代碼塊
⭐靜态代碼塊
🗽類和對象内容總結
C語言是面向過程的,關注的是過程,分析出求解問題的步驟,通過函數調用逐漸解決問題。
JAVA是基于面向對象的,關注的是對象,将一件事情拆分成不同的對象,靠對象之間的互動完成。
【面向過程】注重的是過程,在整個過程中所涉及的行為,就是功能。
【面向對象】注重的是對象,也就是參與過程所涉及到的主體。是通過邏輯将一個個功能實作連接配接起來
面向過程: 1.把冰箱打開 2. 把大象放入 3. 冰箱關起來
面向對象: 打開冰箱,儲存,關閉都是對冰箱的操作,是冰箱的行為。冰箱就是一個對象,是以隻要操作冰箱所具備的功能,都要定義在冰箱中。
【面向對象概念】
1.面向對象是思考問題的一種思考方式,是一種思想。比如:概念與執行個體。理論與實踐。名和實等等……
2.類就是一類對象的統稱。對象就是這一類具體化的一個執行個體。
3.面向對象的好處:将複雜的事情變簡單了,隻要面對一個對象就行。
【面向對象設計】
面向對象設計把握一個重要的經驗:誰擁有資料,誰對外提供操作這些資料(私有)的方法!(被動的一方是資料的擁有者,主動的一方是執行者)
開發時:找對象,建對象,用對象,并維護對象之間的關系。
後期學習過程當中,我們會就這三點進行深入學習。
簡而言之,面向對象就是用代碼(類)來描述客觀世界的事物的一種方式.
一個類主要包含一類事物的【屬性】和【行為】
類就是一類對象的統稱。對象就是這一類具體化的一個執行個體。
簡單的例子:我們做月餅的模子就是一個類,而通過這個模子可以做出月餅,那麼在這個例子當中,類就是那個模子,而月餅就是那個對象,是以月餅就是一個實體。一個模子可以執行個體化無數個對象。
總的來說:類相當于一個模闆,對象是由模闆産生的樣本。一個類,可以産生無數的對象。
用類類型建立對象的過程,稱為類的執行個體化
1. 類隻是一個模型一樣的東西,限定了類有哪些成員.
2. 一個類可以執行個體化出多個對象,執行個體化出的對象 占用實際的實體空間,存儲類成員變量
3. 做個比方。類執行個體化出對象就像現實中使用建築設計圖建造出房子,類就像是設計圖,隻設計出需要什麼東西,但是并沒有實體的建築存在,同樣類也隻是一個設計,執行個體化出的對象才能實際存儲資料,占用實體空間
注意事項
- new 關鍵字用于建立一個對象的執行個體.
- 使用 . 來通路對象中的屬性和方法.
- 同一個類可以建立對個執行個體.
類的成員可以包含以下:字段、方法、代碼塊、内部類和接口等。
此處我們重點介紹前三個.
使用 【. 】通路對象的字段. “通路” 既包含讀, 也包含寫
對于一個對象的字段如果沒有顯式設定初始值, 那麼會被設定一個預設的初值.
預設值規則
對于成員變量, 不加public或者privat修飾預設public修飾.
對于各種數字類型, 預設值為 0.
對于 boolean 類型, 預設值為 false.
對于引用類型(String, Array, 以及自定制類), 預設值為 null
就是我們曾經講過的方法(類似C的函數).
用于描述一個對象的行為.
![]()
【Java】終于可以給自己new對象了——Java類和對象🗽類的成員 此處的 show 方法, 表示 person 這個對象具有一個 “展示自我” 的行為.
這樣的 show 方法是和 person 執行個體相關聯的. 如果建立了其他執行個體, 那麼 show 的行為就會發生變化
1、修飾屬性
2、修飾方法
3、代碼塊(本篇中會介紹)
4、修飾類(後面的内部類會講到)
![]()
【Java】終于可以給自己new對象了——Java類和對象🗽類的成員 ![]()
【Java】終于可以給自己new對象了——Java類和對象🗽類的成員 ![]()
【Java】終于可以給自己new對象了——Java類和對象🗽類的成員 ![]()
【Java】終于可以給自己new對象了——Java類和對象🗽類的成員 注意事項1: 靜态方法和執行個體無關, 而是和類相關. 是以這導緻了兩個情況:
靜态方法不能直接使用非靜态資料成員或調用非靜态方法 (非靜态資料成員和方法都是和執行個體相關的).
this和super兩個關鍵字不能在靜态上下文中使用(this 是目前執行個體的引用, super是目前執行個體父類執行個體的引用, 也是和目前執行個體相關).
注意事項2
我們曾經寫的方法為了簡單, 都統一加上了 static. 但實際上一個方法具體要不要帶 static, 都需要是情形而定.
main 方法為 static 方法.
觀察以下代碼, 分析記憶體布局.
class Person {
public int age;//執行個體變量 存放在對象内
public String name;//執行個體變量
public String sex;//執行個體變量
public static int count;//類變量也叫靜态變量,編譯時已經産生,屬于類本身,且隻有一份。存放在方法區
public final int SIZE = 10;//被final修飾的叫常量,也屬于對象。 被final修飾,後續不可更改
public static final int COUNT = 99;//靜态的常量,屬于類本身,隻有一份 被final修飾,後續不可更改
//執行個體成員函數
public void eat() {
int a = 10;//局部變量
System.out.println("eat()!");
}
//執行個體成員函數
public void sleep() {
System.out.println("sleep()!");
}
//靜态成員函數
public static void staticTest(){
//不能通路非靜态成員
//sex = "man"; error
System.out.println("StaticTest()");
}
}
public class Main{
public static void main(String[] args) {
//産生對象 執行個體化對象
Person person = new Person();//person為對象的引用
System.out.println(person.age);//預設值為0
System.out.println(person.name);//預設值為null
//System.out.println(person.count);//會有警告!
//正确通路方式:
System.out.println(Person.count);
System.out.println(Person.COUNT);
Person.staticTest();
//總結:所有被static所修飾的方法或者屬性,全部不依賴于對象。
person.eat();
person.sleep();
}
}
private/ public 這兩個關鍵字表示 “通路權限控制” .
被 public 修飾的成員變量或者成員方法, 可以直接被類的調用者使用.
被 private 修飾的成員變量或者成員方法, 不能被類的調用者使用.
換句話說, 類的使用者根本不需要知道, 也不需要關注一個類都有哪些 private 的成員. 進而讓類調用者以更低的成本來使用類.
此時字段已經使用 private 來修飾. 類的調用者(main方法中)不能直接使用. 而需要借助 show 方法. 此時類的使用者就不必了解 Person 類的實作細節.
同時如果類的實作者修改了字段的名字, 類的調用者不需要做出任何修改(這時候類的調用者根本通路不到 name, age這樣的字段).
private 不光能修飾字段, 也能修飾方法
通常情況下我們會把字段設為 private 屬性, 但是方法是否需要設為 public, 就需要視具體情形而定. 一般我們希望一個類隻提供 “必要的” public 方法, 而不應該是把所有的方法都無腦設為 public.
當我們使用 private 來修飾字段的時候, 就無法直接使用這個字段了.
1. getName 即為 getter 方法, 表示擷取這個成員的值.
2.setName 即為 setter 方法, 表示設定這個成員的值.
3.當set方法的形參名字和類中的成員屬性的名字一樣的時候,如果不使用this, 相當于自指派. this 表示目前執行個體的引用.
4.不是所有的字段都一定要提供 setter / getter 方法, 而是要根據實際情況決定提供哪種方法.
5.在 IDEA 中可以使用 alt + insert (或者 alt + F12) 快速生成 setter / getter 方法. 在 VSCode 中可以使用滑鼠右鍵菜單 -> 源代碼操作 中自動生成 setter / getter 方法.
構造方法是一種特殊方法, 使用關鍵字new執行個體化新對象時會被自動調用, 用于完成初始化操作.
new 執行過程
為對象配置設定記憶體空間
調用對象的構造方法
文法規則
1.方法名稱必須與類名稱相同
2.構造方法沒有傳回值類型聲明
3.每一個類中一定至少存在一個構造方法(沒有明确定義,則系統自動生成一個無參構造)
- 如果類中沒有提供任何的構造函數,那麼編譯器會 預設 生成一個不帶有參數的構造函數
- 若類中定義了構造方法,則預設的無參構造将不再生成.
- 構造方法支援重載. 規則和普通方法的重載一緻.
![]()
【Java】終于可以給自己new對象了——Java類和對象🗽類的成員
![]()
【Java】終于可以給自己new對象了——Java類和對象🗽類的成員 我們會發現在構造函數的内部,我們可以使用this關鍵字,構造函數是用來構造對象的,對象還沒有構造好,我們就使用了this,那this還代表目前對象嗎?當然不是,this代表的是目前對象的引用,對象雖然還沒構造好,但是系統在new過程的第一步時已經為對象配置設定好了記憶體空間,是以有是位址可以引用的。![]()
【Java】終于可以給自己new對象了——Java類和對象🗽類的成員
字段的初始化方式有:
1. 就地初始化
2. 使用構造方法初始化
3. 使用代碼塊初始化
前兩種方式前面已經學習過了, 接下來我們介紹第三種方式, 使用代碼塊初始化.
使用 {} 定義的一段代碼.
根據代碼塊定義的位置以及關鍵字,又可分為以下四種:
普通代碼塊
構造塊
靜态塊
同步代碼塊(後續講解多線程部分再詳細介紹)
![]()
【Java】終于可以給自己new對象了——Java類和對象🗽類的成員
![]()
【Java】終于可以給自己new對象了——Java類和對象🗽類的成員
![]()
【Java】終于可以給自己new對象了——Java類和對象🗽類的成員 ![]()
【Java】終于可以給自己new對象了——Java類和對象🗽類的成員
一個類可以産生無數的對象,類就是模闆,對象就是具體的執行個體。
類中定義的屬性,大概分為幾類:類屬性,對象屬性。其中被static所修飾的資料屬性稱為類屬性, static修飾的方法稱為類方法,特點是不依賴于對象,我們隻需要通過類名就可以調用其屬性或者方法。
類變量也叫靜态變量,也就是在變量前加了static 的變量;
執行個體變量也叫對象變量,即沒加static 的變量;
差別在于:
類變量和執行個體變量的差別在于:類變量是所有對象共有,其中一個對象将它值改變,其他對象得到的就是改變後的結果;
而執行個體變量則屬對象私有,某一個對象将其值改變,不影響其他對象;
靜态代碼塊優先執行個體代碼塊執行,執行個體代碼塊優先構造函數執行。
this關鍵字代表的是目前對象的引用。并不是目前對象。
靜态資料可以直接通過類通路,也可以通過執行個體化的對象通路