11.1.5 接口的多重实现
前面提到过接口能够补充继承的不足,现在讲解如何补充。继承必须是单继承的,即一个类继承另一个类后,这个类就不能继承其他类。而接口则无所谓,一个类可以实现一个接口,也可以同时实现另一个接口。
【实例11.3】使用接口为编程提供了很大的方便,可以把上面的程序段修改一下。为了能更好地理解这个程序,先看看程序的流程,如图11.2所示。
图 11.2 多重实现的流程图
首先是第一个学校接口的设计,代码如下所示。
01 interface school //创建一个接口
02 {
03 void setschoolname(String schoolname);
04 void setclassname(String schoolclassname);
05 void setname(String name);
06 void setcode(String code);
07 void setsexy(String sexy);
08 void setbirthday(String birthday);
09 void setfamilyaddress(String familyaddress);
10 }
接着第二个学校接口的设计,代码如下所示。
11 interface school1 //创建另一个接口
12 {
13 String getschoolname();
14 String getclassname();
15 String getname();
16 String getcode();
17 String getsexy();
18 String getbirthday();
19 String getfamilyaddress();
20 }
下面学习如何设计学生类,详细代码如下所示。
21 ///创建一个类,让它实现学校这两个接口
22 ///通过设置器来设置各个参数
23 ///通过访问器来获得对象的参数
24 ///通过tostring方法来让对象以字符串形式输出
25 class student implements school, school1 //一个类实现两个不同的接口
26 {
27 private String schoolname;
28 private String classname;
29 private String studentname;
30 private String studentcode;
31 private String studentsexy;
32 private String studentbirthday;
33 private String familyaddress;
34 public void setschoolname(String schoolname)
35 {
36 this.schoolname=schoolname;
37 }
38 public void setclassname(String classname)
39 {
40 this.classname=classname;
41 }
42 public void setname(String studentname)
43 {
44 this.studentname=studentname;
45 }
46 public void setcode(String studentcode)
47 {
48 this.studentcode=studentcode;
49 }
50 public void setsexy(String studentsexy)
51 {
52 this.studentsexy=studentsexy;
53 }
54 public void setbirthday(String studentbirthday)
55 {
56 this.studentbirthday=studentbirthday;
57 }
58 public void setfamilyaddress(String familyaddress)
59 {
60 this.familyaddress=familyaddress;
61 }
62 public String getschoolname()
63 {
64 return schoolname;
65 }
66 public String getclassname()
67 {
68 return classname;
69 }
70 public String getname()
71 {
72 return studentname;
73 }
74 public String getcode()
75 {
76 return studentcode;
77 }
78 public String getsexy()
79 {
80 return studentsexy;
81 }
82 public String getbirthday()
83 {
84 return studentbirthday;
85 }
86 public String getfamilyaddress()
87 {
88 return familyaddress;
89 }
90 public String tostring()
91 {
92 String infor="学校 名称:"+schoolname+""+" 班级名称:"+classname+""+"学生 姓名:
93"+studentname+""+" 学号:"+studentcode+""+" 性别:"+studentsexy+""+"出 生年月:
94"+studentbirthday+""+" 家庭地址:"+familyaddress;
95 return infor;
96 }
97 }
设计教师类的代码如下所示。
98 ///让教师类实现学校这两个接口
99 ///通过设置器来设置各个参数
100 ///通过访问器来获得各个参数
101 ///通过tostring方法来让对象以字符串形式输出
102 class teacher implements school, school1 //一个类实现两个不同的接口
103 {
104 private String schoolname;
105 private String classname;
106 private String teachername;
107 private String teachercode;
108 private String teachersexy;
109 private String teacherbirthday;
110 private String familyaddress;
111 public void setschoolname(String schoolname)
112 {
113 this.schoolname=schoolname;
114 }
115 public void setclassname(String classname)
116 {
117 this.classname=classname;
118 }
119 public void setname(String teachername)
120 {
121 this.teachername=teachername;
122 }
123 public void setcode(String teachercode)
124 {
125 this.teachercode=teachercode;
126 }
127 public void setsexy(String teachersexy)
128 {
129 this.teachersexy=teachersexy;
130 }
131 public void setbirthday(String teacherbirthday)
132 {
133 this.teacherbirthday=teacherbirthday;
134 }
135 public void setfamilyaddress(String familyaddress)
136 {
137 this.familyaddress=familyaddress;
138 }
139 public String getschoolname()
140 {
141 return schoolname;
142 }
143 public String getclassname()
144 {
145 return classname;
146 }
147 public String getname()
148 {
149 return teachername;
150 }
151 public String getcode()
152 {
153 return teachercode;
154 }
155 public String getsexy()
156 {
157 return teachersexy;
158 }
159 public String getbirthday()
160 {
161 return teacherbirthday;
162 }
163 public String getfamilyaddress()
164 {
165 return familyaddress;
166 }
167 public String tostring()
168 {
169 String infor="学校 名称:"+schoolname+""+" 班级名称:"+classname+""+" 教师姓名:
170"+teachername+""+" 教师工号:"+teachercode+""+" 性别:"+teachersexy+""+"出 生年月:
171"+teacherbirthday+""+" 家庭地址:"+familyaddress;
172 return infor;
173 }
174 }
主运行程序将上面设计的类通过对象的形式输出。其详细代码如下所示。
175 ///主运行函数
176 ///从学生类中创建出几个对象
177 ///从教师类中创建出几个对象
178 ///通过设置器设置各个参数,在对象内部隐
179 ///藏着访问器,来访问这些参数
180 ///以字符串形式输出这些对象的字符串
181 public class schooltest1
182 {
183 public static void main(String[]args)
184 {
185 student st1=new student();
186 student st2=new student();
187 teacher te1=new teacher();
188 teacher te2=new teacher();
189 st1.setschoolname("重庆大学");
190 st1.setclassname("计算机二班");
191 st1.setname("王浩");
192 st1.setcode("951034");
193 st1.setsexy("男");
194 st1.setbirthday("1975-07-21");
195 st1.setfamilyaddress("上海市浦东新区");
196 st2.setschoolname("重庆大学");
197 st2.setclassname("计算机三班");
198 st2.setname("赵丽");
199 st2.setcode("951068");
200 st2.setsexy("女");
201 st2.setbirthday("1975-10-09");
202 st2.setfamilyaddress("北京海淀区");
203 te1.setschoolname("四川大学");
204 te1.setclassname("计算机二班");
205 te1.setname("孙敏");
206 te1.setcode("00123");
207 te1.setsexy("女");
208 te1.setbirthday("1968-04-20");
209 te1.setfamilyaddress("重庆市沙坪坝区");
210 te2.setschoolname("四川大学");
211 te2.setclassname("机械系三班");
212 te2.setname("赵为民");
213 te2.setcode("11233");
214 te2.setsexy("男");
215 te2.setbirthday("1961-02-13");
216 te2.setfamilyaddress("成都市区");
217 System.out.println(st1.tostring());
218 System.out.println(st2.tostring());
219 System.out.println(te1.tostring());
220 System.out.println(te2.tostring());
221 }
222 }
【代码说明】第1~10行和第11~20行分别定义了两个接口,不过它们的内容组合在一起就是上一个案例的接口school。第25行和第102行分别定义了类stduent和teacher,它们都实现了这两个接口,接口之间以逗号间隔。其他内容都与上例相同。
【运行效果】
学校 名称:重庆大学 班级名称:计算机二班学生 姓名:王浩 学号:951034 性别:男出 生年月:1975-07-21 家庭地址:上海市浦东新区
学校 名称:重庆大学 班级名称:计算机三班学生 姓名:赵丽 学号:951068 性别:女出 生年月:1975-10-09 家庭地址:北京海淀区
学校 名称:四川大学 班级名称:计算机二班 教师姓名:孙敏 教师工号:00123 性别:女出 生年月:1968-04-20 家庭地址:重庆市沙坪坝区
学校 名称:四川大学 班级名称:机械系三班 教师姓名:赵为民 教师工号:11233 性别:男出 生年月:1961-02-13 家庭地址:成都市区
在上面的程序段中,将一个接口分成了两个。然后用一个类同时实现两个接口,运行结果依然不变。如果是继承就不允许这样,因为一个类只能继承一个类,不能继承多个类,这就是接口的多重实现。