第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错误