12.2.2 抽象类的实例
【实例12.3】本节使用一个综合实例,来了解抽象类如何在实际开发中使用,以及使用抽象类的好处在哪里。先来分析这个实例的流程,如图12.3所示。
图 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; 家庭地址:成都市区学校地址:成都市;
抽象类的另一个用处是:在抽象类中定义一个统一的、通用的抽象方法,这个方法允许子类去覆盖,这样就能保证整个程序的一致性。