首頁 > Java > java教程 > 01.Java 基礎 - 封裝

01.Java 基礎 - 封裝

黄舟
發布: 2017-02-27 10:08:05
原創
1390 人瀏覽過

基本概念

Java 物件導向有三大特性:封裝、繼承、多態。而封裝與繼承基本上是為多態服務的。

封裝(Encapsulation):就是把物件的屬性和操作(或服務)結合為一個獨立的整體,並盡可能隱藏物件內部的實作細節。通俗來講就是私有化類別的成員變量,並提供公共方法來存取這些成員變數。

資料隱藏:一個成員變數宣告為私有成員,那麼它就不能透過外部類別直接訪問,從而將成員變數隱藏在類別的內部。基於這個原因,封裝也被稱為資料隱藏。


JavaBean

JavaBean 是一種規範,它規定了一個良好封裝的規範,只要符合該規範的類別都稱為JavaBean。

它有以下特點:

  • 資料成員(物件成員)必須由 private 修飾。

  • 為每個物件成員提供public 的setter /getter 方法

  • setter/getter 的原型必須為:

#

1

public void set 成员名(成员类型 arg);public 成员类型 get 成员名();

登入後複製

實例探究

1.未封裝&封裝

首先我們來看未封裝的成員變數:

1

2

3

4

5

6

7

8

9

10

class Person{    // 将成员的访问权限设置为 public,这也为意味这谁都访问到它

    public String name;    public int age;

}public class Test{

    public static void main(String[] args) {

        Person person = new Person();        //通过类,我们可以直接操作成员变量

        person.name ="kobe";

        person.age =1000;        //直接获得成员变量的值

        System.out.println(person.name+"-"+person.age);

    }

}

登入後複製

下面我們對上面的類別進行封裝:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

class Person {    //1.将成员变量私有化,这样一来外部就不能直接访问到它们

    private String name;    private int age;    //2.提供公共的方法来操作成员变量

    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 class Test {

    public static void main(String[] args) {

        Person person = new Person();        // 不能直接访问成员变量,而是通过提供的公共方法来设置/获取成员变量的值

        person.setName("kobe");

        person.setAge(1000);

        System.out.println(person.getName() + "-" + person.getAge());

    }

}

登入後複製

#到目前為止我們看到封裝與未封裝物件的大概區別了:

  • 對於未封裝的物件我們直接存取/設定其成員變數

  • 而對於封裝的物件我們需要透過提供的公共方法(如getter/setter)來操作成員變數


2.封裝控制物件

#如果只是這樣,封裝似乎也沒有什麼作用,接下來我們看看如何透過封裝實現對物件的控制:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

class Person {   

private String name;   

private int age;   

private int city;   

//对于 name 的控制,直接取消了 setter 方法,这样外部只能访问,而不能设置 name 的值

    public String getName() {       

    // 直接返回值

        return "kobe";

    }    public int getAge() {       

    return age;

    }   

    // 有两个 setter 方法,可以接收 int,String 类型的参数

    public void setAge(int age) {       

    this.age = age;

    }    public void setAge(String age) {       

    // 对参数值进行验证,默认只能输入数字

        if(age.matches("[0-9]")){           

        this.age = Integer.valueOf(age);

        }else{

            System.out.println("Error:年龄只能为数字");

        }

    }   

    // 在日常开发,我们一般会将文字转换成编码在数据库存储,因此在存储调用时就要做转换

    public String getCity() {       

    switch (city) {       

    case 001:           

    return "北京";       

    default:           

    return "上海";

        }

    }   

    public void setCity(String city) {       

    if("北京".equals(city)){           

    this.city = 001;

        }else if("上海".equals(city)){           

        this.city = 002;

        }else{

            System.out.println("Error:没有找到该城市");

        }

    }

}public class Test {

    public static void main(String[] args) {

        Person person = new Person();

        person.setAge("a"); //Error:年龄只能为数字

        person.setAge(1000); //既可以接收 String 类型,也可以接收 int 类型

        person.setCity("广州"); //Error:没有找到该城市

        person.setCity("北京"); //此时已经被转换成 001 存储了   

 

        //在访问 city 成员变量时,001 又被转换成 北京 显示

        System.out.println(person.getName()+"-"+person.getAge()+"-"+person.getCity());

    }

}

登入後複製

透過以上的程式碼,我們大致可以總結出封裝的作用:

  • 良好的封裝能夠減少耦合。

  • 類別內部的結構可以自由修改。

  • 可以對成員進行更精確的控制。

  • 隱藏訊息,實作細節。


參考

 以上就是01.Java 基礎- 封裝的內容,更多相關內容請關注PHP中文網(www.php.cn)!


#
相關標籤:
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
最新問題
java - php調取webservice的map類型,如果封裝?
來自於 1970-01-01 08:00:00
0
0
0
java - QQ空間爬蟲總是被封號
來自於 1970-01-01 08:00:00
0
0
0
一封來自Java程式設計師的情書
來自於 1970-01-01 08:00:00
0
0
0
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板