1130面向對象

1.設計對象並使用

1.1類和對象

類(設計圖)

類就是對現實事物的一種描述

類的組成
屬性:指事物的特徵,例如:手機事物(品牌,價格,尺寸)
行為:指事物能執行的操作,例如:手機事物(打電話,發短信)

對象(實際的物)

客觀存在的事物皆為對象 ,所以我們也常常説萬物皆對象。

類和對象的關係

類是對事物的一種描述,對象則為具體存在的事物

1.2類的定義

類的組成是由屬性和行為兩部分組成

屬性:在類中通過成員變量來體現(類中方法外的變量)
行為:在類中通過成員方法來體現(和前面的方法相比去掉static關鍵字即可)

類的定義步驟:

public class 類名 {//①定義類
	// ②編寫類的成員變量(表示類的屬性)
	變量1的數據類型 變量1;
	變量2的數據類型 變量2;
	…
	// ③編寫類的成員方法(表示類的方法)
	方法1;
	方法2;	
}

示例代碼:

public class Phone {
    //成員變量
    String brand;
    double price;
    //成員方法
    public void call() {
        System.out.println("打電話");
    }

    public void sendMessage() {
        System.out.println("發短信");
    }
}

1.3對象的使用

/*     創建對象
        格式:類名 對象名 = new 類名();
        範例:Phone p = new Phone();

    使用對象
        1:使用成員變量
            格式:對象名.變量名
            範例:p.brand
        2:使用成員方法
            格式:對象名.方法名()
            範例:p.call()
            */
public class PhoneDemo {
    public static void main(String[] args) {
        //創建對象
        Phone p = new Phone();
        System.out.println(p.brand);//打印"null"
        System.out.println(p.price);//打印"0.0"
        //給手機1賦值
        p.brand = "小米";
        p.price = 2999;
        //獲取手機1中的值
        System.out.println(p.brand);//打印"小米"
        System.out.println(p.price);//打印"2999"
        //使用成員方法
        p.call();
        p.sendMessage();

        //創建對象2
        Phone p2 = new Phone();
        //給手機2賦值
        p.brand = "蘋果";
        p.price = 8999;
        //獲取手機2中的值
        System.out.println(p.brand);//打印"蘋果"
        System.out.println(p.price);//打印"8999"
    }

1.4 some notes

Javabean類:用來描述一類事物的類,在Javabean類中,是不寫main方法的

測試類:編寫main方法的類. 我們可以在測試類中創建javabean類的對象並進行賦值調用

1.類名首字母建議大寫,需要見名知意,駝峯模式

2.一個Java文件中可以定義多個class類,且只能一個類是public修飾,而且public修飾的類名必須成為代碼文件名(實際開發中建議還是一個文件定義一個class類)

3.定義成員變量的完整格式:

//修飾符 數據類型 變量名稱 = 初始化值

一般無需指定初始化值,但是存在默認值


2.封裝

4.1 封裝思想

封裝是面向對象三大特徵之一(封裝,繼承,多態)

封裝告訴我們,如何正確設計對象的屬性和方法

封裝原則:對象代表什麼,就得封裝對應的數據,並提供數據對應的行為

理解封裝思想的好處?
1.讓編程變得很簡單,有什麼事,找對象,調方法就行。
2.降低我們的學習成本,可以少學、少記,或者説壓根不用學,不用記對象有哪些
方法,有需要時去找就行

封裝好處

通過隱藏對象的內部細節,只暴露公共的getter和setter方法,可以減少外部代碼對內部數據結構的依賴。

通過方法來控制成員變量的操作,提高了代碼的安全性
把代碼用方法進行封裝,提高了代碼的複用性

編寫getter和setter方法是Java中實現對象封裝、增強代碼健壯性和靈活性的重要手段。雖然對於簡單的屬性直接暴露可能看起來更簡潔,但從長遠來看,採用getter和setter能夠提升代碼的質量和可維護性。

封裝代碼實現
將類的某些信息隱藏在類內部,不允許外部程序直接訪問,而是通過該類提供的方法來實現對隱藏信息的操作和訪問
成員變量private,提供對應的getXxx()/setXxx()方法

4.2 private關鍵字

1.private是一個權限修飾符,可以用來修飾成員(成員變量,成員方法)

2.被private修飾的成員,只能在本類進行訪問

3.針對private修飾的成員變量,如果需要被其他類使用,提供相應的操作

  • 提供“get變量名()”方法,用於獲取成員變量的值,方法用public修飾
  • 提供“set變量名(參數)”方法,用於設置成員變量的值,方法用public修飾

如:

class Student {
    //成員變量
    String name;
    private int age;

    //提供get/set方法
    public void setAge(int a) {
        if(a<0 || a>120) {
            System.out.println("你給的年齡有誤");
        } else {
            age = a;
        }
    }

    public int getAge() {
        return age;
    }

