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

6.類和物件

類和物件

物件

物件: 一切事物都是物件

物件的屬性: 物件具有的各種特徵, 每個物件的每個屬性都擁有特定的值.

物件的行為: 物件能夠執行的操作

類: 現實生活中一類具有共同屬性行為的事物的抽象.

類的特點:

  • 類是物件的資料型別
  • 類是具有相同屬性和行為的一組物件的集合

類與物件的關係

類: 現實生活中一類具有共同屬性行為的事物的抽象.

物件: 能夠看得見摸得著的真實存在的實體.

類是物件的抽象, 物件是類的實體

類的定義

類: 是java 程式的基本組成單位

類的組成: 屬性和行為

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

類的定義步驟

  • 定義類
  • 編寫類的成員變數
  • 編寫類的成員方法
public class 類名 {
	// 成員變數
	變數1資料型別 變數1;
	變數2資料型別 變數2;
	...
	
	// 成員方法
	方法1;
	方法2;
	...
}

示例

package ClassInstance;

public class Phone {
    // 成員變數
    String brand;
    Float price;
    
    // 成員方法
    public void call() {
        System.out.println("打電話");
    }
    
    public void sendMessage() {
        System.out.println("發簡訊");
    }
}

物件的使用

建立物件

  • 格式: 類名 物件名 = new 類名();

  • 範例: Phone p = new Phone();

使用物件

  • 使用成員變數
    • 格式: 物件名.變數名
    • 範例:p.brand
  • 使用成員方法
    • 格式: 物件名.方法名()
    • 範例: p.call()
package ClassInstance;

import org.w3c.dom.ls.LSOutput;

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 = "apple";
        p.price = 5499.00;

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

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

物件記憶體圖

單個物件

成員變數

成員方法

多個物件

多個物件指向相同

成員變數和區域性變數

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

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

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

封裝

private關鍵字

  • 一個許可權修飾符
  • 可以修飾成員(成員變數和成員方法)
  • 作用是保護成員不被別的類使用,被private修飾的成員只能在本類中使用

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

  • 提供"get變數名()"方法, 用於獲取成員變數的值,方法用public修飾
  • 提供"set變數名(引數)"方法, 用於設定成員變數的值,方法用public修飾
package ClassInstance;

public class StudentPrivate {
    // 成員變數
    String name;
    private int age;

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

    public int getAge() {
        return age;
    }

    // 成員方法
    public void call() {
        System.out.println("人生誰無風雨時");
    }

    public void sendMessage() {
        System.out.println("守的雲開見月明");
    }
}

使用private成員

package ClassInstance;

public class privateKeyword {
    public static void main(String[] args) {
        // 建立物件
        StudentPrivate s = new StudentPrivate();
        System.out.println(s.name);
        // System.out.println(s.age);  // 私有變數無法直接訪問
        System.out.println(s.getAge());
        s.setAge(30);
        System.out.println(s.getAge());
    }
}

this關鍵字

this修飾的變數用於指代成員變數

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

什麼時候this: 解決區域性變數隱藏成員變數

this: 代表所在類的物件引用

  • 方法被那個物件呼叫, this就代表那個物件.
package ClassInstance;

public class StudentThis {
    // 成員變數
    private String name;
    private int age;

    // 提供get/set方法

    public void setName(String name) {
        // name = name;  // 方法中會優先使用區域性變數,
        this.name = name;  // 使用this才能指向成員變數
    }

    public String getName() {
        return name;
    }

    // 成員方法
    public void call() {
        System.out.println("人生誰無風雨時");
    }

    public void sendMessage() {
        System.out.println("守的雲開見月明");
    }

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

This記憶體原理

s1物件呼叫記憶體原理

s2物件呼叫記憶體原理

最後

封裝

  1. 封裝概述

面向物件的三大特徵之一(封裝, 繼承, 多型)

面向物件程式語言對客觀世界的模擬, 客觀世界成員變數都是隱藏在物件內部的, 外部是無法直接操作的

  1. 封裝原則

將類的某些資訊隱藏在類的內部,不允許外部程式直接訪問, 而是通過類提供的方法來實現對隱藏資訊的操作和訪問.

  1. 封裝的好處

通過方法來控制成員變數的操作,提高了程式碼的安全性

把程式碼用方法進行封裝, 提高程式碼的複用性

構造方法

概述

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

  • 作用: 用於建立物件

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

格式

public class 類名 {
	修飾符 類名(引數) {
		// 構造方法內容
	}
}

示例:

package ClassInstance;

public class StudentCreateMethod {
    private String name;
    private int age;
    // 無引數構造方法
    public StudentCreateMethod () {
        System.out.println("無引數構造方法");

    }

    // 有引數構造方法
    public StudentCreateMethod (String name) {
        System.out.println("有引數構造方法");
        this.name = name;
    }

    // 有引數構造方法2
    public StudentCreateMethod (int age) {
        System.out.println("有引數構造方法2");
        this.age = age;
    }

    // 完整構造方法
    public  StudentCreateMethod(String name, int age) {
        System.out.println("有引數構造方法3");
        this.name = name;
        this.age = age;
    }

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

測試類

package ClassInstance;

public class StudentCreateMethodTest {
    public static void main(String[] args) {
        // 建立物件
        StudentCreateMethod s = new StudentCreateMethod();
        s.show();

        //
        StudentCreateMethod s2 = new StudentCreateMethod("林青霞");
        s2.show();

        //
        StudentCreateMethod s3 = new StudentCreateMethod(30);
        s3.show();

        StudentCreateMethod s4 = new StudentCreateMethod("林青霞",30);
        s4.show();


    }
}

注意事項

構造方法的建立;

  • 如果沒有定義構造方法, 系統給出一個預設的無引數構造方法; 如果定義了,系統將不再提供預設構造方法.
  • 構造方法需要和類名一致

構造方法的過載:

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

推薦使用

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

標準類的製作

成員變數

  • 使用private修飾

構造方法

  • 提供一個無參構造方法
  • 提供一個帶多個引數的構造方法

成員方法

  • 提供每一個成員變數對應的setXxx()/getXxx()
  • 提供一個顯示物件資訊的show()

建立物件並且為成員變數賦值的兩種方式

  • 無參構造方法建立物件之後使用setXxx()賦值
  • 使用帶參構造直接建立帶有屬性值的物件
package ClassInstance;

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

    public StudentStandard() {};

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

    public void setName(String name) {
        this.name = name;
    }
    
    public String getName() {
        return this.name;
    }
    
    public void setAge(int age) {
        this.age = age;
    }
    
    public int getAge() {
        return this.age;
    }
    
    public void show() {
        System.out.println(name + "," + age);
    }
    
}