11.2 内部类

内部类就是在一个类的内部再创建一个类。下面介绍如何使用内部类编写程序代码,并了解内部类在编写代码的过程中,为程序员提供了哪些方便和优点。

内部类的好处:

❑内部类的对象能够访问创建它的对象的所有方法和属性,包括私有数据。

❑对于同一个包中的其他类来说,内部类是隐形的。

❑匿名内部类可以很方便地定义回调。

❑使用内部类可以很方便地编写事件驱动的程序。

下面将这些特点贯穿整节,通过实例来讲述。

11.2.1 使用内部类来访问对象

【实例11.5】下面将举个有关内部类的实例。在分析这个实例之前,先了解这个实例的流程,如图11.4所示。

11.2 内部类 - 图1

图 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()来创建内部类的实例对象。内部类的构造器中包含了这个内部类要实现的所有方法。

注意

当类创建出对象之前,首先会访问构造器,会运行构造器中的所有方法。这样,就相当于直接访问了内部类的私有方法,这种方法可以将对象中所有方法一并实现。