面向對象
編程思想
1. 面向過程的編程思想
解決問題的時候按照一定的過程(流程)
鐘點工—> 大象裝冰箱 總共分幾步
1.開門 2.大象裝裏面 3.關門
以過程爲本–複用–增加了很多冗餘
大段的過程 拆分成小段 — 到底是哪一個實體來做的
2.面向對象的編程思想
解決問題的時候按照現實生活中的規律來考慮問題
考慮在這個問題的過程中 有幾個實體參與進來
理解爲 實體動作動作的支配者 沒有實體動作就發生不了
人 冰箱 大象
分析每一類個體都有什麼特點 做了哪些事情
大象 特點 大 體重很重
冰箱 特點 有門 容積
人 特點 能做事情 做了哪些事情呢 ? 開冰箱門 裝大象 關門
面向對象
1. 類和對象
類----人類 抽象籠統的概念 描述一類事物 肯定是具有相同的特徵行爲
人類有名字 有年齡 有性別-----靜態描述特徵(特徵)-----屬性
人類能吃飯 能說話 能學習-----動態動作行爲(做事)-----方法
對象–具體的人 人類中的一個具體的人 鄭中拓
鄭中拓這個具體的人 有名字 有年齡 有性別
能吃飯 能說話 能學習
在現實生活中 對象是先有的 總結出來的概念(類) 後產生的
在計算機中利用面向對象的思想來做事
需要先自己定義(描述)一個類(型)
想要做事情 需要在描述的類中創建一個具體的個體(對象)出來
個體(對象)來做事
2. 如何在計算機中創建(描述)一個類
1.先創建一個類class
2.類的裏面 利用屬性或方法去描述這個類
3.創建一個當前類的對象 讓對象調用屬性/方法做事 對象的創建在哪兒都可以
public class Person {
//這個文件是在計算機內 畫的一張圖紙
//描述計算機裏的人類長成什麼樣子
//屬性--靜態描述特點
// 必要的組成部分
// 修飾符 數據類型 屬性名字 [= 值];
public String name;//全局變量
public int age;
public String sex;//
//*方法--描述可以做什麼事情(動作)
}
3. 類中的成員
類中的四個成員
- 屬性 – 靜態描述特徵(存值)
權限修飾符 [特徵修飾符] 屬性類型 屬性名字 [= 值]; - 方法 – 動態描述行爲(做事情)
權限修飾符 [特徵修飾符] 返回值類型 方法名字 ([參數列表]) [拋出異常] [{方法體}]
最主要的是方法設計的參數及返回值問題 傳遞 調用 執行 內存 - 構造方法 – 創建當前類對象(做事情 唯一的事情)
權限修飾符 與類名相同的方法名 ([參數列表]) [拋出異常] {方法體} - 程序塊 – 一個特殊的方法(沒名 做事情 不用我們調用 構建對象之前調用)
{方法體}
3.1 屬性
權限修飾符 [特徵修飾符] 屬性類型 屬性名字 [= 值];
3.2 方法
方法---->做一件事情
權限修飾符 [特徵修飾符] 返回值類型 方法名字 (參數列表) [拋出異常] [{
方法體
}]
權限修飾符 返回值類型 方法名字 (參數列表) {
}
1.無參數無返回值
2.無參數有返回值
3.有參數無返回值
4.有參數有返回值
人類有名字 有年齡 有性別----屬性
人類能吃飯 能說話 能學習----方法
方法中最主要的兩個結構 方法的參數列表 方法的返回值類型
方法體 可以理解爲方法是做了一件事情
返回值 可以理解爲返回值是這件事情做完了 留下的一個結果
返回值又有 基本數據類型 引用數據類型的區別 (詳情見練習1)
參數 可以理解爲參數是做事情之前 必須提供的條件(可以多個)
3.3 構造方法
構造方法—做事情
- 作用: 只有一個 構建(構造)當前類的對象
- 寫法: 權限修飾符 與類名一致的方法名 (參數列表) [拋出異常]{
一件事情 創建一個對象(當前類Person)
返回對象;
} - 用法: 通過new關鍵字調用
- 特點:
- 每一個類都有構造方法,若自己在類中沒有定義,系統會默認提供一個無參數的構造方法
若在類中自己定義了構造方法,則默認無參數的構造方法即被覆蓋 - 構造方法是否存在方法重載?----存在構造方法重載
- 每一個類都有構造方法,若自己在類中沒有定義,系統會默認提供一個無參數的構造方法
- 每一個類都有構造方法
若不定義 系統會默認提供構造方法
爲什麼要定義構造方法? 什麼時候需要設計構造方法?
在創建對象的同時 想要一併做一些事情 默認提供的構造方法是不會做的
這個時候我們可以自己定義構造方法(無參數的構造方法內做事 也可以定義帶參數的)
如果自定義了有參的構造方法 必須自己添加無參的構造方法(因爲添加有參構造方法後 系統就不會再默認添加無參構造方法)
3.4 程序塊(代碼塊)
- 作用: 跟普通方法一樣 做事情的
- 寫法: 可以認爲程序塊是一個 沒有修飾符 沒有參數 沒有返回值 沒有名字的特殊方法
{
} - 用法: 塊也需要調用才能執行 我們自己調用不到(沒有名字)
每一次我們調用構造方法之前 系統會幫我們自動的調用一次程序塊 讓他執行一遍 - 特點: 沒有什麼重載的概念(壓根連名字都沒有 連參數都沒有)
但是可以在類中定義 多個程序塊 - 塊可以在裏面寫一些程序 我想要在創建對象之前執行
overload—方法重載
- 概念:一個類中的一組方法 相同的方法名字 不同的參數列表 這樣的一組方法構成了方法重載
參數列表的不同體現在哪裏?
參數的個數 參數的類型 參數的順序 - 作用:爲了讓使用者便於記憶與調用 只需要記錄一個名字 執行不同的操作
- 自己也可以設計方法重載
調用方法的時候 首先通過方法名字定位方法
如果方法名字有一致 可以通過參數的數據類型定位方法
如果沒有與傳遞參數類型一致的方法 可以找一個參數類型可以進行轉化(自動) - JDK1.5版本之後 出現了一個新的寫法
int… x 動態參數列表 類型固定 個數可以動態 0–n都可以
x本質上就是一個數組 有length屬性 有[index]
動態參數列表的方法 不能 與相同意義的數組類型的方法構成方法重載 本質是一樣的
動態參數列表的方法 可以不傳參數 相當於0個 數組的方法 必須傳遞參數
動態參數列表在方法的參數中只能存在一份兒 且必須放置在方法參數的末尾
public class TestOverload {
public void test(int...x){//本質數組 int[] x = {1,2,3,4,5,6};
System.out.println("執行了test方法攜帶動態列表");
for(int i=0;i<x.length;i++){
System.out.println(x[i]);
}
}
public void test() {
System.out.println("執行了test方法沒有攜帶參數");
}
public void test(boolean b) {
System.out.println("執行了test方法帶boolean參數" + b);
}
public void test(char c) {
System.out.println("執行了test方法帶char參數" + c);
}
public void test(int i) {
System.out.println("執行了test方法帶int參數" + i);
}
public void test(String s) {
System.out.println("執行了test方法帶String參數" + s);
}
public static void main(String[] args) {
//1.創建對象
TestOverload to = new TestOverload();
to.test(1, 2, 3, 4);
to.test((char) 99);//方法參數傳遞 類型之間的轉化問題
//通過對象.方法名字 調用方法 可以直接通過方法名字定位方法
//如果方法名字一致 通過方法的參數列表類型 來定位方法
//2.通過對象調用方法 方法執行一遍
//to.test(true);//不傳參數 不行 傳參數 參數類型不匹配 不行
}
}
this關鍵字
構造方法中 屬性與變量重名 必須需要一個代替詞 代替對象
- this是一個關鍵字(指代詞) 代替的是某一個對象 (當前調用屬性或方法時的那個對象)
- this既然代替的是一個對象
this可以調用什麼? 屬性 方法 可以
this可以調用構造方法麼? 可以 在一個構造方法內可以調用另一個構造方法
通過this(); 省略了構造方法的名字(必須與類名一致)
必須在另一個構造方法內調用 必須在程序的第一行
構造方法 一般方法 有順序 認爲構造方法早於一般方法
在一般方法內調用構造方法呢? 不行
構造方法可以重載 構造方法 調用另一個構造方法呢? - this調用的過程可以放置在哪個位置寫?
調用屬性或方法 這一行代碼 可以放置在類中的任何成員位置 上下順序隨意
4. 命名規則和規約
- 規則
字母 數字 符號 中文
字母 區分大小寫
數字 不能開頭
符號 _ $
中文 不推薦使用 - 規約
類名字 首字母大寫 兩個單詞以上 每一個首字母都大寫
Test TestOne TestOneTwo
屬性/方法/變量 駝峯式命名規約 首字母小寫 兩個單詞以上 第二個以後的每一個首字母大寫
test testOne testOneTwo
構造方法 與類名一致 類中唯一的大寫字母開頭的方法
靜態常量 全部字母大寫 通過_做具體說明 BOOKSTORE_ADMIN
包名 全部字母小寫 Java關鍵字都是小寫 注意與關鍵字不要衝突
所有的名字最好—>見名知意(增強可讀性 層次關係縮進 見名知意 註釋)
5. 類的加載使用
類描述好了以後是不可以直接做事情
需要創建當前類的對象 通過new的方式
Person p = new Person();
通過p.調用啦 調用屬性(存值/取值) 調用方法(執行一次)
public class Person {
//這個文件是在計算機內 畫的一張圖紙
//描述計算機裏的人類長成什麼樣子
//屬性--靜態描述特點
// 必要的組成部分
// 權限修飾符 [特徵修飾符] 數據類型 屬性名字 [= 值];
public String name;//全局變量
public int age;
public String sex;//
//*方法--描述可以做什麼事情(動作)
//設計一個方法 用來描述人類可以做吃飯這件事情
public void eat(){
System.out.println("吃了一碗大米飯");
}
//設計一個方法 用來告訴別人我的名字 "鄭中拓"
//若方法的設計規定了返回值類型 方法內必須通過return關鍵字返回一個值
public String tellName(){
System.out.println("你們問我叫什麼呀?勉強告訴你們一下");
return "鄭中拓";//只有一個
}
//設計一個新的吃飯方法
//描述人類可以做吃飯飯這件事情
public void chiFanFan(int count,String something){
System.out.println("吃了"+count+"碗"+something);
}
//設計一個方法 買飲料 1.需不需要提供條件 2.需不需要給別人留下什麼結果
// 需要提供條件 錢
// 需要返回值 買到的飲料 名字
public String buyDrink(int money){
if(money>5){
return "紅牛";
}else{
return "礦泉水";
}
}
}
調用
public class Test {
//這個類沒有什麼現實意義
//只是爲了將主方法寫在這裏
public static void main(String[] args){
// 1.創建一個對象 人類的對象
Person p = new Person();
p.drawStar(5,true);
String drinkName = p.buyDrink(10);
System.out.println("買到了一瓶:"+drinkName);
p.chiFanFan(2,"麪條");
String myName = p.tellName();
System.out.println("接收到了tellName方法的返回值:"+myName);
}
}
5.1形參和實參
形參可以理解爲是方法執行時的臨時變量空間 x
實參可以理解爲是方法調用時傳遞進去的參數 a
方法調用時會將實參的內容傳遞給形參
如果內容是基本類型 傳遞的 是值 形參改變 實參不變
如果內容是引用類型 傳遞的 是引用 形參改變 實參跟着改變
詳情案例見練習1