- 零基礎(chǔ)學(xué)Java第2版
- 陳潔
- 3861字
- 2018-12-31 19:34:43
7.4 用實例分析設(shè)計一個類的流程
下面將會通過一個綜合實例,來總結(jié)本章中的一些比較重要的知識,從而總結(jié)一下編程思想。
7.4.1 如何在現(xiàn)實程序設(shè)計中提取一個類
在現(xiàn)實程序開發(fā)過程中,需要根據(jù)客戶提供的要求來編寫程序。在編寫程序之前,要分析客戶的要求,這是很關(guān)鍵的一步。針對客戶的要求,程序員要學(xué)會從客戶要求中提取出類,然后根據(jù)類再創(chuàng)建對象,在對象中規(guī)劃出方法和屬性值,最后,由這些方法和屬性值共同完成客戶提供的要求。
【實例7.10】下面舉一個實例,通過這個實例來證明以上所講述的步驟。
對于一個班的學(xué)生,開發(fā)一個學(xué)生信息的程序段。其要求如下所示:
(1)男生有10名,女生有15名。請輸出他們的姓名、性別、學(xué)號。
(2)其中張杰是男生,也是班長,請輸出其信息。
(3)對所有學(xué)生的成績信息進行輸出。
(4)通過班上的成績,選出最好的學(xué)生和最差的學(xué)生。
這個實例看起來有點復(fù)雜。其實仔細分析應(yīng)該不是很難。編寫程序最關(guān)鍵是程序員的思路,思路清晰了,代碼自然很好解決。下面看看如何分析這個實例。
對于這個實例,從所有的要求看來,都是圍繞著學(xué)生,所以提取一個類,就是學(xué)生類。如下:
01 class student 02 { 03 private name; 04 private code; 05 private sexy; 06 private duty; 07 private achievement; 08 }
這個類中的變量是根據(jù)實例要求而定義的,這些變量就是類中的屬性。再來分析實例中需要程序員做什么事情,而要做的事情就是類中的方法。觀察以上的4個要求,主要需要做的事情是輸出和排序,那么類的方法中必須要有輸出方法和排序方法。
對于第一個要求輸出的信息??梢跃帉懴铝蟹椒ê瘮?shù)。
void print() {
}
下面再來觀察第二個要求、第三個要求,其實也是圍繞著學(xué)生信息這個數(shù)組來輸出的。而第四個要求中,要求將所有的數(shù)據(jù)進行排序,選擇出最大的數(shù)據(jù)和最小的數(shù)據(jù)。
好了,現(xiàn)在可以開始編寫程序了。先來看看此程序的流程圖,如圖7.1所示。

