物件導向

不比真如一相会發表於2024-03-09

day07 總結筆記

01-物件導向介紹

  • 物件導向並非是一個技術, 而是一種程式設計的思想

    • 這種思想可以指導我們以什麼思路解決問題, 以什麼思路來組織程式碼

  • 問題 : 為什麼要學習這種思想 ?

因為這套思想, 來源於生活, 生活中解決問題, 就是一系列的物件, 在一起打交道, 從而將問題解決.
所以我們希望寫程式碼解決問題的時候, 也能按照生活中的這種思想
這樣的話, 程式設計就會更加貼切於生活, 程式也會更加便於讓人理解.

舉例1: 解決隨機數的問題 ---> Random物件
舉例2: 解決鍵盤錄入的問題 ---> Scanner物件
舉例3: 封裝學生資料 ---> Student物件
  • 物件導向我們學什麼 ?

    • 學習自己如何設計物件

    • 學習已有的物件如何使用 (API章節)

  • 萬物皆物件

    • 生活中的任何一種事物, 都可以透過程式碼, 將其描述為物件

02-類和物件

  • 前提 : Java中想要建立物件, 必須現有類的存在

  • 類的介紹 :

    • 一組相關屬性和行為的集合, 將其理解為是物件的一張設計圖

  • 物件的介紹 :

    • 物件是根據類 (設計圖), 建立出來的實體

  • 類和物件的關係 :

    • 依賴關係 : 需要根據類, 建立物件

    • 數量關係 : 根據一個類, 可以建立出多個物件

  • 類的組成 :

屬性 : 在程式碼中使用成員變數表示, 成員變數跟之前定義變數的格式一樣, 只不過位置發生了改變 (類中方法外)

行為 : 在程式碼中使用成員方法表示, 成員方法跟之前定義方法的格式一樣, 只不過去掉了 static 關鍵字
  • 類的設計

    • 知道什麼設計為屬性, 什麼設計為行為

- 描述事物的一些[名詞], 設計為屬性
- 描述事物的一些[動詞], 設計為行為

舉例1: 我有一個{學生}叫做<張三>, 今年<23歲>, <180的身高>, 平時沒什麼特殊愛好, 就喜歡(吃飯)和(學習).
舉例2: 前陣子我買了一臺<白色>的<海爾>{洗衣機}, 花了<1999塊錢>, (洗衣服)和(甩幹)確實方便.
public class Student {
// 屬性: 姓名, 年齡
String name;
int age;

// 行為: 吃飯, 學習
public void eat(){
System.out.println("吃飯");
}

public void study(){
System.out.println("學習");
}
}
  • 物件的建立和使用

    • 思路 : 當物件建立完畢後, 呼叫內部的成員, 都是拿著物件名 . 出來的

建立物件的格式 : 類名 物件名 = new 類名();

Student stu = new Student();
System.out.println(stu); // com.itheima.oop.Student@233ac477

使用物件成員變數的格式 : 物件名.變數名;

stu.name = "張三";
stu.age = 23;

System.out.println(stu.name);
System.out.println(stu.age);

使用物件成員方法的格式 : 物件名.方法名();

stu.eat();
stu.study();
  • 細節補充 :

1. 我們在定義類的時候, 成員變數通常不賦值.
(等物件建立完畢後, 再給成員變數賦值)

2. 成員變數沒有賦值, 也可以直接使用, 使用的是預設值

03-物件的記憶體圖

  • 務必開啟 ppt 將內部流程梳理清楚

    • 目標 : 今後編寫了建立物件的程式碼, 腦海中就要有堆的記憶體圖

    Student stu = new Student();

04-成員變數和區域性變數的區別

  • 類中位置不同 :

    • 成員變數 : 方法外

    • 區域性變數 : 方法內

  • 初始化值不同 :

    • 成員變數 : 有預設初始化值

    • 區域性變數 : 沒有預設初始化值, 使用之前必須完成賦值

  • 記憶體位置不同 :

    • 成員變數 : 堆記憶體

    • 區域性變數 : 棧記憶體

  • 生命週期不同 :

    • 成員變數 : 隨著物件的建立而存在, 隨著物件的消失而消失

    • 區域性變數 : 隨著方法的呼叫而存在, 隨著方法的執行結束而消失

  • 作用域 :

    • 都在自己所屬的大括號中有效

05-this 關鍵字

  • 情況 : 當區域性變數和成員變數重名

    • Java會根據就近原則, 優先使用區域性變數

  • 問題 : 非要使用成員變數, 怎麼辦 ?

  • 回答 : 使用this關鍵字進行區分

class Student {
int num = 10;

public void show(){
int num = 20;
System.out.println(num); // 20
System.out.println(this.num); // 10
}
}
  • this可以解決的問題 : 區分區域性變數和成員變數的重名問題

  • this的作用 :

