11.1.5 接口的多重实现

前面提到过接口能够补充继承的不足,现在讲解如何补充。继承必须是单继承的,即一个类继承另一个类后,这个类就不能继承其他类。而接口则无所谓,一个类可以实现一个接口,也可以同时实现另一个接口。

【实例11.3】使用接口为编程提供了很大的方便,可以把上面的程序段修改一下。为了能更好地理解这个程序,先看看程序的流程,如图11.2所示。


11.1.5 接口的多重实现 - 图1

图 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 家庭地址:成都市区


在上面的程序段中,将一个接口分成了两个。然后用一个类同时实现两个接口,运行结果依然不变。如果是继承就不允许这样,因为一个类只能继承一个类,不能继承多个类,这就是接口的多重实现。