第14章 封装

本章介绍Java程序设计中的另一个特点:封装。封装有什么作用?封装有什么特点?如何将其应用到实际编程中去?针对以上的种种问题,本章将从封装的基本概念讲起,让读者学习封装的实际作用。其实封装就是将一些内容包装起来,用来保证一些类或方法的安全。

本章重点:

认识封装。

了解使用封装的步骤。

如何设计封装。

14.1 封装简介

封装,确切地说是一种编程思路,掌握这种编程思路对于一个程序设计来说,是至关重要的。封装也是程序设计中最能够体现出程序安全性的概念。所谓封装,就是将某些东西封装在一个容器内,不让外界接触它。在程序设计中,封装就是将某些方法和属性封装到某个类中,使得外界的类无法访问它们。

其实在前面的实例中,已经看到过有关封装的例子,不过,当时没有介绍封装的概念。

【实例14.1】下面将举一个有关封装的例子,看看究竟什么是封装。


01 ///这是一个主运行类

02 ///构造了多个对象

03 ///输出多个对象的字符串形式

04 public class thread42

05 {

06 public static void main(String[]args)

07 {

08 flower f1=new flower();

09 flower f2=new flower();

10 flower f3=new flower();

11 f1.setname("牡丹");

12 f1.setcolor("红色");

13 f1.setlocation("云南");

14 f2.setname("玫瑰");

15 f2.setcolor("黄色");

16 f2.setlocation("北京");

17 f3.setname("月季");

18 f3.setcolor("蓝色");

19 f3.setlocation("上海");

20 System.out.println(f1.tostring());

21 System.out.println(f2.tostring());

22 System.out.println(f3.tostring());

23 }

24 }

25 ///这是一个花类

26 ///通过设置多个有关花类的私有变量

27 ///通过设置器来设置花对象的属性

28 ///通过访问器来获得花对象的属性

29 ///通过tostring方法让对象以字符串形式输出

30 class flower

31 {

32 private String name;

33 private String color1;

34 private String location;

35 public void setname(String name)

36 {

37 this.name=name;

38 }

39 public void setcolor(String color1)

40 {

41 this.color1=color1;

42 }

43 public void setlocation(String location)

44 {

45 this.location=location;

46 }

47 public String getname()

48 {

49 return name;

50 }

51 public String getcolor()

52 {

53 return color1;

54 }

55 public String getlocation()

56 {

57 return location;

58 }

59 public String tostring()

60 {

61 String information="花的名称:"+name+";"+""+"花的颜色:"+color1+";"+""+"花的出产地:

62"+location+"";

63 return information;

64 }

65 }


【代码说明】第30~65行定义了一个类flower,第8~10行定义了3个对象。第11~19行设置对象的各个属性,第20~22行输出结果。

【运行效果】


花的名称:牡丹;花的颜色:红色;花的出产地:云南

花的名称:玫瑰;花的颜色:黄色;花的出产地:北京

花的名称:月季;花的颜色:蓝色;花的出产地:上海


以上的程序段中,flower类中所有的方法都是public,而所有的变量都是private。可以通过对象句柄来访问“flower”类中的所有方法。那么是否可以访问其中的变量?

【实例14.2】下面看看这个程序修改后的程序段。


说明 这里主程序变化了,类没有变化。以下代码仅给出主程序,类参考上一个实例的代码。


01 public class thread44

02 {

03 public static void main(String[]args)

04 {

05 flower f1=new flower();

06 flower f2=new flower();

07 flower f3=new flower();

08 f1.name="牡丹";

09 f2.name="玫瑰";

10 f3.name="月季";

11 f1.color1="红色";

12 f2.color1="黄色";

13 f3.color1="蓝色";

14 f1.location="云南";

15 f2.location="北京";

16 f3.location="上海";

17 System.out.println(f1.tostring());

18 System.out.println(f2.tostring());

19 System.out.println(f3.tostring());

20 }

21 }


【代码说明】在这个程序段中,出现了编译错误。是因为flower类中,所有的变量都是私有变量,也就是被类给封装了。只有类中的方法才可以访问它们,外部不可能看到,更不可能访问它们,这样类的内部变量就会显得很安全。

【运行效果】这里显示编译时提示的错误信息。

thread41.java:8:name可以在flower中访问private

f1.name="牡丹";

^

thread41.java:9:name可以在flower中访问private

f2.name="玫瑰";

^

thread41.java:10:name可以在flower中访问private

f3.name="月季";

^

thread41.java:11:color1可以在flower中访问private

f1.color1="红色";

^

thread41.java:12:color1可以在flower中访问private

f2.color1="黄色";

^

thread41.java:13:color1可以在flower中访问private

f3.color1="蓝色";

^

thread41.java:14:location可以在flower中访问private

f1.location="云南";

^

thread41.java:15:location可以在flower中访问private

f2.location="北京";

^

thread41.java:16:location可以在flower中访问private

f3.location="上海";

^

9错误