7.4 用实例分析设计一个类的流程
下面将会通过一个综合实例,来总结本章中的一些比较重要的知识,从而总结一下编程思想。
7.4.1 如何在现实程序设计中提取一个类
在现实程序开发过程中,需要根据客户提供的要求来编写程序。在编写程序之前,要分析客户的要求,这是很关键的一步。针对客户的要求,程序员要学会从客户要求中提取出类,然后根据类再创建对象,在对象中规划出方法和属性值,最后,由这些方法和属性值共同完成客户提供的要求。
【实例7.10】下面举一个实例,通过这个实例来证明以上所讲述的步骤。
对于一个班的学生,开发一个学生信息的程序段。其要求如下所示:
(1)男生有10名,女生有15名。请输出他们的姓名、 性别、 学号。
(2)其中张杰是男生,也是班长,请输出其信息。
(3)对所有学生的成绩信息进行输出。
(4)通过班上的成绩,选出最好的学生和最差的学生。
这个实例看起来有点复杂。其实仔细分析应该不是很难。编写程序最关键是程序员的思路,思路清晰了,代码自然很好解决。下面看看如何分析这个实例。
对于这个实例,从所有的要求看来,都是围绕着学生,所以提取一个类,就是学生类。如下:
01 class student
02 {
03 private name;
04 private code;
05 private sexy;
06 private duty;
07 private achievement;
08 }
这个类中的变量是根据实例要求而定义的,这些变量就是类中的属性。再来分析实例中需要程序员做什么事情,而要做的事情就是类中的方法。观察以上的4个要求,主要需要做的事情是输出和排序,那么类的方法中必须要有输出方法和排序方法。
对于第一个要求输出的信息。可以编写下列方法函数。
void print()
{
}
下面再来观察第二个要求、第三个要求,其实也是围绕着学生信息这个数组来输出的。而第四个要求中,要求将所有的数据进行排序,选择出最大的数据和最小的数据。
好了,现在可以开始编写程序了。先来看看此程序的流程图,如图7.1所示。
图 7.1 有关类的创建的实例
看下面的代码。
01 ///这是一个学生类
02 ///通过带参数的构造器来构造对象
03 ///通过设置器来设置对象的属性
04 ///通过访问器来访问对象的属性
05 ///tostring是一个将对象以字符串的形式输出的方法
06 public class student
07 {
08 String name="";
09 String code="";
10 String sexy="";
11 String duty="";
12 double achievement;
13 public student(String name)
14 {
15 this.name=name;
16 }
17 18
void set(String name, String code, String sexy, String duty)
19 {
20 this.name=name;
21 this.code=code;
22 this.sexy=sexy;
23 this.duty=duty;
24 }
25 public String getname()//返回姓名
26 {
27 return name;
28 }
29 public String getcode()//返回 学号
30 {
31 return code;
32 }
33 public String getsexy()//返回 性别
34 {return sexy;
35 }
36 public String getduty()//返回职务
37 {return duty;}
38 public void setachi(double achievement)//设置成绩
39 {
40 this.achievement=achievement;
41 }
42 public double getachi()//返回成绩
43 {
44 return achievement;
45 }
46 public void print()//输出
47 {
48 System.out.println("学生"+name+"的成绩是:"+achievement);
49 }
50 51
public String tostring()
52 {
53 String infor="学生 姓名:"+name+";"+"学生 学号:"+code+";"+"学生 性别:"
54+sexy+";"+"学生职务:"+duty;
55 return infor;
56 }
57 ///这是主运行程序
58 ///构造出25个对象。使用带参数的构造器来构造
59 ///再使用设置器来设置对象属性
60 ///使用tostring方法将对象信息输出
61 public static void main(String[]args)
62 {
63 ///构造出学生对象
64 student st1=new student("王浩");
65 student st2=new student("李敏");
66 student st3=new student("李杰");
67 student st4=new student("王杰");
68 student st5=new student("王超");
69 student st6=new student("赵浩");
70 student st7=new student("钱浩");
71 student st8=new student("王松");
72 student st9=new student("朱涛");
73 student st10=new student("张杰");
74 student st11=new student("王敏");
75 student st12=new student("孙洁");
76 student st13=new student("赵丽");
77 student st14=new student("王丽");
78 student st15=new student("钱珍");
79 student st16=new student("王珍");
80 student st17=new student("王萍");
81 student st18=new student("钱萍");
82 student st19=new student("王燕");
83 student st20=new student("赵燕");
84 student st21=new student("孙燕");
85 student st22=new student("孙丽");
86 student st23=new student("林丽");
87 student st24=new student("张丽");
88 student st25=new student("郑丽");
89 ///构造一个学生类的对象数组,将所有的对象放到数组内
90 student[]st=new student[]
91 {st1,st2,st3,st4,st5,st6,st7,st8,st9,st10,st11,st12,st13,st14,st15,st16,st17,st18,st19,st20
92,st21,st22,st23,st24,st25};
93 ///通过设置器对几个对象进行赋值
94 st1.set("王浩","1","男","班员");
95 st2.set("李敏","2","男","班员");
96 st3.set("李杰","3","男","班员");
97 st4.set("王杰","4","男","班员");
98 st5.set("王超","5","男","班员");
99 st6.set("赵浩","6","男","班员");
100 st7.set("钱浩","7","男","班员");
101 st8.set("王松","8","男","班员");
102 st9.set("朱涛","9","男","班员");
103 st10.set("张杰","10","男","班长");
104 st11.set("王敏","11","女","班员");
105 st12.set("孙洁","12","女","班员");
106 st13.set("赵丽","13","女","班员");
107 st14.set("王丽","14","女","班员");
108 st15.set("钱珍","15","女","班员");
109 st16.set("王珍","16","女","班员");
110 st17.set("王萍","17","女","班员");
111 st18.set("钱萍","18","女","班员");
112 st19.set("王燕","19","女","班员");
113 st20.set("赵燕","20","女","班员");
114 st21.set("孙燕","21","女","班员");
115 st22.set("孙丽","22","女","班员");
116 st23.set("林丽","23","女","班员");
117 st24.set("张丽","24","女","班员");
118 st25.set("郑丽","25","女","班员");
119 System.out.println(st1.tostring());
120 System.out.println(st2.tostring());
121 System.out.println(st3.tostring());
122 System.out.println(st4.tostring());
123 System.out.println(st5.tostring());
124 System.out.println(st6.tostring());
125 System.out.println(st7.tostring());
126 System.out.println(st8.tostring());
127 System.out.println(st9.tostring());
128 System.out.println(st10.tostring());
129 System.out.println(st11.tostring());
130 System.out.println(st12.tostring());
131 System.out.println(st13.tostring());
132 System.out.println(st14.tostring());
133 System.out.println(st15.tostring());
134 System.out.println(st16.tostring());
135 System.out.println(st17.tostring());
136 System.out.println(st18.tostring());
137 System.out.println(st19.tostring());
138 System.out.println(st20.tostring());
139 System.out.println(st21.tostring());
140 System.out.println(st22.tostring());
141 System.out.println(st23.tostring());
142 System.out.println(st24.tostring());
143 System.out.println(st25.tostring());
144 ///通过设置器给几个对象进行赋值
145 st1.setachi(87.5);
146 st2.setachi(98);
147 st3.setachi(78);
148 st4.setachi(90);
149 st5.setachi(84);
150 st6.setachi(78);
151 st7.setachi(91);
152 st8.setachi(99.5);
153 st9.setachi(64);
154 st10.setachi(100);
155 st11.setachi(98);
156 st12.setachi(76);
157 st13.setachi(88);
158 st14.setachi(64);
159 st15.setachi(97);
160 st16.setachi(68);
161 st17.setachi(90);
162 st18.setachi(99);
163 st19.setachi(77);
164 st20.setachi(78);
165 st21.setachi(67);
166 st22.setachi(99);
167 st23.setachi(97.5);
168 st24.setachi(92);
169 st25.setachi(88);
170 st1.print();
171 st2.print();
172 st3.print();
173 st4.print();
174 st5.print();
175 st6.print();
176 st7.print();
177 st8.print();
178 st9.print();
179 st10.print();
180 st11.print();
181 st12.print();
182 st13.print();
183 st14.print();
184 st15.print();
185 st16.print();
186 st17.print();
187 st18.print();
188 st19.print();
189 st20.print();
190 st21.print();
191 st22.print();
192 st23.print();
193 st24.print();
194 st25.print();
195 ///通过循环语句对数组元素进行排序
196 for(int i=0;i<st.length;i++)
197 {
198 for(int j=0;j<st.length;j++)
199 {
200 ///通过比较两个元素的大小,如果前面比后面元素大,进行排序
201 if(st[i].achievement<st[j].achievement)
202 {
203 student x;
204 x=st[j];
205 st[j]=st[i];
206 st[i]=x;
207 }
208 }
209 }
210 System.out.println("成绩最好的是:"+st[24].name+",成绩是:"+st[24].achievement);
211 System.out.println("成绩最差的是:"+st[0].name+",成绩是:"+st[0].achievement);
212 }
213 }
【代码说明】这个程序段的主要思路如下所示:
❑先提取一个类即学生类student。
❑根据学生类,创建对象。此时每个同学就是一个学生类的对象。
❑编写设置器和访问器(第25~45行)。(后面会详细讲述它)
❑输出学生信息(第119~143行)。
❑通过循环语句和判断语句对学生成绩进行排序(第196~212行)。
了解上面的思路后,整个程序就很清晰了。剩下的就是对代码的处理。
【运行结果】
学生 姓名:王浩;学生 学号:1;学生 性别:男;学生职务:班员
学生 姓名:李敏;学生 学号:2;学生 性别:男;学生职务:班员
学生 姓名:李杰;学生 学号:3;学生 性别:男;学生职务:班员
学生 姓名:王杰;学生 学号:4;学生 性别:男;学生职务:班员
学生 姓名:王超;学生 学号:5;学生 性别:男;学生职务:班员
学生 姓名:赵浩;学生 学号:6;学生 性别:男;学生职务:班员
学生 姓名:钱浩;学生 学号:7;学生 性别:男;学生职务:班员
学生 姓名:王松;学生 学号:8;学生 性别:男;学生职务:班员
学生 姓名:朱涛;学生 学号:9;学生 性别:男;学生职务:班员
学生 姓名:张杰;学生 学号:10;学生 性别:男;学生职务:班长
学生 姓名:王敏;学生 学号:11;学生 性别:女;学生职务:班员
学生 姓名:孙洁;学生 学号:12;学生 性别:女;学生职务:班员
学生 姓名:赵丽;学生 学号:13;学生 性别:女;学生职务:班员
学生 姓名:王丽;学生 学号:14;学生 性别:女;学生职务:班员
学生 姓名:钱珍;学生 学号:15;学生 性别:女;学生职务:班员
学生 姓名:王珍;学生 学号:16;学生 性别:女;学生职务:班员
学生 姓名:王萍;学生 学号:17;学生 性别:女;学生职务:班员
学生 姓名:钱萍;学生 学号:18;学生 性别:女;学生职务:班员
学生 姓名:王燕;学生 学号:19;学生 性别:女;学生职务:班员
学生 姓名:赵燕;学生 学号:20;学生 性别:女;学生职务:班员
学生 姓名:孙燕;学生 学号:21;学生 性别:女;学生职务:班员
学生 姓名:孙丽;学生 学号:22;学生 性别:女;学生职务:班员
学生 姓名:林丽;学生 学号:23;学生 性别:女;学生职务:班员
学生 姓名:张丽;学生 学号:24;学生 性别:女;学生职务:班员
学生 姓名:郑丽;学生 学号:25;学生 性别:女;学生职务:班员
学生王浩的成绩是:87.5
学生李敏的成绩是:98.0
学生李杰的成绩是:78.0
学生王杰的成绩是:90.0
学生王超的成绩是:84.0
学生赵浩的成绩是:78.0
学生钱浩的成绩是:91.0
学生王松的成绩是:99.5
学生朱涛的成绩是:64.0
学生张杰的成绩是:100.0
学生王敏的成绩是:98.0
学生孙洁的成绩是:76.0
学生赵丽的成绩是:88.0
学生王丽的成绩是:64.0
学生钱珍的成绩是:97.0
学生王珍的成绩是:68.0
学生王萍的成绩是:90.0
学生钱萍的成绩是:99.0
学生王燕的成绩是:77.0
学生赵燕的成绩是:78.0
学生孙燕的成绩是:67.0
学生孙丽的成绩是:99.0
学生林丽的成绩是:97.5
学生张丽的成绩是:92.0
学生郑丽的成绩是:88.0
成绩最好的是:张杰,成绩是:100.0
成绩最差的是:朱涛,成绩是:64.0