11.2 内部类
内部类就是在一个类的内部再创建一个类。下面介绍如何使用内部类编写程序代码,并了解内部类在编写代码的过程中,为程序员提供了哪些方便和优点。
内部类的好处:
❑内部类的对象能够访问创建它的对象的所有方法和属性,包括私有数据。
❑对于同一个包中的其他类来说,内部类是隐形的。
❑匿名内部类可以很方便地定义回调。
❑使用内部类可以很方便地编写事件驱动的程序。
下面将这些特点贯穿整节,通过实例来讲述。
11.2.1 使用内部类来访问对象
【实例11.5】下面将举个有关内部类的实例。在分析这个实例之前,先了解这个实例的流程,如图11.4所示。
图 11.4 内部类访问对象的实例
首先看看如何设计学生类,代码如下所示。
01 ///创建一个学生类
02 ///在学生类中,创建姓名、 学号、 性别等参数
03 ///使用设置器来设置参数
04 ///使用访问器来获取参数值
05 public class students
06 {
07 private String name;
08 private String code;
09 private String sexy;
10 private String birthday;
11 private String address;
12 public void setname(String name)
13 {
14 this.name=name;
15 }
16 public void setcode(String code)
17 {
18 this.code=code;
19 }
20 public void setsexy(String sexy)
21 {
22 this.sexy=sexy;
23 }
24 public void setbirthday(String birthday)
25 {
26 this.birthday=birthday;
27 }
28 public void setaddress(String address)
29 {
30 this.address=address;
31 }
32 public String getname()
33 {
34 return name;
35 }
36 public String getcode()
37 {
38 return code;
39 }
40 public String getsexy()
41 {
42 return sexy;
43 }
44 public String getbirthday()
45 {
46 return birthday;
47 }
48 public String getaddress()
49 {
50 return address;
51 }
52 public String tostring()
53 {
54 String infor="学生 姓名:"+name+""+" 学号:"+code+""+" 性别:"+sexy+""+"出 生年月:
55"+birthday+""+" 家庭地址:"+address;
56 return infor;
57 }
58 public void setstudentcourse(String[]courses)
59 {
60 new course(courses);
61 }
62 }
再设计一个内部类,代码如下所示。
63 ///内部类的创建,把内部类作为外部类的一个成员
64 65 private class course
66 {
67 private String[]courses;
68 private int coursenum;
69 ///内部类的构造器
70 public course(String[]course)
71 {
72 courses=course;
73 coursenum=course.length;
74 getinfo();
75 }
76 ///获得课程数组中的课程
77 private void get()
78 {
79 for(int i=0;i<coursenum;i++)
80 {
81 System.out.print(""+courses[i]);
82 }
83 }
84 ///按字符串形式输出
85 void getinfo()
86 {
87 System.out.println("学生 姓名:"+students.this.name+"学生 学号:
88 "+students.this.code+"一共选择了:"+coursenum+"门科,分别是:");
89 get();
90 }
91 }
在主运行方法内部实现输出,详细代码如下所示。
92 ///在主运行方法中,通过学生类的方法来访问学生类的内部类courses
93 public static void main(String[]args)
94 {
95 String[]courses={"语文","数学","英语","化学"};
96 students st=new students();
97 st.setname("王浩");
98 st.setcode("200123");
99 st.setsexy("男");
100 st.setaddress("北京海淀区");
101 System.out.println(st.tostring());
102 st.setstudentcourse(courses);
103 }
【代码说明】这里的代码一定要注意,第63~91行定义了内部类和第92~103行的主运行方法都应该在类students的{}内,本例是为了讲解方便,将代码分成了三段。
【运行效果】
学生 姓名:王浩 学号:200123 性别:男出 生年月:null 家庭地址:北京海淀区
学生 姓名:王浩学生 学号:200123一共选择了:4门科,分别是:
语文数学英语化学
类的访问控制符在前面章节中讲过,只能有“public”和“default”两种。那为什么在这里的内部类会出现private呢?
作为一个单独的类,的确只能有“public”和“default”两种访问控制符,但是作为内部类,就可以使用“private”控制符。当内部类设置为“private”,包含此内部类的外部类的方法才可以访问它。在这个程序段里,“students”类中的方法可以访问这个内部类。
内部类如何创建对象呢?其实可以像一般的类一样,直接使用“new”关键字来创建。在上面的实例中,使用一个方法setstudentcourse()来创建内部类的实例对象。内部类的构造器中包含了这个内部类要实现的所有方法。
注意
当类创建出对象之前,首先会访问构造器,会运行构造器中的所有方法。这样,就相当于直接访问了内部类的私有方法,这种方法可以将对象中所有方法一并实现。