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