12.2.2 抽象类的实例

【实例12.3】本节使用一个综合实例,来了解抽象类如何在实际开发中使用,以及使用抽象类的好处在哪里。先来分析这个实例的流程,如图12.3所示。


12.2.2 抽象类的实例 - 图1

图 12.3 抽象类实例的流程图

首先研究学校抽象类的设计,代码如下所示。


01 ///创建一个抽象类

02 ///schoolname指学校 名称

03 ///classname指 班级名称

04 ///location指地址

05 ///set是设置器,用来赋值给对象

06 ///由于在这个类中存在抽象方法,所以这个类就是一个抽象类

07 abstract class school

08 {

09 String schoolname;

10 String classname;

11 String location;

12 public void setschoolname(String schoolname)//通过设置器来设置学校 名称、 班级名称

13 {

14 this.schoolname=schoolname;

15 }

16 public void setclassname(String classname)

17 {

18 this.classname=classname;

19 }

20 public String getschoolname()

21 {

22 return schoolname;

23 }

24 public String getclassname()

25 {

26 return classname;

27 }

28 abstract void setlocation(String location);

29 abstract String getlocation();

30 public String tostring()

31 {

32 String infor="学校 名称:"+schoolname+";"+""+" 班级名称"+classname;

33 return infor;

34 }

35 }


接下来,设计学生类并且继承上面的抽象类,代码如下。


36 ///创建一个学生类来继承这个抽象类,这个类中设置了学生 姓名、 学号

37 /// 性别、出 生年月、 家庭地址等参数。且使用设置器和访问器来编写它

38 ///studentname指学生 姓名

39 ///studentcode指学生 学号

40 ///studentsexy指学生 性别

41 ///studentbirthday指学生出 生年月

42 ///studentaddress指学生 家庭地址

43 ///set是类中的设置器

44 ///get是类中的访问器

45 class student1 extends school

46 {

47 String studentname;

48 String studentcode;

49 String studentsexy;

50 String studentbirthday;

51 String studentaddress;

52 void setlocation(String location)

53 {

54 this.location=location;

55 }

56 String getlocation()

57 {

58 return location;

59 }

60 void setstudentname(String studentname)

61 {

62 this.studentname=studentname;

63 }

64 void setstudentcode(String studentcode)

65 {

66 this.studentcode=studentcode;

67 }

68 void setstudentsexy(String studentsexy)

69 {

70 this.studentsexy=studentsexy;

71 }

72 void setstudentbirthday(String studentbirthday)

73 {

74 this.studentbirthday=studentbirthday;

75 }

76 void setstudentaddress(String studentaddress)

77 {

78 this.studentaddress=studentaddress;

79 }

80 String getstudentname()

81 {

82 return studentname;

83 }

84 String getstudentcode()

85 {

86 return studentcode;

87 }

88 String getstudentsexy()

89 {

90 return studentsexy;

91 }

92 String getstudentbirthday()

93 {

94 return studentbirthday;

95 }

96 String getstudentaddress()

97 {

98 return studentaddress;

99 }

100 public String tostring()

101 {

102 String infor=super.tostring()+"学校地址"+location+""+"学生 姓名

103"+studentname+";"+""+" 学号:"+studentcode+";"+""+" 性别:"+studentsexy+";

104"+""+"出生日期:"+studentbirthday+";"+""+" 家庭地址:"+studentaddress;

105 return infor;

106 }

107 }


下面再看看第二个学生类的设计,代码如下。


108 ///在这个类中,拥有抽象方法。所以这个类也是一个抽象类。同时也设置了姓名、

109 /// 学号、 性别、出 生年月、 家庭地址的参数

110 ///这个类是一个抽象类的学生类

111 ///studentname指学生 姓名

112 ///studentcode指学生 学号

113 ///studentsexy指学生 性别

114 ///studentbirthday指学生出 生年月

115 ///studentaddress指学生 家庭地址

116 ///set是类中的设置器

117 ///get是类中的访问器

118 abstract class student2 extends school

