Java基礎 --- 物件導向

Y423x發表於2024-03-17

物件導向


物件導向介紹


介紹

  • 面向:拿、找
  • 物件:能幹活的東西
  • 物件導向程式設計:拿東西過來坐對應的事情

設計物件並使用


類和物件

  • 類(設計圖):是物件共同特徵的描述;
  • 物件:是真實存在的具體東西

在Java中,必須先設計類,才能獲得物件。


如何定義類

public class 類名{
    1.成員變數(代表屬性,一般是名詞)
    2.成員方法(代表行為,一般是動詞)
    3.構造器(後面學習)
    4.程式碼塊(後面學習)
    5.內部類(後面學習)
}

public class Phone {
    String brand;
    double print;
    //行為(方法)
    public void call(){
        
    }
    public void playGame(){
        
    }
}

如何得到類的物件

類名 物件名 = new 類名();
Phone p = new Phone();

如何使用物件

  • 訪問屬性:物件名.成員變數
  • 訪問行為:物件名.方法名(...)

範例:

public class Phone {
    //屬性
    String brand;//手機的品牌
    double price;//手機的價格
    //行為
    public void call(){
        System.out.println("手機在打電話");
    }
    public void playGame(){
        System.out.println("手機在玩遊戲");
    }
}

public class PhoneTest {
    public static void main(String[] args) {
        //建立手機的物件
        Phone p = new Phone();
        //給手機賦值
        p.brand = "菠蘿";
        p.price = 1145.14;
        //獲取手機物件中的值
        System.out.println(p.brand);
        System.out.println(p.price);
        //呼叫手機中的方法
        p.call();
        p.playGame();

        //第二部手機
        Phone p2 = new Phone();
        p2.brand = "鴨梨";
        p2.price = 1008.6;

        p2.call();
        p2.playGame();
    }
}

總結

  1. 類和物件是什麼?

    • 類:是物件共同特徵的描述(設計圖);物件:是真實存在的具體例項。
  2. 如何得到物件?

    public class 類名{
        1.成員變數(代表屬性,一般是名詞)
        2.成員方法(代表行為,一般是動詞)
    }
    
    類名 物件名 = new 類名();
    
  3. 拿到物件後能做什麼?

    • 物件名.成員變數
    • 物件名.方法名(...)

類的幾個補充注意事項


  • 用來描述一類事物的類,專業叫做: Javabean類

    在Javabean類中,是不寫main方法的。

  • 在以前,編寫main方法的類,叫做測試類

    我們可以在測試類中建立javabean類的物件並進行賦值呼叫。

public class 類名{
    1.成員變數(代表屬性)
    2.成員方法(代表行為)
}
  • 類名首字母建議大寫,需要見名知意,駝峰模式。

  • 一個Java檔案中可以定義多個class類,且只能一 個類是public修飾,而且public修飾的類名必須成為程式碼檔名。

    實際開發中建議還是一個檔案定義一個class類。

  • 成員變數的完整定義格式是: 修飾符 資料型別 變數名稱 = 初始化值;一般無需指定初始化值,存在預設值。

    資料型別 明細 預設值
    基本型別 byte、short、int、long 0
    基本型別 float、double 0.0
    基本型別 boolean false
    引用型別 類、介面、陣列、String null

練習


女朋友類

編寫女朋友類,建立女朋友類的物件

給女朋友的屬性賦值並呼叫女朋友類中的方法。

自己思考,女朋友類中有哪些屬性,有哪些行為?

public class GirlFriendTest {
    public static void main(String[] args) {
        //建立女朋友的物件
        GirlFriend gf1 = new GirlFriend();
        gf1.name = "柳如煙";
        gf1.age = 18;
        gf1.gender = "女神";

        System.out.println(gf1.name);
        System.out.println(gf1.age);
        System.out.println(gf1.gender);

        gf1.sleep();
        gf1.eat();

        System.out.println("=====================================");

        GirlFriend gf2 = new GirlFriend();
        gf2.name = "蘇沐雪";
        gf2.age = 19;
        gf2.gender = "青梅竹馬";

        System.out.println(gf2.name);
        System.out.println(gf2.age);
        System.out.println(gf2.gender);

        gf2.sleep();
        gf2.eat();
    }
}

