一、面向對象(類和對象)
1.1 萬事萬物皆對象
? ? ? ? 類:對對象向上抽取出像的部分、公共的部分以此形成類,類就相當于一個模板。
? ? ? ? 對象:模板下具體的產物可以理解為具體對象,對象就是一個一個具體的實例,就相當于這個模板下具體的產品。
? ? ? ? Java中一般先定義類,再創建對象
1.2 類和對象的關系
(1)類的定義
- 給類起一個見名知意的名字,首字符大寫,駝峰命名原則,
- 類的特性編寫,特性即類的屬性部分。
- 類的行為編寫,行為即類的方法部分。
(2)類和對象的創建以及使用
類的定義
public class Person {// 特性編寫-屬性-名詞(只定義和業務邏輯相關的代碼)String name; // 姓名int age; // 年齡double height; // 身高// 行為編寫-方法-動詞// 定義一個學習的方法public void study() {System.out.println("study>>>>>>");}
}
對象的創建和使用類
public class Test {// 程序的入口public static void main(String[] args) {// 對Person類的對象進行創建:創建了一個Person對象,名字叫p1Person p1 = new Person();// 對屬性進行賦值操作p1.name = "張三";p1.age = 18;p1.height = 178.5;// 讀取屬性System.out.println(p1.name);System.out.println(p1.age);// 調用對象的方法p1.study();}
}
二、構造器
2.1 構造器的作用
? ? ? ? 對于一個類來說,一般有三種常見的成員:屬性、方法、構造器。這三種成員都可以定義零個或多個。
? ? ? ? 構造方法也叫構造器,是一個創建對象時被自動調用的特殊方法,用于對象的初始化。Java通過new關鍵字來調用構造器,從而返回該類的實例。
2.2 構造器聲明格式
????????若無參數列表,稱之為無參構造器(空構造器)
????????若有參數列表,稱之為有參構造器
2.3 構造器四要點
- 構造器的方法名必須和類名一致
- 構造器通過new關鍵字調用
- 構造器不能定義返回值類型,不能在構造器里使用return關鍵字來返回某個值。
- 如果我們沒有定義構造器,則編譯器會自動定義一個無參的構造方法。如果已定義則把編譯器不會自動添加
2.4 構造器的重載
? ? ? ? 構造方法也是方法,只不過有特殊的作用而已。與普通方法一樣,構造方法也可以重載。
2.5 創建構造器的快捷鍵
8Alt + Insert
2.6 代碼示例
Person類
// 特性編寫-屬性-名詞(只定義和業務邏輯相關的代碼)
String name; // 姓名
int age; // 年齡
double height; // 身高// 行為編寫-方法-動詞
// 定義一個學習的方法
public void study() {System.out.println("study>>>>>>");
}
// 定義一個構造器
public Person() {System.out.println("調用了一個空構造器");
}
// 重載一個構造器
// 構造器的參數名字:如果和屬性名字重名,就會發生就近原則
// 如果重名以后,你想給屬性賦值,那么就在想要表達屬性的變量前加上 this. 修飾
public Person(int age, String name, double height) {this.age = age;this.name = name;this.height = height;
}
Test02對象
public class Test02 {public static void main(String[] args) {// 創建一個Person類的對象/* new Person()解釋Person():空的構造方法new關鍵字:對方法進行調用=》構造器作用:底層會幫我們創建對象,在創建對象之后進行初始化操作如果一個類沒有顯示編寫構造器的話,那么系統會為這個類默認分配一個空構造器調用構造器以后,對對象進行初始化操作,將對象的地址返回給p盡量要保證空構造器的存在,因為某些框架底層需要空構造器,如果你沒有添加就會報錯*//*原始寫法Person p = new Person();p.age = 18;p.name = "小張";p.height = 180.6;Person p2 = new Person();p2.age = 18;p2.name = "小李";p2.height = 160.6;*/// 簡便寫法Person p = new Person(18,"小張",180.6);System.out.println(p.age);Person p2 = new Person(30, "小李",160.6);System.out.println(p2.age);// 如果一個類中有構造器,那么系統就不會為你分配默認的構造器// Person p3 = new Person(); // 會報錯}}
三、面向對象(封裝)
3.1 封裝的思想
? ? ? ? 我們程序設計追求“高內聚,低耦合”。
- 高內聚:類的內部數據操作細節自己完成,不允許外部干涉;
- 低耦合:僅對外暴露少量的方法用于使用。
? ? ? ? 隱藏對象內部的復雜性,只對外公開簡單的接口。便于外界調用,從而提高系統的可擴展性、可維護性,提高程序的安全性。通俗的說,把該隱藏的隱藏起來,該暴露的暴露出來。這就是封裝的設計思想。?
3.2 代碼
Gril類
public class Gril {// 屬性private int age; // private表示私有屬性,只能在內部訪問// 封裝思想的使用:// 給age提供一個賦值方法:public void setAge(int age) {if (age > 30) {this.age = 18;} else {this.age = age;}}// 給age提供一個讀取的方法public int getAge(){return age;}
}
?Test對象調用Gril類
public class Test {public static void main(String[] args) {// 創建對象Gril g = new Gril();g.setAge(18);System.out.println(g.getAge());}
}
3.3?上述封裝代碼的解釋
? ? ? ? 上述代碼以屬性為案例進行封裝:
(1)將屬性私有化,被private修飾--》加入權限修飾符(一旦加入了權限修飾符,其他人就不能隨意的獲取這個屬性)
(2)提供public修飾的方法讓別人來訪問/使用
(3)即使外界可以通過方法來訪問屬性了,但是也不能隨意訪問,因為程序員可以在方法中加入限制條件。
四、面向對象(繼承)
4.1 類是對對象的抽象
4.2 繼承是對類的抽象
?4.3 繼承的格式和好處
(1)繼承的格式
子類 extends 父類
public class student extends Person {}
(2)繼承的好處
- 提高了代碼的復用性;
- 便于代碼的擴展;
- 為了多態的使用,是多態使用的前提
4.4 代碼示例
Person繼承類
public class Person {// 父類的公共屬性:private int age;private String name;private double height;//父類的公共方法:public int getAge() {return age;}public void setAge(int age) {this.age = age;}public String getName() {return name;}public void setName(String name) {this.name = name;}public double getHeight() {return height;}public void setHeight(double height) {this.height = height;}// 吃飯public void eat() {System.out.println("人類可以吃飯!!");}//睡覺public void sleep() {System.out.println("人類可以睡覺!!");}//喊叫public void shout() {System.out.println("人類可以喊叫!!");}
}
Student類
public class Student extends Person {// 定義子類額外的、擴展的屬性private int sno;// 定義子類額外的、擴展的方法public int getSno() {return sno;}public void setSno(int sno) {this.sno = sno;}// 學習:public void study() {System.out.println("學生可以學習");}
}
Test對象?
public class Test {public static void main(String[] args) {// 定義一個子類具體的對象:Student s = new Student();s.setSno(10000);s.setAge(18);s.setName("張三");s.setHeight(180.3);s.study();s.eat();s.shout();s.sleep();}
}
4.5 方法的重寫
? ? ? ? 方法的重寫是基于繼承來的
方法重寫的定義:
? ? ? ? 發生在子類和父類中,當子類對父類提供的方法不滿意的時候,要對父類的方法進行重寫。
? ? ? ? 一旦子類對父類的方法進行了重寫,對象訪問的時候,就只能訪問到子類的方法(就近原則)。
方法的重寫有嚴格的格式要求:
? ? ? ? ?子類的方法名和父類必須一致,參數列表(個數,類型,順序)也要和父類一致。
代碼
Person繼承類
public class Person {public void eat(){System.out.println("人可以吃飯");}
}
Student類
public class Student extends Person {// 方法的重寫public void eat(){System.out.println("我喜歡吃燒烤");}
}
Test對象
public class Test {public static void main(String[] args) {// 創建一個Student具體的對象Student s = new Student();s.eat();}
}
面試常問:
重載和重寫有什么區別?
重載:在同一個類中,當方法名相同,形參列表不同的時候,多個方法構成了重載。
重寫:在不同的類中,子類對父類提供的方法不滿意,對父類的方法進行重寫。
五、面向對象(多態)
5.1 多態的概念
? ? ? ? 多態:通俗來所,就是多種形態,具體點就是去完成某個行為,當不同的對象去完成時會產生出不同的狀態。同一種行為,不同的子類呈現出來的狀態是不同的。
? ? ? ? ps:多態跟屬性無關,多態指的是方法的多態,而不是屬性的多態。
5.2 多態的三要素和好處
? ? ? ? 多態三要素:繼承、重寫、父類引用指向子類對象
? ? ? ? 多態的好處:提高代碼擴展性
// 這里沒太理解,而且比較亂,可以看一下項目中的java10下面的示例
六、異常處理
6.1 什么是異常
? ? ? ? 異常就是在程序的運行過程中所發生的不正常的事件,它會中斷正在運行的程序。
- 所需要的文件找不到
- 網絡連接不同或中斷
- 算術運算錯(被零除...)
- 數組下標越界
- 裝載一個不存在的類或者對null對象操作
- 類型轉換異常
- ........
? ? ? ? Java提供異常處理機制。它將異常處理代碼和業務代碼分離,使程序更優雅,更好的容錯性,高健壯性。
? ? ? ? Java的異常處理是通過5個關鍵字來實現的:try、catch、finally、throw、throws?
6.2 程序中異常演示
6.3 try-catch-finally
public static void main(String[] args) {try {// 求兩個數的商int num1 = 12;int num2 = 2;System.out.println("兩個數的商為:"+ num1/num2);} catch (Exception ex){System.out.println("你的程序出現了錯誤"+ ex);} finally {System.out.println("程序無論是否出現異常,這里的邏輯都必須執行");}System.out.println("上面是兩個數相除的邏輯案例1");
}
try-catch執行情況
情況1:try塊中代碼沒有出現異常
? ? ? ? 不執行catch塊代碼,執行catch塊后邊的代碼
情況2:try塊中代碼出現異常,catch中異常類型匹配(相同或者父類)
? ? ? ? Java會生成相應的異常對象,Java系統尋找匹配的catch塊,執行catch塊后面的代碼。try塊中尚未執行的語句不會執行。
情況3:try塊代碼出現異常,catch中異常類型不匹配
? ? ? ? 不執行catch塊代碼,不執行catch塊后面的代碼,程序會中斷運行
catch塊中如何處理異常
? ? ? ? 其中一種方式:自定義內容輸出
6.4 throw/throws
throw/throws的使用
public class Test02 {public static void main(String[] args) {try {devide();} catch (Exception e) {System.out.println("在調用時處理異常");}}// 提取一個方法:兩個數相除操作public static void devide() throws Exception {int num1 = 12;int num2 = 0;if(num2 == 0){// 人為制造一個異常/** 第一種拋異常的方式:try {throw new Exception();} catch (Exception e) {throw new RuntimeException(e);}*/throw new Exception();}System.out.println("兩個數的商是" + num1/num2);}
}
?throw和throws的區別
(1)位置不同
? ? ? ? throw:方法內部
? ? ? ? throws:方法的簽名處,方法的聲明處
(2)內容不同:
? ? ? ? throw+異常對象
? ? ? ? throws+異常的類型
(3)作用不同:
? ? ? ? throw:異常出現的源頭,制造異常。
? ? ? ? throws:在方法的聲明處,告訴方法的調用者,這個方法中可能會出現我聲明的這些異常。然后調用者對這個異常進行處理:要么自己處理,要你再繼續向外拋出異常。
七、集合
7.1 對比數組的缺點引入集合
(1)數組一旦指定了長度,那么長度就被確定了,不可以更改。
(2)刪除、增加元素效率低(如果改變數組中其中一項,后面的項都要跟著變)
(3) 數組中實際元素的數量是沒法獲取到的,沒有提供對應的方法或者屬性來獲取。
(4)數組存儲:有序,可重復,對于無序的,不可重復的場合數組不能滿足要求。
7.2 集合體系預覽
7.3 ArrayList集合的使用
public static void main(String[] args) {// 定義一個集合ArrayList<String> list = new ArrayList<String>();// 增加元素:list.add("aaa");list.add("bbb");list.add("ccc");list.add("ddd");System.out.println(list); // [aaa, bbb, ccc, ddd]// 刪除元素:list.remove("ccc");System.out.println(list); // [aaa, bbb, ddd]// 修改元素:list.set(0, "eee");System.out.println(list); // [eee, bbb, ddd]// 查看元素:System.out.println(list.get(0)); // eee// 遍歷當前集合// 使用普通的for循環for (int i = 0; i < list.size()-1; i++) {System.out.println(list.get(i));}
}
增加元素 | list.add("aaa"); |
刪除元素 | list.remove("ccc"); |
修改元素 | list.set(0, "eee"); |
查找元素 | System.out.println(list.get(0)); |
遍歷元素 | for (int i = 0; i < list.size()-1; i++) { |
八、項目總結實戰?
8.1 需求設計
? ? ? ? 項目名稱:小張書城
? ? ? ? 項目需求設計:
項目任務 | 涉及技能點 |
---|---|
1、展示書籍 2、上新書籍 3、下架書籍 4、推出應用 | 用戶交互-鍵盤錄入 分支結構、循環結構 面向對象思維封裝對象(如何合理定義類) 集合的使用 |
8.2 項目代碼實現
Books集合
public class Books {// 書籍相關// 書籍類的 屬性// private修飾符:只允許內部訪問,外部無法訪問該屬性// 書籍編號private int bNo;// 書籍名稱private String bName;// 書籍作者private String bAuthor;//快捷鍵:alt + insert 快速創建get和set方法public int getbNo() {return bNo;}public void setbNo(int bNo) {this.bNo = bNo;}public String getbAuthor() {return bAuthor;}public void setbAuthor(String bAuthor) {this.bAuthor = bAuthor;}public String getbName() {return bName;}public void setbName(String bName) {this.bName = bName;}// 構造器public Books(int bNo, String bName, String bAuthor) {this.bNo = bNo;this.bName = bName;this.bAuthor = bAuthor;}// 空構造器public Books() {}
}
Test對象
package com.study.java13;
import java.awt.print.Book;
import java.util.ArrayList;
import java.util.Scanner; // 告訴程序這個類在什么位置/*
【小張書城】項目功能規劃:
1.展示書籍
2.上新書籍書籍信息:書籍編號 書籍名稱 書籍作者01 小張的Java之路 小張快跑 ----》 封裝成一個具體的書籍對象 ---》類:書籍
3.下架書籍
4.退出應用*/
public class Test {public static void main(String[] args) {// 創建一個集合:用于存放相同的個體(列表用來存放書籍)--》書籍對象 --》注意作用范圍:將list放在循環外面ArrayList list = new ArrayList(); // 空集合while (true){// 打印菜單:System.out.println("-------歡迎來到【小張書城】-------");System.out.println("1.展示書籍");System.out.println("2.上新書籍");System.out.println("3.下架書籍");System.out.println("4.退出應用");// 借助Scanner類:Scanner sc = new Scanner(System.in); // 掃描鍵盤錄入事件類// 給一個友好的提示System.out.println("請錄入你想要執行的功能的序號:");// 利用鍵盤,錄入序號:int choice = sc.nextInt(); // 接收鍵盤錄入的事件// 根據choice錄入的功能序號,進行后續的判斷if(choice == 1){System.out.println("<展示書籍>");// 展示書籍(對集合進行遍歷查看)for (int i = 0; i < list.size(); i++) {Books b = (Books)(list.get(i)); // Java 語言中的類型轉換System.out.println(b.getbNo() + "------" + b.getbName() + "------" + b.getbAuthor() + "------");}}if(choice == 2){System.out.println("<上新書籍>");// 從鍵盤錄入書籍信息System.out.println("請錄入書籍編號:");int bNo = sc.nextInt(); // 獲取家鍵盤int類型數據System.out.println("請錄入書籍名稱:");String bName = sc.next(); //獲取家鍵盤String類型數據System.out.println("請錄入書籍作者:");String bAuthor = sc.next(); //獲取家鍵盤String類型數據// 每上新一本書,就要創建一個書籍對象Books b = new Books();b.setbNo(bNo);b.setbName(bName);b.setbAuthor(bAuthor);list.add(b); // 添加個體到集合中去}if(choice == 3){System.out.println("<下架書籍>");// 錄入要下架的書籍的編號System.out.println("請錄入你要下架的書籍的編號:");int deNo = sc.nextInt();// 下架編號對應的書籍for (int i = 0; i < list.size(); i++) {Books b = (Books)(list.get(i));if(b.getbNo() == deNo){ // 如果遍歷的書籍編號和錄入的要刪除的書籍編號一致,那么從集合中移除該書籍即可list.remove(b);System.out.println("書籍下架成功");break; // 如果下架成功,就停止遍歷,不需要后續的遍歷}}}if(choice == 4){System.out.println("<退出應用>");break; // 停止正在執行的循環}}}
}