this可以呼叫自己本類的成員

this.本類成員變數;
this.本類成員方法();
-------------------------------------------------

省略規則 :

this.本類成員方法() : this.可以直接省略
this.本類成員變數 : 如果區域性變數和成員變數沒有重名, this.可以省略不寫
class Student {
int num = 10;

public void show(){
System.out.println(this.num); // 10
this.print();
}

public void print(){
...
}
}

06-構造方法

  • 介紹 : 構造方法又名構造器

    • 構建, 創造一個物件要呼叫的方法

    • 簡單記 : 構造方法就是用於建立物件的方法

  • 格式 :

1. 方法名與類名相同, 大小寫也要一致
2. 沒有返回值型別, 連 void 都沒有
3. 沒有具體的返回值 (不能透過 return 語句帶回結果資料)
public class Student {
public Student(){
System.out.println("我是Student類的空引數構造方法");
}
}
  • 構造方法的執行時機 :

    • 在建立物件的時候, 被呼叫執行

    • 每建立一次物件, 就會執行一次構造方法

  • 構造方法的作用 :

    • 本質作用 : 用來建立物件

    • 結合執行時機 : 在建立物件的時候, 給成員變數初始化

public class Student {

String name;
int age;

public Student(String name, int age){
this.name = name;
this.age = age;
}
}


Student stu = new Student("張三", 23);
  • 構造方法的注意事項 :

    • 如果一個類中沒寫構造方法, 系統將會給出一個 [預設的] [無引數的] 構造方法

    • 如果手動編寫了構造方法, 系統就不會給出那個預設的無參構造了

      • 建議 : 無參構造, 帶參構造, 全部手動給出.

    • 構造方法不允許手動呼叫

      • stu.Student(); 錯誤呼叫

07-封裝思想 (很重要)

  • 物件導向有三大特徵 :

    • 封裝

    • 繼承

    • 多型

  • 封裝思想介紹 :

    • 隱藏實現細節, 僅對外暴露公共的訪問方式

      • 結合插線板理解

  • 封裝在程式碼中常見的體現 :

    • 將屬性抽取到類中, 是對資料做了封裝

    使用封裝前 : 維護一個使用者資訊, 定義了5個變數, 資料過於零散

    String id = "001";
    String name = "張三";
    int age = 23;
    String tel = "156****1234";
    String address = "北京";

    ----------------------------------------------------------

    使用封裝後 : 5個零散的資料, 就被封裝到了一個整體的物件中

    public class User {
    String id;
    String name;
    int age;
    String tel;
    String address;

    // 假設我寫了帶引數構造方法
    }

    User u1 = new User("001","張三",23,"156****1234", "北京");
    User u2 = new User("002","李四",23,"156****1244", "北京");
    • 將程式碼抽取到方法中, 是對程式碼功能進行了封裝

    程式設計師A : 編寫了一個遍歷列印陣列的方法

    public void printArray(int[] arr){
    ...
    }


    程式設計師B : 無需關心方法內部實現, 只要知道怎麼呼叫即可.


    以上過程, 就是程式設計師A, 將遍歷列印陣列這個功能程式碼, 封裝到了printArray方法中.

08-許可權修飾符

  • private : 同一個類中

  • (default) : 同一個類中, 同一個包中

  • protected : 就業班

  • public : 任意位置

09-標準 JavaBean (必掌握)

  • 所有成員變數 private 私有

  • 提供空參\帶參構造方法

  • 對於私有的成員變數, 提供對應的setXxx和getXxx方法

package com.itheima.test;

/*
標準 JavaBean :

1. 成員變數全部private私有

2. 提供空參\帶參構造方法

3. 提供對應的setXxx和getXxx方法
*/
public class Student {
private String name;
private int age;

public Student() {

}

public Student(String name, int age) {
this.name = name;
this.age = age;
}

public String getName() {
return name;
}

public void setName(String name) {
this.name = name;
}

public int getAge() {
return age;
}

public void setAge(int age) {
this.age = age;
}

}
package com.itheima.test;

public class StudentTest {
public static void main(String[] args) {
// 1. 空參構造建立物件, 透過setXxx方法完成賦值
Student stu1 = new Student();
stu1.setName("張三");
stu1.setAge(23);
System.out.println(stu1.getName() + "---" + stu1.getAge());

// 2. 帶參構造方法建立物件, 在建立的時候直接賦值
Student stu2 = new Student("李四", 24);
System.out.println(stu2.getName() + "---" + stu2.getAge());

// 重點強調: getXxx方法, 能夠得到的是真實的資料, 使用方式, 不要侷限在列印語句上
for(int i = 1; i <= stu2.getAge(); i++){
System.out.println("祝福" + stu2.getName() + "生日快樂!");
}

}
}

相關文章