1. 程式人生 > 實用技巧 >Java基礎6--類和物件

Java基礎6--類和物件

1. 類和物件

1.1 類和物件的理解

客觀存在的事物皆為物件 ,所以我們也常常說萬物皆物件。

    • 類的理解
      • 類是對現實生活中一類具有共同屬性和行為的事物的抽象
      • 類是物件的資料型別,類是具有相同屬性和行為的一組物件的集合
      • 簡單理解:類就是對現實事物的一種描述
    • 類的組成
      • 屬性:指事物的特徵,例如:手機事物(品牌,價格,尺寸)
      • 行為:指事物能執行的操作,例如:手機事物(打電話,發簡訊)
  • 類和物件的關係
    • 類:類是對現實生活中一類具有共同屬性和行為的事物的抽象
    • 物件:是能夠看得到摸的著的真實存在的實體
    • 簡單理解:類是對事物的一種描述,物件則為具體存在的事物

1.2 類的定義

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

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

類的定義步驟:

①定義類

②編寫類的成員變數

③編寫類的成員方法

public class 類名 {
	// 成員變數
	變數1的資料型別 變數1;
	變數2的資料型別 變數2;
	…
	// 成員方法
	方法1;
	方法2;	
}

示例程式碼:

/*
    手機類:
        類名:
        手機(Phone)

        成員變數:
        品牌(brand)
        價格(price)

        成員方法:
        打電話(call)
        發簡訊(sendMessage)
 */
public class Phone {
    //成員變數
    String brand;
    int price;

    //成員方法
    public void call() {
        System.out.println("打電話");
    }

    public void sendMessage() {
        System.out.println("發簡訊");
    }
}

1.3 物件的使用

  • 建立物件的格式:
    • 類名 物件名 = new 類名();
  • 呼叫成員的格式:
    • 物件名.成員變數
    • 物件名.成員方法();
  • 示例程式碼
/*
    建立物件
        格式:類名 物件名 = 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);
        System.out.println(p.price);

        p.brand = "小米";
        p.price = 2999;

        System.out.println(p.brand);
        System.out.println(p.price);

        //使用成員方法
        p.call();
        p.sendMessage();
    }
}

1.4 學生物件-練習

  • 需求:首先定義一個學生類,然後定義一個學生測試類,在學生測試類中通過物件完成成員變數和成員方法的使用
  • 分析:
    • 成員變數:姓名,年齡…
    • 成員方法:學習,做作業…
  • 示例程式碼:
class Student {
    //成員變數
    String name;
    int age;

    //成員方法
    public void study() {
        System.out.println("好好學習,天天向上");
    }

    public void doHomework() {
        System.out.println("996福報");
    }
}
/*
    學生測試類
 */
public class StudentDemo {
    public static void main(String[] args) {
        //建立物件
        Student s = new Student();

        //使用物件
        System.out.println(s.name + "," + s.age);

        s.name = "林青霞";
        s.age = 30;

        System.out.println(s.name + "," + s.age);

        s.study();
        s.doHomework();
    }
}

2. 物件記憶體圖

2.1 單個物件記憶體圖

  • 成員變數使用過程

  • 成員方法呼叫過程

2.2 多個物件記憶體圖

  • 成員變數使用過程

  • 成員方法呼叫過程

  • 總結:

    多個物件在堆記憶體中,都有不同的記憶體劃分,成員變數儲存在各自的記憶體區域中,成員方法多個物件共用的一份

2.3 多個物件指向相同記憶體圖

  • 總結

    當多個物件的引用指向同一個記憶體空間(變數所記錄的地址值是一樣的)

    只要有任何一個物件修改了記憶體中的資料,隨後,無論使用哪一個物件進行資料獲取,都是修改後的資料。

3. 成員變數和區域性變數

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

  • 類中位置不同:成員變數(類中方法外)區域性變數(方法內部或方法宣告上)
  • 記憶體中位置不同:成員變數(堆記憶體)區域性變數(棧記憶體)
  • 生命週期不同:成員變數(隨著物件的存在而存在,隨著物件的消失而消失)區域性變數(隨著方法的呼叫而存在,醉著方法的呼叫完畢而消失)
  • 初始化值不同:成員變數(有預設初始化值)區域性變數(沒有預設初始化值,必須先定義,賦值才能使用)

4. 封裝

4.1 private關鍵字

private是一個修飾符,可以用來修飾成員(成員變數,成員方法)

  • 被private修飾的成員,只能在本類進行訪問,針對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 class StudentDemo {
        public static void main(String[] args) {
            //建立物件
            Student s = new Student();
            //給成員變數賦值
            s.name = "林青霞";
            s.setAge(30);
            //呼叫show方法
            s.show();
        }
    }
    