總結

  1. 定義類有哪些建議,有什麼需要注意的?

    • 類名首字母建議大寫、英文、有意義,滿足駝峰模式,不能用關鍵字,滿足標誌符規定;

    • 一個程式碼檔案中可以定義多個類,但是隻能一個類是public修飾的,

      public修飾的類名必須是Java程式碼的檔名稱。

  2. 成員變數的格式是什麼樣的,有什麼特點?

    • 成員變數的完整定義格式是:修飾符 資料型別 變數名稱 = 初始化值;
    • 一般無需指定初始化值。

封裝


告訴我們,如何正確設計物件的屬性和方法

原則:物件代表什麼,就得封裝對應的資料,並提供資料對應的行為


封裝的好處

  • 讓程式設計變得很簡單,有什麼事,找物件,調方法就行。
  • 降低我們的學習成本,可以少學、少記,或者說壓根不用學,不用記物件有哪些方法,有需要時去找就行

private關鍵字

  • 是一個許可權修飾符
  • 可以修飾成員(成員變數和成員方法)
  • private修飾的成員只能在本類中才能訪問
public class GirlFriend {
    private String name;
    private int age;
    private String gender;

    //針對於每個私有化的成員變數,都要提供get和set方法
    //set方法:給成員變數賦值
    //get方法;對外提供成員變數的值

    public void setName(String n){
        name = n;
    }
    public String getName(){
        return name;
    }

    public void setAge(int a){
        if(a >= 0 && a <= 100){
            age = a;
        }else {
            System.out.println("非法引數");
        }
    }
    public int getAge(){
        return age;
    }

    public void setGender(String g){
        gender = g;
    }
    public String getGender(){
        return gender;
    }

    //行為
    public void sleep(){
        System.out.println("女朋友在睡覺");
    }
    public void eat(){
        System.out.println("女朋友在吃飯");
    }
}

public class GirlFriendTest {
    public static void main(String[] args) {
        GirlFriend gf1 = new GirlFriend();
        gf1.setName("柳如煙");
        gf1.setAge(18);
        gf1.setGender("女");

        System.out.println(gf1.getName());
        System.out.println(gf1.getAge());
        System.out.println(gf1.getGender());

        gf1.sleep();
        gf1.eat();
    }
}

總結

  1. private關鍵字是一個許可權修飾符
  2. 可以修飾成員(成員變數和成員方法)
  3. 被private修飾的成員只能在本類中才能訪問
  4. 針對private修飾的成員變數,如果需要被其他類使用,提供相應的操作
  5. 提供“setxxx(引數)”方法,用於給成員變數賦值,方法用public修飾
  6. 提供"getxxx()"方法,用於獲取成員變數的值,方法用public修飾

就近原則和this關鍵字


就近原則

  • 誰離我近我就用誰

成員變數和區域性變數

public class GirlFriend{
    private int age;//成員變數
    public void method(){
        int age = 10;//區域性變數
        System.out.println(age);//列印區域性變數
    }
}

public class GirlFriend{
    private int age;//成員變數
    public void method(){
        int age = 10;//區域性變數
        System.out.println(this.age);//列印成員變數
    }
}

範例:

public class GirlFriend {
    private String name;
    private int age;
    private String gender;

    //針對於每個私有化的成員變數,都要提供get和set方法
    //set方法:給成員變數賦值
    //get方法;對外提供成員變數的值

    //作用:給成員變數name進行賦值的·
    public void setName(String name){
        this.name = name;
    }
    public String getName(){
        return name;
    }
    public void setAge(int age){
        if(age >= 0 && age <= 100){
            this.age = age;
        }else {
            System.out.println("非法引數");
        }
    }
    public int getAge(){
        return age;
    }

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

    //行為
    public void sleep(){
        System.out.println("女朋友在睡覺");
    }
    public void eat(){
        System.out.println("女朋友在吃飯");
    }
}

public class GirlFriendTest {
    public static void main(String[] args) {
        GirlFriend gf1 = new GirlFriend();
        gf1.setName("柳如煙");
        gf1.setAge(18);
        gf1.setGender("女");

        System.out.println(gf1.getName());
        System.out.println(gf1.getAge());
        System.out.println(gf1.getGender());

        gf1.sleep();
        gf1.eat();
    }
}

總結

  1. 就近原則
  2. this作用:區別成員變數和區域性變數
  3. this的本質和記憶體圖

構造方法