圖7.1 有關(guān)類的創(chuàng)建的實例
看下面的代碼。
01 ///這是一個學(xué)生類 02 ///通過帶參數(shù)的構(gòu)造器來構(gòu)造對象 03 ///通過設(shè)置器來設(shè)置對象的屬性 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()//返回學(xué)號 30 { 31 return code; 32 } 33 public String getsexy()//返回性別 34 {return sexy; 35 } 36 public String getduty()//返回職務(wù) 37 {return duty;} 38 public void setachi(double achievement)//設(shè)置成績 39 { 40 this.achievement=achievement; 41 } 42 public double getachi()//返回成績 43 { 44 return achievement; 45 } 46 public void print()//輸出 47 { 48 System.out.println("學(xué)生"+name+"的成績是:"+achievement); 49 } 50 51 public String tostring() 52 { 53 String infor="學(xué)生姓名:"+name+";"+"學(xué)生學(xué)號:"+code+";"+"學(xué)生性別:" 54 +sexy+";"+"學(xué)生職務(wù):"+duty; 55 return infor; 56 } 57 ///這是主運行程序 58 ///構(gòu)造出25個對象。使用帶參數(shù)的構(gòu)造器來構(gòu)造 59 ///再使用設(shè)置器來設(shè)置對象屬性 60 ///使用tostring方法將對象信息輸出 61 public static void main(String[] args) 62 { 63 ///構(gòu)造出學(xué)生對象 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 ///構(gòu)造一個學(xué)生類的對象數(shù)組,將所有的對象放到數(shù)組內(nèi) 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 ///通過設(shè)置器對幾個對象進行賦值 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 ///通過設(shè)置器給幾個對象進行賦值 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 ///通過循環(huán)語句對數(shù)組元素進行排序 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 }
【代碼說明】這個程序段的主要思路如下所示:
?先提取一個類即學(xué)生類student。
?根據(jù)學(xué)生類,創(chuàng)建對象。此時每個同學(xué)就是一個學(xué)生類的對象。
?編寫設(shè)置器和訪問器(第25~45行)。(后面會詳細講述它)
?輸出學(xué)生信息(第119~143行)。
?通過循環(huán)語句和判斷語句對學(xué)生成績進行排序(第196~212行)。
了解上面的思路后,整個程序就很清晰了。剩下的就是對代碼的處理。
【運行結(jié)果】
學(xué)生姓名:王浩;學(xué)生學(xué)號:1;學(xué)生性別:男;學(xué)生職務(wù):班員 學(xué)生姓名:李敏;學(xué)生學(xué)號:2;學(xué)生性別:男;學(xué)生職務(wù):班員 學(xué)生姓名:李杰;學(xué)生學(xué)號:3;學(xué)生性別:男;學(xué)生職務(wù):班員 學(xué)生姓名:王杰;學(xué)生學(xué)號:4;學(xué)生性別:男;學(xué)生職務(wù):班員 學(xué)生姓名:王超;學(xué)生學(xué)號:5;學(xué)生性別:男;學(xué)生職務(wù):班員 學(xué)生姓名:趙浩;學(xué)生學(xué)號:6;學(xué)生性別:男;學(xué)生職務(wù):班員 學(xué)生姓名:錢浩;學(xué)生學(xué)號:7;學(xué)生性別:男;學(xué)生職務(wù):班員 學(xué)生姓名:王松;學(xué)生學(xué)號:8;學(xué)生性別:男;學(xué)生職務(wù):班員 學(xué)生姓名:朱濤;學(xué)生學(xué)號:9;學(xué)生性別:男;學(xué)生職務(wù):班員 學(xué)生姓名:張杰;學(xué)生學(xué)號:10;學(xué)生性別:男;學(xué)生職務(wù):班長 學(xué)生姓名:王敏;學(xué)生學(xué)號:11;學(xué)生性別:女;學(xué)生職務(wù):班員 學(xué)生姓名:孫潔;學(xué)生學(xué)號:12;學(xué)生性別:女;學(xué)生職務(wù):班員 學(xué)生姓名:趙麗;學(xué)生學(xué)號:13;學(xué)生性別:女;學(xué)生職務(wù):班員 學(xué)生姓名:王麗;學(xué)生學(xué)號:14;學(xué)生性別:女;學(xué)生職務(wù):班員 學(xué)生姓名:錢珍;學(xué)生學(xué)號:15;學(xué)生性別:女;學(xué)生職務(wù):班員 學(xué)生姓名:王珍;學(xué)生學(xué)號:16;學(xué)生性別:女;學(xué)生職務(wù):班員 學(xué)生姓名:王萍;學(xué)生學(xué)號:17;學(xué)生性別:女;學(xué)生職務(wù):班員 學(xué)生姓名:錢萍;學(xué)生學(xué)號:18;學(xué)生性別:女;學(xué)生職務(wù):班員 學(xué)生姓名:王燕;學(xué)生學(xué)號:19;學(xué)生性別:女;學(xué)生職務(wù):班員 學(xué)生姓名:趙燕;學(xué)生學(xué)號:20;學(xué)生性別:女;學(xué)生職務(wù):班員 學(xué)生姓名:孫燕;學(xué)生學(xué)號:21;學(xué)生性別:女;學(xué)生職務(wù):班員 學(xué)生姓名:孫麗;學(xué)生學(xué)號:22;學(xué)生性別:女;學(xué)生職務(wù):班員 學(xué)生姓名:林麗;學(xué)生學(xué)號:23;學(xué)生性別:女;學(xué)生職務(wù):班員 學(xué)生姓名:張麗;學(xué)生學(xué)號:24;學(xué)生性別:女;學(xué)生職務(wù):班員 學(xué)生姓名:鄭麗;學(xué)生學(xué)號:25;學(xué)生性別:女;學(xué)生職務(wù):班員 學(xué)生王浩的成績是:87.5 學(xué)生李敏的成績是:98.0 學(xué)生李杰的成績是:78.0 學(xué)生王杰的成績是:90.0 學(xué)生王超的成績是:84.0 學(xué)生趙浩的成績是:78.0 學(xué)生錢浩的成績是:91.0 學(xué)生王松的成績是:99.5 學(xué)生朱濤的成績是:64.0 學(xué)生張杰的成績是:100.0 學(xué)生王敏的成績是:98.0 學(xué)生孫潔的成績是:76.0 學(xué)生趙麗的成績是:88.0 學(xué)生王麗的成績是:64.0 學(xué)生錢珍的成績是:97.0 學(xué)生王珍的成績是:68.0 學(xué)生王萍的成績是:90.0 學(xué)生錢萍的成績是:99.0 學(xué)生王燕的成績是:77.0 學(xué)生趙燕的成績是:78.0 學(xué)生孫燕的成績是:67.0 學(xué)生孫麗的成績是:99.0 學(xué)生林麗的成績是:97.5 學(xué)生張麗的成績是:92.0 學(xué)生鄭麗的成績是:88.0 成績最好的是:張杰,成績是:100.0 成績最差的是:朱濤,成績是:64.0
7.4.2 設(shè)置器和訪問器
在上面的程序段中,出現(xiàn)過“set”和“get”函數(shù),那么這些函數(shù)起著什么作用?在Java語言中把“set”函數(shù)稱為設(shè)置器,把“get”函數(shù)稱為訪問器。
訪問器只查看對象的狀態(tài)或者返回對象的屬性值。訪問器有以下特點:
?方法聲明部分有返回值類型。
?方法聲明沒有參數(shù)。
?方法體內(nèi)有返回語句。
設(shè)置器主要是完成某個對象屬性值的賦值功能。設(shè)置器有以下特點:
?方法返回類型為void,即不返回類型。
?方法聲明中至少有一個參數(shù)。
?方法體內(nèi)肯定有賦值語句。
把上例中的設(shè)置器和訪問器單獨拿出來看看是否是具有這些特點。
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”函數(shù):“set”、“setachi”函數(shù)?!皏oid set(String name,String code,String sexy,String duty)”帶了4個參數(shù),無返回值,存在4個賦值語句?!皃ublic void setachi(double achievement)”帶了一個參數(shù),無返回值,且存在一個賦值語句。
再來觀察“get”函數(shù):“getname”、“getcode”、“getduty”、“getsexy”、“getachi”。這5個訪問器都是有返回值,不帶任何參數(shù),且方法體內(nèi)有一個返回語句。
如果要實現(xiàn)一個對屬性的訪問和設(shè)置,一般應(yīng)該有以下幾項內(nèi)容:
?一個私有的字段變量。
?一個公開的字段訪問器。
?一個公開的字段設(shè)置器。
7.4.3 總結(jié)
本章正式開始接觸Java程序設(shè)計的特點,主要講述了什么是類和如何提取一個類。在本章中舉了一個現(xiàn)實生活中的程序開發(fā)的實例,并詳細地分析了編寫程序的主要思路。希望讀者能熟練地掌握。其實想要掌握一門編程語言,最關(guān)鍵的就是要多多練習(xí),正所謂熟能生巧。
- Java EE 6 企業(yè)級應(yīng)用開發(fā)教程
- 構(gòu)建移動網(wǎng)站與APP:HTML 5移動開發(fā)入門與實戰(zhàn)(跨平臺移動開發(fā)叢書)
- Learning SQLite for iOS
- Building a Recommendation Engine with Scala
- NGINX Cookbook
- HTML+CSS+JavaScript網(wǎng)頁設(shè)計從入門到精通 (清華社"視頻大講堂"大系·網(wǎng)絡(luò)開發(fā)視頻大講堂)
- Scala編程(第5版)
- Data Science Algorithms in a Week
- Machine Learning for OpenCV
- 軟件測試技術(shù)
- 計算機常用算法與程序設(shè)計教程(第2版)
- 區(qū)塊鏈:技術(shù)與場景
- PHP從入門到精通(第7版)
- Pandas入門與實戰(zhàn)應(yīng)用:基于Python的數(shù)據(jù)分析與處理
- Natural Language Processing with Python Cookbook