11.2.2 局部内部类

本小节通过对比局部变量,来学习局部内部类。局部变量就是在某个类的方法中定义的变量,它的作用范围就在这个方法体内。同样局部内部类就是在类的方法中定义的一个内部类,它的作用范围也在这个方法体内。

【实例11.6】把上面的实例修改一下,学习局部内部类的使用。这个实例的流程如图11.5所示。


11.2.2 局部内部类 - 图1

图 11.5 局部内部类的实例流程图

首先设计一个学生类,代码如下所示。


01 ///这是一个学生类

02 ///通过设置器来设置对象参数

03 ///通过访问器来获得对象参数

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

05 public class students1

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 }


在前面设计的外部类的方法中,设计一个内部类,代码如下所示。


59 ///将课程类作为外部类中的一个方法中的成员

60 61

public void setstudentcourse(String[]courses)

62 {

63 class course

64 {

65 private String[]courses;

66 private int coursenum;

67 public course(String[]course)

68 {

69 courses=course;

70 coursenum=course.length;

71 getinfo();

72 }

73 private void get()

74 {

75 for(int i=0;i<coursenum;i++)

76 {

77 System.out.print(""+courses[i]);

78 }

79 }

80 private void getinfo()

81 {

82 System.out.println("学生 姓名:"+students1.this.name+"学生 学号:

83"+students1.this.code+"一共选择了:"+coursenum+"门科,分别是:");

84 get();

85 }

86 }

87 ///创建了一个内部类的对象,随着包含这个内部类的外部方法一起运行

88 new course(courses);

89 }


在主运行程序中,实现对象的输出,代码如下所示。


90 ///在主运行方法中,使用学生类对象的方法来访问局部类courses

91 public static void main(String[]args)

92 {

93 String[]courses={"语文","数学","英语","化学"};

94 students1 st=new students1();

95 st.setname("王浩");

96 st.setcode("200123");

97 st.setsexy("男");

98 st.setaddress("北京海淀区");

99 System.out.println(st.tostring());

100 st.setstudentcourse(courses);

101 }


【代码说明】这个程序从上一节的实例程序修改过来,把内部类放到了“students”类的一个方法体内,这样的内部类就是局部内部类。输出结构与上例相同。

说明 代码第59~101行的内容其实都是在类students1的{}内。

【运行效果】


学生 姓名:王浩 学号:200123 性别:男出 生年月:null 家庭地址:北京海淀区

学生 姓名:王浩学生 学号:200123一共选择了:4门科,分别是:语文数学英语化学


局部内部类是定义在外部类的方法中,与局部变量类似,在局部内部类前不加修饰符“public”和“private”,其范围为定义它的代码块。局部内部类不仅可以访问外部类实例变量,还可以访问外部类的局部常量,但要求外部类的局部变量是“final”的。其实,以上做法相当于是为内部类添加了一个属性,这个属性就是外部类的“final”局部变量。在类外不可直接访问局部内部类,以保证局部内部类对外是不可见的,只有在方法中才能调用其局部内部类。