##今日內容
面向對象概述
類和對象的關係
面向對象內存圖
private、this關鍵字和封裝
面向對象之構造方法
面向對象三大特徵
封裝
繼承
多態
##01. 面向過程和麪向對象思想概述
什麼是面向過程?
什麼是面向對象?
面向對象思想的好處是什麼?
總結: 1. 面向過程: 強調的是過程, 自己通過第一步, 第二步.. 一步步的自己去完成對應的需求. 2. 面向對象: 強調的是對象, 通過指揮對象去幫我們完成對應的需求. 3. 1. 面向對象是一種[思想], 更符合我們思考問題的一種習慣. (懶人習慣) 2. 將複雜的問題簡單化 3. 將我們從[執行者]的位置, 變成了[指揮者]. 結論: Java中講究萬物皆[對象] 可以通過Java代碼, 將現實生活的任意一種事物, 都看作爲是一個對象 因爲任何一種事物都會具備自己的一份[功能].
##02. 面向對象思想特點和舉例
舉例說明
總結: 懶人思想, 指揮對象去做某件事情. 買電腦: 面向過程:1. 上網學習各個參數的解釋 2. 瞭解各個品牌的性價比 3. 購買.. 面向對象:找一個[懂電腦的人]幫我去買 洗衣服:
鍋包肉:
##03. 類和對象的概述
如何通過java描述現實生活中事物
類是由什麼組成的?
類和對象的關係是什麼?
測試類 : 帶有main方法的類 類 : 基本類 -> 封裝[事物][數據]的一個類.
總結: 1. java中描述現實生活事物, 都是通過類的形式 學生事物 class Student{ } 車事物 class Car{ } 動物事物 class Animal{ } 2. 事物(類) : 屬性, 行爲 屬性 : 一個事物的描述信息 姓名, 年齡, 畢業院校... 行爲 : 該事物具體能做的功能 學習
問題: 屬性在代碼中如何表示? 使用[成員變量]進行表示 : 成員變量跟之前定義變量的格式一樣, 只不過位置發生了改變 [類中, 方法外]
// 當前的類是描述學生這個事物, 通過三個成員變量(屬性)進行了描述 public class Student { String name = "張三"; int age = 23; String school = "傳智專修學院";
public void study(){ System.out.println("學生學習"); } }
public class Car{ // 屬性 String pinpai = "奇瑞QQ"; double jiage = 50000; // 行爲 public void run(){ System.out.println("跑"); } }
問題: 行爲在代碼中如何表示? 使用的是[成員方法]進行表示 : 成員方法, 跟之前定義方法的格式一樣, 只不過去掉了static關鍵字.
3. 類僅僅是對事物進行了一個描述, 可以將類看做爲是一個設計圖紙 我們真正需要使用的是具體存在的事物. 類 : 描述 對象 : 具體存在的事物
結論 : 我們需要根據類, 去創建對象.
##04. 手機類的定義
屬性和行爲分別用什麼表示?
又該如何編寫?
總結: 1. 成員變量, 成員方法 屬性 : 品牌, 價格, 顏色 行爲 : 大電話, 發短信 2. public class Phone { /* 屬性 : 品牌, 價格, 顏色 行爲 : 打電話, 發短信 */ String brand; // 成員變量 : 跟之前定義變量的格式一樣, 只不過位置挪到了[類中方法外] double price; String color; // 成員方法 : 跟之前定義的方法格式一樣, 只不過去掉了static關鍵字 public void call(String name){ System.out.println("給" + name + "打電話"); } public void sendMessage(){ System.out.println("手機羣發羣信"); } }
成員變量和局部變量的區別:
1. 位置區別: 成員變量 : 類中方法外 局部變量 : 方法中, 或者是方法的聲明上(形參)
public static void main(String[] args){ int num = 10; // 方法中 System.out.println(num); } public static void method(int num){ // 方法的聲明上 System.out.println(num); } 鋪墊: 局部代碼塊, 局部內部類.. 只要是跟局部相關的, 都跟方法有關. 2. 初始化值的區別 : 成員變量 : 有默認初始化值. 局部變量 : 沒有默認初始化值, 使用之前必須完成賦值才能使用.
(這僅僅是一部分)
5分鐘時間練習
##05. 對象的使用
如何創建對象?
如何調用對象的屬性?
如何調用對象的行爲?
總結: 1. 類名 對象名 = new 類名(); Phone p = new Phone(); 2. 對象名.變量名; p.color = "黑色"; System.out.println(p.color);
3. 對象名.方法名(實際參數); p.call("張三"); p.sendMessage();
分析:
屬性: 品牌, 價格, 顏色 行爲: 打電話, 發短信 打電話的功能要求加入姓名 例如: 給張三打電話. 5分鐘時間自己編寫.
##06. 一個對象的內存圖
要求自己會畫
##07. 方法共用的內存圖
總結: 在一次程序的執行過程中如果創建了多個對象
.class文件只加載一次
字節碼文件只有一份, 所以多個對象, 使用的方法, 就是同一份方法.
擴展:
垃圾回收機制 Java語言有完善的垃圾回收機制, 會在不定時的時候對內存中的垃圾[自動]進行清掃 啥是內存中的垃圾? 當堆內存中數據[數組\對象]的地址值, 沒有任何一個變量記錄的時候, 該數據[對象], 就會變成垃圾對象. main(){ Phone p = new Phone(); // p = 0a1 p = null; }
##08. 兩個對象的內存圖(兩個引用指向同一個堆內存)
看圖說話
int[] arr = {11,22,33}; int[] arr2 = arr; Phone p1 = new Phone(); p1.color = "白色"; Phone p2 = p1; p2.color = "藍色"; System.out.println(p1.color); System.out.println(p2.color);
##09. 成員變量和局部變量的區別
總結:
A:位置不同
成員變量 : 類中方法外 局部變量 : 方法中, 或者是方法的聲明上(形參)
B:初始化值不同
成員變量 : 有默認初始化值 局部變量 : 沒有默認初始化值, 使用之前必須完成賦值才能使用.
C:生命週期不同
成員變量 : 隨着對象的創建而存在, 隨着對象的消失而消失 局部變量 : 隨着方法的調用而存在, 隨着方法的彈棧而消失
D:內存位置不同
成員變量 : 堆內存 成員變量所屬於對象, 所以在堆內存 局部變量 : 棧內存 局部變量所屬於方法, 所以在棧內存
E:作用域不同(編寫代碼) 成員變量 : 在整個類當中.
局部變量 : 僅在它所在的大括號中有效
main(){ for(int i = 1; i <= 10; i++){ System.out.println(i); } System.out.println(i); // 出現編譯錯誤. }
##10. private關鍵字的概述和特點
private權限修飾符可以修飾什麼?
被其修飾的(成員)有什麼特點?
總結: 1. 可以用來修飾[成員] 成員變量 成員方法 2. 只能在本類中進行訪問
class Student { // 原因: 就是爲了防止接受到一些錯誤的數據. private int age; // 提供: age的公共訪問方式 // 1. [設置的渠道] public void setAge(int a){ if(a >= 0 && a <= 200){ age = a; }else{ System.out.println("您的數據有誤"); } } // 2. [獲取的渠道] public int getAge(){ return age; } }
##11. private修飾後的[標準類]代碼
案例演示
5分鐘時間練習
public class TestPerson { public static void main(String[] args) { Person p = new Person(); p.setName("張三"); p.setAge(23); System.out.println(p.getName() + "..." + p.getAge()); } } class Person{ private String name; private int age; public void setName(String n){ name = n; } public String getName(){ return name; } public void setAge(int a){ age = a; } public int getAge(){ return age; } }
問題: setXxx和getXxx方法一定要成對兒出現嗎? setScore() getScore(); 總結: 不一定, 需要根據具體的業務去組織.
##12. this關鍵字的概述和使用
什麼是this關鍵字
this關鍵字的作用是什麼?
總結: 1. this: 代表當前對象的引用, 誰來調用我, 我就代表誰 對象的引用 : 對象的地址值.
2. 用來區分局部變量, 和成員變量的重名問題 3. 結論 : this.用來調用本類的成員.
public class Person{ private String name; public String getName(){ return name; // 實際上的代碼 : return this.name; } }
this內存原理
練習
(6分鐘) 定義一個學生類 屬性:姓名和年齡 生成對應的getter/setter方法 使用this關鍵字區分局部和成員變量 新建一個測試類測試學生類
##13. 封裝的概述和好處
概述下什麼是封裝?
封裝的好處又是什麼?
總結: 1. 隱藏實現細節, 僅對外暴露公共的訪問方式. 常見的封裝 : 私有成員變量, 對外提供公共的setXxx和getXxx方法. 注意: 私有僅僅是封裝的一種體現形式, 不能說封裝就是私有. 封裝是一個大的思想概念 : 1. 將一段代碼, 抽取到方法中, 這就是對代碼的一個封裝. 作爲調用者, 我不需要關注方法內部的實現原理, 我只需要關注怎樣調用
2. 將數據抽取到一個類當中, 這是對數據的一種封裝.
需求: 存儲學生信息(姓名, 年齡, 成績, 學校) class Student{ // 姓名, 年齡, 成績, 學校 } 2. 1. 提高了代碼的安全性 -> age : -23 2. 提高了代碼的複用性 -> 將一段代碼封裝到一個方法中, 對方法進行重複調用 ------------------------------ 封裝的弊端 : 1. 封裝本身沒什麼弊端, 如果有弊端存在, 只能說明該程序員寫的代碼太爛 2. 調用成員變量的時候, 稍微麻煩了一點. 不能直接對象名.屬性名調用, 需要調用setXxx和getXxx方法.
##14. 構造方法的概述和使用
什麼是構造方法?
構造方法的格式爲?
構造方法可以有return語句嗎?
總結: 1. 構建, 或者說是創造一個對象時候, 調用的方法
創建對象時候, 執行的方法. 如果一個類, 沒有構造方法, 將無法創建對象 Person p = new Person();
2. 1. 方法名與類名相同, 大小寫也要一致 2. 沒有返回值類型, 連void都沒有 3. 沒有具體的返回值 class Person{ public Person(){ System.out.println("我是空參構造方法"); return; } }
3. 構造方法可以寫return語句, 但是return不能跟具體的返回值, 只能用於結束方法.
問題: 構造方法在什麼時候被調用? 能不能手動調用? 創建對象的時候, 會由系統自動調用構造方法, 每創建一次對象, 就會執行一次構造方法. Person p1 = new Person(); p1.Person(); // 編譯錯誤 結論 : 構造方法不能手動調用, 只能是在創建對象的時候, 由系統自動調用.
問題: 構造方法的作用是什麼? 需要結構構造方法的執行時機進行思考 構造方法是在創建對象的時候, 就會執行的方法. 我們希望構造方法在執行的時候, 幫我們乾點活. 爲成員變量進行賦值
總結 : 用於給對象中的數據[屬性]進行初始化的.
##15. 構造方法的注意事項
構造方法注意事項?
構造方法能夠重載嗎?
給成員變量的兩種初始化方式有什麼區別?
總結: 1. 如果一個類當中沒有編寫任何構造方法, 系統將會提供一個默認的空參構造方法, 保證可以創建對象 class Person{ // 空參構造方法 // public Person(){} } Person p = new Person(); // 這句話不會出現編譯錯誤, 因爲在使用Person類的默認空參構造 但是如果手動編寫了構造方法, 系統將不會再提供那個默認的空參構造方法了 class Person{ String name; public Person(String name){ this.name = name; } }
Person p = new Person(); // 這句話就會產生編譯錯誤, 因爲手動給出了有參構造, 系統就不會提供那個默認的空參構造方法了
建議: 今後編寫代碼的時候, 空參有參構造, 都手動給出 2. 構造方法也是方法, 可以進行重載 3. 兩種初始化方式分別爲: 1. 有參構造初始化 2. setXxx初始化 這兩種方式一般都是配合使用的. 一般都會通過有參構造進行[初始化], 隨後通過setXxx方法[修改]屬性值. Student s = new Student("張三",23); s.setName("李四"); System.out.println(s.getName());
##16. 標準的學生類代碼編寫和測試
案例演示
5分鐘時間操作
1. 私有成員變量 2. 提供setXxx和getXxx方法 3. 提供空參有參構造