概述:

  • 構造方法也叫做構造器、建構函式。
  • 作用:在建立物件的時候給成員變數進行賦值的。

格式:

public class Student{
    修飾符 類名(引數){
        方法體;
    }
}

特點:

  1. 方法名和類名相同,大小寫也要一致
  2. 沒有返回值型別,練void都沒有
  3. 沒有具體的返回值(不能有return帶回結果資料)

執行時機:

  1. 建立物件的時候有虛擬機器呼叫,不能手動呼叫構造方法
  2. 每建立一次物件,就會呼叫一次構造方法

public class Student {
    private String name;
    private int age;

    //如果我們自己沒有寫任何的構造方法
    //那麼虛擬機器就會給我們加一個空參構造方法
    public Student (){
        System.out.println("故鄉的櫻花開了");
    }

    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 set(int age){
        this.age = age;
    }
}

public class StudentTest {
    public static void main(String[] args) {
        //建立物件
        //呼叫的空參構造
        //Student s = new Student();

        Student s = new Student("柳如煙",18);

        System.out.println(s.getName());
        System.out.println(s.getAge());
    }
}

構造方法注意事項

  1. 構造方法的定義
    • 如果沒有定義構造方法,系統將給出一個預設無引數構造方法
    • 如果定義了構造方法,系統將不再提供預設的構造方法
  2. 構造方法的過載
    • 帶參構造方法,和無參構造方法,兩者方法名相同,但是引數不同,這叫做構造方法的過載
  3. 推薦的使用方法
    • 無論是否使用,都手動書寫無參構造方法,和帶全部引數的構造方法

總結

  1. 構造方法的作用?
    • 創造物件的時候,有虛擬機器自動呼叫,給成員變數進行初始化的。
  2. 構造方法有幾種,各自的作用是什麼?
    • 無引數構造方法:初始化的物件時,成員變數的資料均採用預設值。
    • 有引數構造方法:在初始化物件的時候,同時可以為物件進行賦值。
  3. 構造方法有哪些注意事項?
    • 任何類定義出來,預設就自帶了無引數構造器,寫不寫都有。
    • 一旦定義有引數構造器,無引數構造器就沒有了,此時就需要自己寫有引數構造器了。
    • 建議在任何時候都手動寫上空參和帶全部引數的構造方法。

  • 創造物件的時候,虛擬機器會自動呼叫構造方法,作用是給成員變數進行初始化的。

標準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;
    
    //快捷鍵:
    //alt + insert
    //alt + Fn + insert
    //外掛PTG 1秒生成標準JavaBean(右鍵空白處,點選倒數第三個)
    
    //空參
    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 String getUsername(){
        return username;
    }
    
    public void setUsername(String username){
        this.username = username;
    }
    
    public String getPassword(){
        return password;
    }
    
    public void setPassword(String password){
        this.password = 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;
    }
}

物件記憶體圖


一個物件的記憶體圖

Student s = new Student();
  1. 載入class檔案
  2. 申明區域性變數
  3. 在堆記憶體中開闢一個空間
  4. 預設初始化
  5. 顯示初始化
  6. 構造方法初始化
  7. 將堆記憶體中的地址值賦值給左邊的變數

兩個物件的記憶體圖


兩個引用指向同意一個物件


基本資料型別和引用資料型別

基本資料型別

  • 在變數當中儲存的是真實的資料值

引用資料型別

  • 使用其他空間的資料

從記憶體的角度去解釋:

  • 基本資料型別:資料值是儲存在自己的空間中
  • 特點:複製給其他變數,也是賦的真實的值。
  • 引用資料型別:資料值是儲存在其他空間中,自己空間中儲存的是地址值。
  • 特點:賦值給其他變數,賦的是地址值。

this的記憶體原理


  • this的作用:區分區域性變數和成員變數
  • this的本質:所在方法呼叫者的地址值

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


成員變數:類中方法外的變數

區域性變數:方法中的變數

區別 成員變數 區域性變數
類中位置不同 類中,方法外 方法內、方法申明上
初始化值不同 有預設初始化值 沒有, 使用之前需要完成賦值
記憶體位置不同 堆記憶體 棧記憶體
生命週期不同 隨著物件的建立而存在,隨著物件的消失而消失 隨著方法的呼叫而存在, 隨著方法的執行結束而消失
作用域 整個類中有效 當前方法中有效

相關文章