11.2.2 局部内部类
本小节通过对比局部变量,来学习局部内部类。局部变量就是在某个类的方法中定义的变量,它的作用范围就在这个方法体内。同样局部内部类就是在类的方法中定义的一个内部类,它的作用范围也在这个方法体内。
【实例11.6】把上面的实例修改一下,学习局部内部类的使用。这个实例的流程如图11.5所示。
图 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”局部变量。在类外不可直接访问局部内部类,以保证局部内部类对外是不可见的,只有在方法中才能调用其局部内部类。