119 {

120 String studentname;

121 String studentcode;

122 String studentsexy;

123 String studentbirthday;

124 String studentaddress;

125 abstract void setlocation(String location);

126 abstract String getlocation();

127 void setstudentname(String studentname)

128 {

129 this.studentname=studentname;

130 }

131 void setstudentcode(String studentcode)

132 {

133 this.studentcode=studentcode;

134 }

135 void setstudentsexy(String studentsexy)

136 {

137 this.studentsexy=studentsexy;

138 }

139 void setstudentbirthday(String studentbirthday)

140 {

141 this.studentbirthday=studentbirthday;

142 }

143 void setstudentaddress(String studentaddress)

144 {

145 this.studentaddress=studentaddress;

146 }

147 String getstudentname()

148 {

149 return studentname;

150 }

151 String getstudentcode()

152 {

153 return studentcode;

154 }

155 String getstudentsexy()

156 {

157 return studentsexy;

158 }

159 String getstudentbirthday()

160 {

161 return studentbirthday;

162 }

163 String getstudentaddress()

164 {

165 return studentaddress;

166 }

167 public String tostring()

168 {

169 String infor=super.tostring()+"学生 姓名:"+studentname+";"+""+" 学号:

170"+studentcode+";"+""+" 性别:"+studentsexy+";"+""+"出生日期:"+studentbirthday+";

171"+""+" 家庭地址:"+studentaddress;

172 return infor;

173 }

174 }


再看第三个学生类的设计代码,如下所示。


175 ///创建一个类来继承上面的一个抽象类,来实现那个抽象类中的抽象方法。这个类中无抽象方法,

176 ///也没有声明为抽象类。这个类就不是抽象类


177 ///这个类是一个抽象类的学生类

178 ///studentname指学生 姓名

179 ///studentcode指学生 学号

180 ///studentsexy指学生 性别

181 ///studentbirthday指学生出 生年月

182 ///studentaddress指学生 家庭地址

183 ///set是类中的设置器

184 ///get是类中的访问器

185 class student3 extends student2

186 {

187 void setlocation(String location)

188 {

189 this.location=location;

190 }

191 String getlocation()

192 {

193 return location;

194 }

195 public String tostring()

196 {

197 String infor=super.tostring()+"学校地址:"+location+";"+"";

198 return infor;

199 }

200 }


最后,看看以上所有的类,在主运行类中如何实现输出功能,代码如下所示。


201 ///这是一个主运行类

202 ///s1,s3是为学生类创建出来的两个不同的对象

203 ///set指设置器

204 ///通过tostring参数将对象中的参数一一以字符串形式输出

205 public class abstracttest

206 {

207 public static void main(String[]args)

208 {

209 student1 s1=new student1();

210 student3 s3=new student3();

211 s1.setschoolname("重庆大学");

212 s1.setclassname("计算机三班");

213 s1.setlocation("沙坪坝");

214 s1.setstudentname("王浩");

215 s1.setstudentcode("95012");

216 s1.setstudentsexy("男");

217 s1.setstudentbirthday("1976-07-14");

218 s1.setstudentaddress("重庆市解放碑");

219 s3.setschoolname("四川大学");

220 s3.setclassname("机械系一班");

221 s3.setlocation("成都市");

222 s3.setstudentname("董洁");

223 s3.setstudentcode("33012");

224 s3.setstudentsexy("女");

225 s3.setstudentbirthday("1974-08-21");

226 s3.setstudentaddress("成都市区");

227 System.out.println(s1.tostring());

228 System.out.println(s3.tostring());

229 }

230 }


【代码说明】第118~174行的类“student2”是个抽象类,因为它没有实现抽象类“school”的全部方法,而“student1”和“student3”则不是抽象类,因为它实现了抽象类的全部方法。

【运行效果】


学校 名称:重庆大学; 班级名称计算机三班学校地址沙坪坝学生 姓名王浩; 学号:95012;

 性别:男;出生日期:1976-07-14; 家庭地址:重庆市解放碑

学校 名称:四川大学; 班级名称机械系一班学生 姓名:董洁; 学号:33012; 性别:女;

出生日期:1974-08-21; 家庭地址:成都市区学校地址:成都市;


抽象类的另一个用处是:在抽象类中定义一个统一的、通用的抽象方法,这个方法允许子类去覆盖,这样就能保证整个程序的一致性。