零基础学Java第2版
上QQ阅读APP看书,第一时间看更新

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

7.4.2 设置器和访问器

在上面的程序段中,出现过“set”和“get”函数,那么这些函数起着什么作用?在Java语言中把“set”函数称为设置器,把“get”函数称为访问器。

访问器只查看对象的状态或者返回对象的属性值。访问器有以下特点:

❑方法声明部分有返回值类型。

❑方法声明没有参数。

❑方法体内有返回语句。

设置器主要是完成某个对象属性值的赋值功能。设置器有以下特点:

❑方法返回类型为void,即不返回类型。

❑方法声明中至少有一个参数。

❑方法体内肯定有赋值语句。

把上例中的设置器和访问器单独拿出来看看是否是具有这些特点。

01   void set(String name,String code,String sexy,String duty)
02      {
03         this.name=name;
04         this.code=code;
05         this.sexy=sexy;
06         this.duty=duty;
07           }
08         public String getname()
09         {
10           return name;
11
12         }
13         public String getcode()
14         {return code;
15           }
16           public String getsexy()
17           {return sexy;
18           }
19           public String getduty()
20           {return duty;}
21           public void setachi(double achievement)
22           {
23              this.achievement=achievement;
24           }
25           public double getachi()
26           {
27              return achievement;
28           }

【代码说明】先观察这些“set”函数:“set”、“setachi”函数。“void set(String name,String code,String sexy,String duty)”带了4个参数,无返回值,存在4个赋值语句。“public void setachi(double achievement)”带了一个参数,无返回值,且存在一个赋值语句。

再来观察“get”函数:“getname”、“getcode”、“getduty”、“getsexy”、“getachi”。这5个访问器都是有返回值,不带任何参数,且方法体内有一个返回语句。

如果要实现一个对属性的访问和设置,一般应该有以下几项内容:

❑一个私有的字段变量。

❑一个公开的字段访问器。

❑一个公开的字段设置器。

7.4.3 总结

本章正式开始接触Java程序设计的特点,主要讲述了什么是类和如何提取一个类。在本章中举了一个现实生活中的程序开发的实例,并详细地分析了编写程序的主要思路。希望读者能熟练地掌握。其实想要掌握一门编程语言,最关键的就是要多多练习,正所谓熟能生巧。