首頁 > 軟體

Java物件導向的封裝你瞭解嗎

2022-03-28 16:00:51

物件導向思想之封裝

或許大家都聽說過java是純物件導向語言,物件導向思想也就是我們常說的OOP,我們聽說最多的思想就是繼承,封裝,多型,今天我們來講一講封裝。

什麼是封裝呢?

封裝就是一種將資料和運算元據的方法進行有機結合,一種函數抽象類的介面實現了對細節的封裝和隱藏,使得我們只需要呼叫對外開放的公共介面去實現與物件的互動。我們可以把封裝理解為一種保護的屏障,需要一些嚴格的介面進行控制,我們可以修改自己實現類的內部結構的程式碼,但是不可以修改那些公共介面。這就提供更好的安全性。

封裝的好處意義

  • 好的封裝能夠減少耦合度
  • 能夠對成員變數更精準的控制
  • 實現對細節的封裝和隱藏,使得更具有安全性。
  • 可以修改類的內部程式碼,不用修改那些公共的介面

講到封裝那必然講到關鍵字private也就是存取修飾限定符。

回憶一下我們見過哪些存取修飾限定符呢?有public ,還有成員變數什麼也不加的預設許可權英文是default,還有就是我們今天要講解的private,下一篇文章會講解protected。

那private到底有什麼用處呢?

我們在來回憶一下上篇文章講過的類和物件,下面我會建立一個學生類。

//建立一個學生類
class Student {
    public String name;//學生姓名
    public int age;//學生年齡
    public String sex;//學生性別
    public double score;//學生分數
    public void sleep() {
        System.out.println("我要睡覺了!!!");
    }
    public void eat() {
        System.out.println("我要乾飯了!!!");
    }
    public void exam() {
        System.out.println("我要考試了!!!");
    }
}
public class TestDemo {
    public static void main(String[] args) {
        Student student = new Student();//利用new關鍵字範例化一個物件
        student.age = 19;
        student.name = "厚積薄發";
        student.score = 99.9;
        student.sex = "男";
    }
}

以上的程式碼我們將這個學生成員變數分別賦值。這樣寫會不會有什麼不足呢?

想一想,如果我們每次要定義一個學生物件,每次都要這樣賦值會不會有點太麻煩?今天我們講到封裝就會讓它更簡單一些。請看下面程式碼:

class Student {
    private String name;//學生姓名
    private int age;//學生年齡
    private String sex;//學生性別
    private double score;//學生分數
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
}
public class TestDemo {
    public static void main(String[] args) {
        Student student = new Student();
        student.setName("厚積薄發");
        System.out.println(student.getName());
    }
}

根據封裝的概念我是不是可以給它封裝成一個公共的介面然後呼叫。

好接下來分析一下這個程式碼:

 所以,我們在成員變數前面加上private修飾使得成員變數只能在類的內部存取,不能在類的外部存取,然後我們實現了setName getName方法,呼叫者兩個介面就可以進行初始化和返回值操作,更好地體現了封裝性。

getter方法和setter方法

為了更方便的呼叫這些介面,IDEA會為我們提供了這些介面,我們通常情況下把這些方法叫做getter方法和setter方法。只要我們需要我們就可以呼叫這些共有的getter方法和setter方法。

IDEA快捷鍵:Alt + insert

class Student {
    private String name;//學生姓名
    private int age;//學生年齡
    private String sex;//學生性別
    private double score;//學生分數
    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;
    }
    public String getSex() {
        return sex;
    }
    public void setSex(String sex) {
        this.sex = sex;
    }
    public double getScore() {
        return score;
    }
    public void setScore(double score) {
        this.score = score;
    }
    public void sleep() {
        System.out.println("我要睡覺了!!!");
    }
    public void eat() {
        System.out.println("我要乾飯了!!!");
    }
    public void exam() {
        System.out.println("我要考試了!!!");
    }
}
public class TestDemo {
    public static void main(String[] args) {
        Student student = new Student();//利用new關鍵字範例化一個物件
        student.setName("厚積薄發");
        student.setAge(19);
        student.setScore(99.9);
        student.setSex("male");
        System.out.println(student.getName());
        System.out.println(student.getAge());
        System.out.println(student.getScore());
        System.out.println(student.getSex());
    }
}

toString方法

此外,我們每個成員變數都要自己實現一遍列印操作,沒錯IDEA編譯器又為我們提供了一個方法,這個方法叫做toString方法,快捷鍵是 Alt +insert然後選擇toString方法。

 我們直接列印物件的參照就可以呼叫toString方法.

有同學就會問為什麼呢?

這就得需要我們看一看println的原始碼是怎麼實現的了。

我們按住ctrl 點進println這個方法

 我們通過原始碼就可以發現,println會呼叫toString方法,如果定義了toString方法,那他就呼叫toString方法,如果沒有呼叫他就會列印:

 eg:

快捷鍵: Alt + insert  選擇constructor

總結:

private關鍵字:利用private修飾的成員變數和方法只能在本類中存取,如果在外部存取可以呼叫公有的setter方法和getter方法。

封裝的優點:減少程式碼的耦合性    , 可以自由修改自己的內部類,不用修改公有地介面 ,隱藏資訊實現細節,更精準的控制成員變數。

要記住並且運用並且呼叫這些公共的介面:getter方法和setter方法 還有toString方法以及 構造方法。

本篇文章就到這裡了,希望能夠給你帶來幫助,也希望您能夠多多關注it145.com的更多內容! 


IT145.com E-mail:sddin#qq.com