java第二阶段_Java第二阶段总结
一、前言
此篇博客是對Java第二階段的三次作業做一個小結,這些題目是對Java語言知識點更深層次的挖掘,運用到了面向對象的三大技術特性:封裝性-繼承性-多態性,還學習了正則表達式的運用,是原先作業的更高級。
二、作業過程總結
①總結三次作業之間的知識迭代關系
第四次的作業是水文數據校驗及處理、蒙特卡羅方法求圓周率 、圖形繼承,考的是對于正則表達式和繼承關系的運用,尤其是正則表達式的運用。第五次的作業是圖形繼承與多態、一元多項式求導,考的是面向對象中的封裝性、繼承性以及多態性和正則表達式的運用,一元多項式求導分成了三部分利用正則表達式進行分割。第六次的作業是圖形卡片排序游戲、圖形卡片分組游戲和求素數,這里的作業接觸到接口,又是一個新的知識點的運用,靠的是類的繼承、多態性使用方法以及接口的應用。該階段的作業題目有部分相似之處,如圓形的繼承,有幾題都用到了,還有圖形面積的排序。
②如何通過作業逐步理解面向對象的封裝性、繼承性與多態性三大技術特性
通過第四、五、六次作業了解到了封裝得作用,然后從第五、六作業初步了解了繼承和多態得作用。封裝性是將類的某些信息隱藏在類的內部,不允許外部程序進行直接的訪問調用,通過該類提供的方法來實現對隱藏信息的操作和訪問,隱藏對象的信息,留出訪問的對外接口。繼承性是子類繼承父類得方法,但是不能繼承父類的私有方法。多態性是同一行為具有多個不同表現形式或表現形體的能力。
③作業過程中遇到的問題及解決方法
問題 一 :第四次作業水文校驗題目中出現了很多問題,如輸入連續多個空值、每一列均有誤及格式不對等
解決方法:詢問很多同學,不斷使用特殊示例得以解決,包括檢驗的正則表達式的反反復復修改
問題 二 :一元多項式求導題目思路出現了問題
解決方法:經過查詢資料及檢查發現如何分解每一項的系數和指數出現了邏輯上的問題,最后運用了三個正則表達式來解決這個問題,分別代表三部分:系數、X、指數(具體如下)
問題 三 :一元多項式求導題目中用long類型來計算超大型數據測試時會出現數據偏差的錯誤
解決方法:百度得知使用BigInteger來計算超大型數據不會出現此類問題,并且學到了如何使用BigInteger的乘法和減法(用法如下)
問題 四 :第六次作業第一題輸入0時測試點答案錯誤
解決方法:詢問同學得知要正常輸出但沒有數據而不是非法
問題 五 :第六次作業第二題輸入0時測試點也答案錯誤
解決方法:原本以為跟第一題一樣的情況,也是詢問同學才知道這個地方要報非法“Wrong Format”
問題 六 :第六次作業出現了代碼過長的問題
解決方法:提取了程序中多次重復利用的代碼,寫入shape類中,每當要使用時直接調用即可(具體代碼如下)
1 import java.util.Arrays;importjava.util.Scanner;2 public classMain {3 public static voidmain(String[] args) {4 Scanner input = newScanner(System.in);5 String number;String num;Shape sh = newShape();6 Circle ci = new Circle();Rectangle re = newRectangle();7 Triangle tr = new Triangle();Trapezoid trape = newTrapezoid();8 double[] cili = new double[100];double[] cili2 = new double[100];9 double[] reli = new double[100];double[] reli2 = new double[100];10 double[] trli = new double[100];double[] trli2 = new double[100];11 double[] trapeli = new double[100];12 double[] trapeli2 = new double[100];13 double[] sumli = new double[100];14 String[] sortsumli = new String[100];String[] numli = new String[100];15 int i = 0;int smli = 0;int nums = 0;16 int cil = 0;int rel = 0;int trl = 0;int trapel = 0;17 int cil2 = 0;int rel2 = 0;int trl2 = 0;int trapel2 = 0;18 double sortsums = 0;double sortsums2 = 0;double sortsums3 = 0;double sortsums4 = 0;19 do{20 num =input.nextLine().trim();21 numli = num.split(" ");22 for (int l = 0; l < numli.length; l++) {23 if (Integer.parseInt(numli[l]) > 4 || Integer.parseInt(numli[l]) < 0) {24 System.out.println("Wrong Format");25 return;26 } else{27 nums++;28 }}29 } while (0 != Integer.parseInt(numli[numli.length - 1]));30 if (nums == 1) {31 System.out.println("Wrong Format");32 return;33 }34 number =input.nextLine().trim();35 if (number == null || number.equals("")) {36 System.out.println("Wrong Format");37 return;38 }39 if(sh.validate(number)) {40 for (int l = 0; l < numli.length; l++) {41 switch(Integer.parseInt(numli[l])) {42 case 1:43 i =ci.validate(number, i);44 if (i <= 0) {45 System.out.println("Wrong Format");46 return;47 } else{48 cili = ci.S();sumli[smli] = cili[cil];smli++;cil++;49 }50 break;51 case 2:52 i =re.validate(number, i);53 if (i <= 0) {54 System.out.println("Wrong Format");55 return;56 } else{57 reli = re.S();sumli[smli] = reli[rel];smli++;rel++;58 }59 break;60 case 3:61 i =tr.validate(number, i);62 if (i <= 0) {63 System.out.println("Wrong Format");64 return;65 } else{66 trli = tr.S();sumli[smli] = trli[trl];smli++;trl++;67 }68 break;69 case 4:70 i =trape.validate(number, i);71 if (i <= 0) {72 System.out.println("Wrong Format");73 return;74 } else{75 trapeli = trape.S();sumli[smli] = trapeli[trapel];smli++;trapel++;76 }77 break;78 }79 }80 System.out.println("The original list:");81 for (int l = 0; l < numli.length; l++) {82 switch(Integer.parseInt(numli[l])) {83 case 1:84 if (l == 0) {85 System.out.print("[");86 }87 System.out.print("Circle:" + String.format("%.2f", sumli[l]) + " ");88 if (Integer.parseInt(numli[l+1]) == 0) {89 System.out.print("]");90 }91 sortsumli[l] = String.format("%.2f", sumli[l]) + "Circle";92 cili2[cil2] =sumli[l];93 cil2++;94 break;95 case 2:96 if (l == 0) {97 System.out.print("[");98 }99 System.out.print("Rectangle:" + String.format("%.2f", sumli[l]) + " ");100 if (Integer.parseInt(numli[l+1]) == 0) {101 System.out.print("]");102 }103 sortsumli[l] = String.format("%.2f", sumli[l]) + "Rectangle";104 reli2[rel2] =sumli[l];105 rel2++;106 break;107 case 3:108 if (l == 0) {109 System.out.print("[");110 }111 System.out.print("Triangle:" + String.format("%.2f", sumli[l]) + " ");112 if (Integer.parseInt(numli[l+1]) == 0) {113 System.out.print("]");114 }115 sortsumli[l] = String.format("%.2f", sumli[l]) + "Triangle";116 trli2[trl2] =sumli[l];117 trl2++;118 break;119 case 4:120 if (l == 0) {121 System.out.print("[");122 }123 System.out.print("Trapezoid:" + String.format("%.2f", sumli[l]) + " ");124 if (Integer.parseInt(numli[l+1]) == 0) {125 System.out.print("]");126 }127 sortsumli[l] = String.format("%.2f", sumli[l]) + "Trapezoid";128 trapeli2[trapel2] =sumli[l];129 trapel2++;130 break;131 }132 }133 System.out.println();134 System.out.println("The Separated List:");135 sh.shortlist(cili2,reli2,trli2,trapeli2);136 System.out.println();137 System.out.println("The Separated sorted List:");138 cili2 = sh.So(cili2);reli2 = sh.So(reli2);trli2 = sh.So(trli2);trapeli2 =sh.So(trapeli2);139 sh.shortlist(cili2,reli2,trli2,trapeli2);140 System.out.println();141 sortsums =sh.Sum(cili2);142 sortsums2 =sh.Sum(reli2);143 sortsums3 =sh.Sum(trli2);144 sortsums4 =sh.Sum(trapeli2);145 double[] sortsumsz ={ sortsums,sortsums2,sortsums3,sortsums4};146 double max =Arrays.stream(sortsumsz).max().getAsDouble();147 System.out.println("The max area:" + String.format("%.2f", max));148 }149 }150 }151 classShape {152 public double Sum(double[] so){153 double sum = 0;154 for (int d = 0; d < so.length; d++) {155 if (so[d] > 0) {156 sum = sum +so[d];157 }158 }159 returnsum;160 }161 public double[] So(double[] so){162 for (int l = 0; l < so.length - 1; l++) {163 for (int j = l + 1; j < so.length; j++) {164 if (so[l]
181 + String.format("%.2f", cili2[l]) + " ");182 if (cili2[l + 1] == 0.0) {183 System.out.print("]");184 }185 }186 }187 for (int l = 0; l < reli2.length; l++) {188 if(l == 0 && reli2[l] == 0.0){189 System.out.print("[]");190 }191 if (reli2[l] != 0) {192 if (l == 0) {193 System.out.print("[");194 }195 System.out.print("Rectangle:"
196 + String.format("%.2f", reli2[l]) + " ");197 if (reli2[l + 1] == 0.0) {198 System.out.print("]");199 }200 }201 }202 for (int l = 0; l < trli2.length; l++) {203 if(l == 0 && trli2[l] == 0.0){204 System.out.print("[]");205 }206 if (trli2[l] != 0) {207 if (l == 0) {208 System.out.print("[");209 }210 System.out.print("Triangle:"
211 + String.format("%.2f", trli2[l]) + " ");212 if (trli2[l + 1] == 0.0) {System.out.print("]");}}}213 for (int l = 0; l < trapeli2.length; l++) {214 if(l == 0 && trapeli2[l] == 0.0){215 System.out.print("[]");216 }217 if (trapeli2[l] != 0) {if (l == 0) {System.out.print("[");}218 System.out.print("Trapezoid:"+ String.format("%.2f", trapeli2[l]) + " ");219 if (trapeli2[l + 1] == 0.0) {System.out.print("]");}}}}220 public booleanvalidate(String number) {221 String[] num = new String[10000];222 num = number.split(" ");223 for (int i = 0; i < num.length; i++) {224 if (Double.parseDouble(num[i]) < 0) {225 return false;226 } else{227 return true;228 }229 }230 return false;231 }232 }233 classCircle {234 double[] n = new double[10000];double[] s = new double[10000];int b = 0;int x = 0;235 public double[] S() {236 for (int c = 0; c < n.length; c++) {237 if (n[x] > 0) {238 s[x] = Math.PI * n[x] *n[x];239 x++;240 }241 }242 returns;243 }244 public int validate(String number, inti) {245 String[] num = new String[10000];246 num = number.split(" ");247 inta;248 for (a = 0; a < 1; a++) {249 if (Double.parseDouble(num[i]) <= 0) {250 return 0;251 } else{252 n[b] =Double.parseDouble(num[i]);253 i++;b++;254 }255 }256 returni;257 }258 }259 classRectangle {260 double[] n = new double[10000];double[] s = new double[10000];261 int a = 1;int b = 0;int x = 0;int z = 0;262 public double[] S() {263 for (int c = 0; c < n.length; c = c + 2) {264 if (n[x] > 0 && n[a] > 0) {265 s[z] = n[x] *n[a];266 a = a + 2;x = x + 2;z++;267 }268 }269 returns;270 }271 public int validate(String number, inti) {272 String[] num = new String[10000];273 num = number.split(" ");274 intd;275 for (d = 0; d < 2; d++) {276 if (Double.parseDouble(num[i]) <= 0) {277 return 0;278 } else {n[b] = Double.parseDouble(num[i]);i++;b++;}}279 returni;}}280 classTriangle {281 private double side1;private double side2;private doubleside3;282 double[] n = new double[10000];double[] s = new double[10000];283 int a = 1;int b = 0;int d = 2;int v = 0;int g = 1;int h = 2;284 double p = 0;int x = 0;285 public double[] S() {286 for (int c = 0; c < n.length; c = c + 3) {287 if (n[x] > 0 && n[a] > 0 && n[d] > 0) {288 p = (n[x] + n[a] + n[d]) / 2;double ts = p * (p - n[x]) * (p - n[a]) * (p -n[d]);289 s[v] = Math.sqrt(ts);a = a + 3;d = d + 3;x = x + 3;v++;}}290 returns;}291 public int validate(String number, inti) {292 String[] num = new String[10000];num = number.split(" ");inte;293 for (e = 0; e < 3; e++) {294 if (Double.parseDouble(num[i]) <= 0) {295 return 0;296 } else {n[b] = Double.parseDouble(num[i]);i++;b++;}}297 for (int f = 0; f < n.length; f = f + 3) {298 if (n[f] > 0 && n[g] > 0 && n[h] > 0) {299 side1 = n[f];side2 = n[g];side3 =n[h];300 if (((side1 + side2) <= side3) || ((side1 + side3) <= side2) || ((side2 + side3) <=side1)) {301 return 0;}302 g = g + 2;h++;}}303 returni;}}304 classTrapezoid {305 double[] n = new double[10000];double[] s = new double[10000];int x = 0;306 int a = 1;int b = 0;int d = 2;int v = 0;int g = 1;int h = 2;double p = 0;307 public double[] S() {308 for (int c = 0; c < n.length; c = c + 3) {309 if (n[x] > 0 && n[a] > 0 && n[d] > 0) {310 s[v] = (n[x] + n[a]) * n[d] / 2;a = a + 3;d = d + 3;x = x + 3;v++;311 }}returns;}312 public int validate(String number, inti) {313 String[] num = new String[10000];num = number.split(" ");314 inte;315 for (e = 0; e < 3; e++) {316 if (Double.parseDouble(num[i]) <= 0) {317 return 0;318 } else {n[b] = Double.parseDouble(num[i]);i++;b++;}}319 returni;}320 }
View Code
④每次作業花費的時間比例??7 : 4 : 4
⑤對編程過程的嚴謹性的認識及教訓
在題目中的超大型數據計算時我一開始使用的是long類型,但是在超大型數據計算時超過了最大長度之后,得出的數據值會出現很大的偏差;在一元多項式的題目中我們使用substring這個截取字段的方法,這個方法有個特點為“取頭不取尾”需要我們多注意。
三、OO設計心得
①對面向對象三大技術特性之間關系的理解
封裝、繼承、多態。從一定角度來看,封裝和繼承幾乎都是為多態而準備的。這是我們最后一個概念,也是最重要的知識點。封裝:在一個對象內部,數據可以是私有的,不能被外界訪問。通過這種方式,對象對內部數據提供了不同級別的保護,以防止程序中無關的部分意外的改變或錯誤的使用了對象的私有部分。像我們用private把數據被保護在內部,程序的其它部分只有通過被授權的操作getter和setter,才能對數據進行操作。繼承:實現繼承是指直接使用基類的屬性和方法而無需額外編碼的能力,接口繼承是指僅使用屬性和方法的名稱、但是子類必須提供實現的能力。子類繼承父類的方法,減少代碼的重復性,自己也可以在內部構造自己的方法。多態:多態就是指一個類實例的相同方法在不同情形有不同表現形式,但通過一個公共的類,那些操作可以通過相同的方式予以調用。通過指向父類的引用,在不同子類中重寫的方法。(有查閱資料)
②面向對象設計的基本原則理解(單一職責原則及“開-閉”原則)
單一職責:每個類里面都會有很多種方法,但是每一種方法只要做好自己的事情就好,并且方法與方法之間互不干涉,例如判斷圓半徑的合法性跟求圓的面積,都在Circle類里面,但是要寫在Circle類不同的方法里面,
“開-閉”原則:當我們建了一個類之后,我們需要把類里面的屬性都私有化,當外界進行訪問時時無法訪問的,所以我們需要寫get和set方法,來給這些屬性賦值和取它們的值。
③OO編程思維的理解
面向對象和之前學習的C語言以及剛開始接觸的面向過程思想不一樣,我認為是它們的升級版,當我們拿到題目時首先會去考慮有哪些對象,然后考慮對象具有哪些屬性和方法,然后再考慮main方法的調用,考慮是否有輸入輸出值,整體思路很清晰,程序很明朗。當我們拿到一個題目時,我們會去分析有哪些對象,對象有哪些屬性和方法,這些方法的作用是什么,這是在學習了面向對象后的思考模式。通過學習Java和C語言的過程中,Java更加人性化,我們會站在不同的對象的角度去思考問題。
④類設計心得
想先舉個例子,比如今天上體育課,總共有三個學生小明小紅小剛,他們分別有自己喜歡的項目,在這個地方進行設計時會考慮到建一個學生類,然后會想到需要兩個基本屬性姓名和愛好;又比如在控制臺輸入長方體的長寬高,需要輸出該長方體的體積跟表面積,看到這個題目時,我們會自然想到需要建一個長方體類,里面需要三個參數和求表面積體積的兩個方法。通過上面兩個例子我們知道,當需要建一個類時,我們先需要獲取題目中的各項信息,類具有哪些屬性,需要書寫哪些方法,便可以構成一個完整的類。
四、測試的理解與實踐
①測試對于編碼質量的重要性
測試的作用就是用來測試代碼的運行是否流暢和測試代碼的運行速度,減少了運行時間也是提高了代碼的質量,測試的時候可以幫我們找到代碼問題,我們還可以提煉代碼,或許會想到更好的方法去實現題目要求,從而在減少了代碼量的同時提高了代碼的質量,并且可以讓我們知道不同方式實現時得運行時間的對比,所以測試對于編碼質量而言很重要。
②查閱資料,假設使用Junit進行程序的測試是否可行
通過查閱資料,測試可行,了解到這里用到的是junit的4.12的版本:
? ?
以上是加減乘除的驗證,查閱資料還了解到單元測試需要遵循的規則:1、每一個測試方法上使用@Test進行修飾;2、每一個測試方法必須使用public?void進行修飾;3、每一個測試方法不能攜帶參數;4、測試代碼和源代碼在兩個不同的項目路徑下;5、測試類的包應該和被測試類保持一致;6、測試單元中的每個方法必須可以獨立測試。(junit也建議在每一個測試方法名加上test前綴,表明這是一個測試方法)
五、課程收獲
教訓及收獲:很慘痛的教訓是正則表達式學的太差,出現了很多紕漏,水文校驗一道題磕了三天,到最后延時那天搞出來;還出現了很多小問題,審題不夠仔細,漏空格或者字母打錯都導致答案錯誤。學到的東西也很多,最大的收獲便是學到了這三大特性的運用,還有正則表達式的檢驗,它的功能很強大,一個正則表達式模式可以檢驗很多東西。OO設計的基本原則除了之前的單一職責,還了解到“開-閉”原則,學到了get和set的用法。
六、對課程的建議
①第三階段作業難度、題量的建議
作業難度可以在第三階段稍稍提升一點,沒有類圖其實也增加了一點難度,我們需要花的時間會更多一點;作業題量建議和第二階段差不多,兩到三道題就好(畢竟最近各門課的作業和實驗扎堆)。另外對題目的建議:1.希望多一些輸出樣例給我們參照;2.老師可以出一些結合前面所學知識點的題目讓我們梳理前面所學的知識點,而不是斷層的學。3.pta對的運行時間跟有效代碼可否改為最后一個提交的,有時會受到網絡影響造成運行超時,而且大家的想法肯定都在不斷進步,只取第一次的代碼可能會讓人產生題目對了就行了的思想。
②課程內容講解方面的建議
建議:每次的pta作業跟課堂作業希望老師都可以進行簡單的點評跟講解,其實也是在進行討論,很多同學看到會講出自己的想法,大家一起交流;還有一點就是希望老師把一些講了的實例代碼發群里,我們有空可以多敲敲看看看,如果看回放的話稍微有點麻煩。
總結
以上是生活随笔為你收集整理的java第二阶段_Java第二阶段总结的全部內容,希望文章能夠幫你解決所遇到的問題。
                            
                        - 上一篇: java tcp 编程实例_Java实现
 - 下一篇: java打星星_java实现星星图形的输