    //成員方法
    public void show() {
        System.out.println(name + "," + age);
    }
}
//什麼時候需要加public:
//如果Student類需要被其他包中的類導入和使用,那麼就需要在類前面添加public修飾符。
//例如,如果有一個在不同包中的測試類需要創建Student對象並調用其方法,那麼Student類就必須是public的。
//
//總結:
//該Student類省略public修飾符,表明它被設計為只能在當前包內使用,這是一種合理的封裝策略,有助於控制類的可見範圍。
public class StudentTest {
    public static void main(String[] args) {
        //創建對象
        Student s = new Student();
        //給成員變量賦值
        s.name = "林青霞";
        s.setAge(30);
        //調用show方法
        s.show();
    }
}

兩個類的作用與區別

  1. Student類(業務類/實體類)
  • 這是一個實體類,用於封裝學生的數據(如姓名、年齡)和行為(如顯示信息)
  • 它定義了類的屬性、構造方法、getter/setter方法以及其他業務方法
  • 主要負責數據的存儲和相關業務邏輯的實現
  • 不包含程序的入口點(main方法)
  1. StudentTest類(測試類/主類)
  • 這是一個包含main方法的類,作為程序的入口點
  • 負責創建Student類的實例並測試其功能
  • 可以模擬用户交互或業務流程
  • 體現了"客户端代碼"如何使用我們定義的業務類

為什麼要分離這兩個類?

  1. 關注點分離
  • Student類專注於數據和業務邏輯
  • StudentTest類專注於程序的執行流程和測試
  1. 代碼複用
  • 當Student類需要在不同場景中使用時,可以被多個測試類或其他業務類引用
  • 如果將所有代碼都放在一個類中,這個類會變得臃腫且難以維護
  1. 更好的封裝和安全性
  • 業務類的內部實現細節對測試類是隱藏的(如Student類中的私有屬性age)
  • 測試類只能通過公開的方法(如setAge、getAge)與業務類交互
  1. 更符合面向對象的設計理念
  • 每個類都有明確的單一職責
  • 提高了代碼的可讀性和可維護性

實際開發中的應用

在實際開發中,這種模式更為明顯:

  • 實體類(如User、Product等)負責數據和核心業務邏輯
  • 測試類用於單元測試
  • 控制類(如Controller)用於處理請求並調用實體類的方法

這種分離設計使代碼結構更清晰,也更便於團隊協作開發。

3. this關鍵字

在Java中,當局部(或者形參)變量和成員變量重名的時候,在方法中使用this表示成員變量以示區分。

  • 方法的形參如果與成員變量同名,不帶this修飾的變量指的是形參,而不是成員變量
  • 方法的形參沒有與成員變量同名,不帶this修飾的變量指的是成員變量


public class This{
    public static void main(String args[]){
        Demo demo = new Demo();
        demo.fun("這是局部變量");
    }
}

class Demo{
    String str = "這是成員變量";
    void fun(String str){
        System.out.println(str); //就近原則,打印出"這是局部變量"
        System.out.println(this.str);//成員變量
        this.str = str;
        System.out.println(this.str); //(形參)局部變量
    }
}
public class Student {
    private String name;
    private int age;

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

    public String getName() {
        return name;
    }

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

    public int getAge() {
        return age;
    }

    public void show() {
        System.out.println(name + "," + age);
    }
}

4.構造方法

構造方法(也叫構造器 構造函數)

作用:在創建對象的時候,由虛擬機自動調用,給成員變量進行初始化

格式:

public class 類名{

       修飾符 類名( 參數 ) {

       }

}

特點:

1.方法名與類名相同,大小寫也要一致

2.沒有返回值類型,連void都沒有

3.沒有具體的返回值(不能由retrun帶回結果數據)

種類:

無參構造方法:初始化的對象時,成員變量的數據均採用默認值

有參構造方法:在初始化對象的時候,同時可以為對象進行賦值


note:

創建:如果沒有定義構造方法,系統將給出一個默認的無參數構造方法;
如果定義了構造方法,系統將不再提供默認的構造方法

重載:如果自定義了帶參構造方法,還要使用無參數構造方法,就必須再寫一個無參數構造方法

推薦:無論是否使用,都手工書寫無參數構造方法

5.標準JavaBean

一個標準的JavaBean類

1. 類名需要見名知意
2.成員變量使用private修飾
3.提供至少兩個構造方法
無參構造方法
帶全部參數的構造方法
4.成員方法
提供每一個成員變量對應的setXxx()/getXxx()
如果還有其他行為,也需要寫上

public class User{
    private String username;
    private String password;
    private String email;
    private String gender;
    private int age;
    //空參
    public User() {
    }

    //帶全部參數的構造
    public User(String username, String password, String email, String gender, int age) {
        this.username = username;
        this.password = password;
        this.email = email;
        this.gender = gender;
        this.age = age;
    }

    //get和set方法
    public void setUsername(String username){
        this.username = username;
    }
    public String getUsername(){
        return username;
    }
    public void setPassword(String password){
        this.password = password;
    }
    public String getPassword(){
        return password;
    }

    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }

    public String getGender() {
        return gender;
    }

    public void setGender(String gender) {
        this.gender = gender;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }
}
//快捷鍵:
//alt + insert

//插件:
//ptg