4.2 private的使用

  • 需求:定義標準的學生類,要求name和age使用private修飾,並提供set和get方法以及便於顯示資料的show方法,測試類中建立物件並使用,最終控制檯輸出 林青霞,30

  • 示例程式碼:

    /*
        學生類
     */
    class Student {
        //成員變數
        private String name;
        private int age;
    
        //get/set方法
        public void setName(String n) {
            name = n;
        }
    
        public String getName() {
            return name;
        }
    
        public void setAge(int a) {
            age = a;
        }
    
        public int getAge() {
            return age;
        }
    
        public void show() {
            System.out.println(name + "," + age);
        }
    }
    /*
        學生測試類
     */
    public class StudentDemo {
        public static void main(String[] args) {
            //建立物件
            Student s = new Student();
    
            //使用set方法給成員變數賦值
            s.setName("林青霞");
            s.setAge(30);
    
            s.show();
    
            //使用get方法獲取成員變數的值
            System.out.println(s.getName() + "---" + s.getAge());
            System.out.println(s.getName() + "," + s.getAge());
    
        }
    }
    

4.3 this關鍵字

  • this修飾的變數用於指代成員變數,其主要作用是(區分區域性變數和成員變數的重名問題)
    • 方法的形參如果與成員變數同名,不帶this修飾的變數指的是形參,而不是成員變數
    • 方法的形參沒有與成員變數同名,不帶this修飾的變數指的是成員變數
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.4 this記憶體原理

  • this代表當前呼叫方法的引用,哪個物件呼叫的方法,this就代表哪一個物件

  • 示例程式碼:

    public class StudentDemo {
        public static void main(String[] args) {
            Student s1 = new Student();
            s1.setName("林青霞");
            Student s2 = new Student();
            s2.setName("張曼玉");
        }
    }
    
  • 圖解:

4.5 封裝思想

  1. 封裝概述
    是面向物件三大特徵之一(封裝,繼承,多型)
    是面向物件程式語言對客觀世界的模擬,客觀世界裡成員變數都是隱藏在物件內部的,外界是無法直接操作的
  2. 封裝原則
    將類的某些資訊隱藏在類內部,不允許外部程式直接訪問,而是通過該類提供的方法來實現對隱藏資訊的操作和訪問
    成員變數private,提供對應的getXxx()/setXxx()方法
  3. 封裝好處
    通過方法來控制成員變數的操作,提高了程式碼的安全性
    把程式碼用方法進行封裝,提高了程式碼的複用性

5. 構造方法

5.1 構造方法概述

構造方法是一種特殊的方法

  • 作用:建立物件 Student stu = new Student();

  • 格式:

    public class 類名{

    ​ 修飾符 類名( 引數 ) {

    ​ }

    }

  • 功能:主要是完成物件資料的初始化

  • 示例程式碼:

class Student {
    private String name;
    private int age;

    //構造方法
    public Student() {
        System.out.println("無參構造方法");
    }

    public void show() {
        System.out.println(name + "," + age);
    }
}
/*
    測試類
 */
public class StudentDemo {
    public static void main(String[] args) {
        //建立物件
        Student s = new Student();
        s.show();
    }
}

5.2 構造方法的注意事項

  • 構造方法的建立

如果沒有定義構造方法,系統將給出一個預設的無引數構造方法
如果定義了構造方法,系統將不再提供預設的構造方法

  • 構造方法的過載

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

  • 推薦的使用方式

無論是否使用,都手工書寫無引數構造方法

  • 重要功能!

可以使用帶參構造,為成員變數進行初始化

  • 示例程式碼
/*
    學生類
 */
class Student {
    private String name;
    private int age;

    public Student() {}

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

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

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

    public void show() {
        System.out.println(name + "," + age);
    }
}
/*
    測試類
 */
public class StudentDemo {
    public static void main(String[] args) {
        //建立物件
        Student s1 = new Student();
        s1.show();

        //public Student(String name)
        Student s2 = new Student("林青霞");
        s2.show();

        //public Student(int age)
        Student s3 = new Student(30);
        s3.show();

        //public Student(String name,int age)
        Student s4 = new Student("林青霞",30);
        s4.show();
    }
}

5.3 標準類製作

  • 需求:定義標準學生類,要求分別使用空參和有參構造方法建立物件,空參建立的物件通過setXxx賦值,有參建立的物件直接賦值,並通過show方法展示資料。
  • 示例程式碼:
class Student {
    //成員變數
    private String name;
    private int age;

    //構造方法
    public Student() {
    }

    public Student(String name, int age) {
        this.name = name;
        this.age = 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);
    }
}
/*
    建立物件併為其成員變數賦值的兩種方式
        1:無參構造方法建立物件後使用setXxx()賦值
        2:使用帶參構造方法直接建立帶有屬性值的物件
*/
public class StudentDemo {
    public static void main(String[] args) {
        //無參構造方法建立物件後使用setXxx()賦值
        Student s1 = new Student();
        s1.setName("林青霞");
        s1.setAge(30);
        s1.show();

        //使用帶參構造方法直接建立帶有屬性值的物件
        Student s2 = new Student("林青霞",30);
        s2.show();
    }
}