OO題目集4~6總結
前言:
第四次作業:
本次作業首次運用繼承方法和正則表示式,正則表示式第一次接觸就是在水文資料校驗及管理,對於我來說有一點難度。以下為關於正則表示式和繼承的一些知識點總結。
1)正則表示式:
正則表示式是由一些具有特殊含義的字元組成的字串,多用於查詢、替換符合規則的字串。
關於使用正則表示式解決問題,可能需要使用到很多字母或特殊符號才能表示,查詢符合題目要求的字元含義可能需要一定的時間,但是正則表示式在減少程式碼量以及改變程式碼的複雜度上起到了很大的作用。
具體問題遇到正則表示式的方法需要自行查閱。
2)繼承:
繼承是面向物件兩大特徵之一,繼承是使用已存在的類的定義作為基礎建立新類的技術,新類的定義可以增加新的資料或新的功能,也可以用父類的功能,但不能選擇性地繼承父類。比如:圓是圖形,圓擁有繼承者的特性,同時也有自己的特性。通過使用繼承我們能夠更加方便地複用以前的程式碼,大大的提高開發的效率。
a.繼承首先要滿足“A是B”的條件,則A可以繼承B,B為父類,A為子類。
b.除了那些private的外還有構造器是子類繼承不了的。對於構造器而言,它只能夠被呼叫,而不能被繼承。 呼叫父類的構造方法使用super()。
c.對於protected而言,對於它指明的類使用者相當於private,但是對於任何繼承與此類的子類或者其他任何位於同一個包的類而言他可以訪問。
第五次作業:
這次作業依舊寫了關於面向物件日期問題,對於我而言,統計Java中關鍵字出現的次數難度最大,需要自己查詢Java的53個關鍵字並且通過List/Set/Map其中一種或者多種介面來實現。
1)在Java中有兩種形式可以實現多型:繼承和介面。繼承都是單繼承,只能為一組相關的類提供一致的服務介面。但是介面可以是多繼承多實現,它對於繼承來說有更好的靈活性。
Map 初始化:Map<String, String> map = new HashMap<String, String>();
插入元素:map.put("key1", "value1");
獲取元素:map.get("key1")
移除元素:map.remove("key1");
清空map:map.clear();
2)Java關鍵字是電腦語言裡事先定義的,有特別意義的識別符號、變數。他們用來表示一種資料型別或者表示程式的結構等,關鍵字不能用作變數名、方法名、類名、包名和引數。
第六次作業:
在水文資料校驗及管理作業中是第一次接觸到正則表示式,這道題本身也有一定的難度,可能沒有很好的解決題目中所有的測試點,在第六次作業中,老師準備了四道有關運用正則表示式比較簡單的題目,讓我更好的運用正則表示式。本次作業依舊是練習正則表示式以及關於
作業過程:
題目集4
7-2 日期問題面向物件設計(聚合一)
設計與分析:
本次題目是想利用封裝和繼承,對題目的類圖進行編寫,實現求下n天、求前n天、求兩個日期相差的天數,其中對於月份之內的日期求相差的天數,可以使用Period方法System.out.println(LocalDate.now().toEpochDay() - LocalDate.now().minusDays(5).toEpochDay());
踩坑心得:
題目要求是讓設計四個類DateUtil、Year、Month、Day,但是隻設計了一個DateUtil類,將year,month,day都設計成了private,沒有滿足題目要求。在求下n天的時候,輸入的最後日期不正確,最終測試點也沒有通過,沒有滿分
1 class DateUtil { 2 private int year; 3 private int month; 4 private int day; 5 6 public int getYear() { 7 return year; 8 } 9 10 public void setYear(int year) { 11 this.year = year; 12 } 13 14 public int getMonth() { 15 return month; 16 } 17 18 public void setMonth(int month) { 19 this.month = month; 20 } 21 22 public int getDay() { 23 return day; 24 } 25 26 public void setDay(int day) { 27 this.day = day; 28 } 29 30 DateUtil(int year, int month, int day) { 31 super(); 32 this.year = year; 33 this.month = month; 34 this.day = day; 35 } 36 37 DateUtil() { 38 39 }
改進建議:
這次關於求下N天的日期,修改了很久也沒有通過測試點,輸入1 1999 3 28 6543時,測試結果顯示2017-2-25,但正確的應該為2017-2-24,希望找到漏洞,將程式最終修改正確。
題目集5
7-5日期問題面向物件設計(聚合二)
設計與分析:
這道題偷了個懶,用了題目集4關於日期問題面向物件設計(聚合一)的思路,沒有使用新的思路。
踩坑心得:
這道題通過測試在求下N天依舊是輸入1 1999 3 28 6543時,測試結果顯示2017-2-25,但正確的應該為2017-2-24,但這道題測試點通過,通過debug還是沒有找到問題所在。
1 if (isLeapYear(date.year)) {// 閏年 2 if (leapYear[date.month - 1] == date.day) {// 月底 3 date.month++; 4 date.day = 1; 5 if (date.month == 13) {// 年底 6 date.year++; 7 date.month = 1; 8 date.day = 1; 9 } 10 } else 11 date.day++; 12 } else { 13 if (noLeapYear[date.month - 1] == date.day) {// 月底 14 date.month++; 15 date.day = 1; 16 if (date.month == 13) {// 年底 17 date.year++; 18 date.month = 1; 19 date.day = 1; 20 } 21 } else 22 date.day++; 23 } 24 return date;
改進建議:
關於日期類問題,求上N天或者下N天,N值較小時資料是準確的,當N過大時候,就出現了上述的情況。
7-4統計Java程式中關鍵詞的出現次數
踩坑心得:
一開始這道題讀題不夠認真,理解錯了題目的意思,以為是找出關鍵字的個數,直接輸出一個數字即可,後面看到給出的輸出樣例發現並不是這樣。除此之外,這道題需要注意的是,如果是註釋裡出現的關鍵字不需要統計關鍵字的數量。
程式設計的嚴謹性依舊是不容忽視的一個問題,Java的53個關鍵字由於不夠嚴謹,導致傳入HashMap時多加了空白符導致出現bug,多次測試才找到最終問題所在。
1 //寫入程式碼 2 while(!(str = input.nextLine()).equals("exit")) { 3 list.add(str); 4 } 5 if(list.size() == 0) 6 System.out.println("Wrong Format"); 7 //去掉註釋 8 ArrayList<String> newList = DealCode.filterNotes(list); 9 10 //判斷 11 for(int n = 0; n < newList.size(); n ++) { 12 String[] array = DealCode.spiltString(newList.get(n)); 13 14 for(int m = 0; m < array.length; m ++) { 15 DealCode.judge(map,array[m]); 16 } 17 }
判斷關鍵字:
//判斷是否是關鍵字 public static void judge(Map<String, Integer> map , String str) { if (map.get(str) != null) { int num = map.get(str); int m = num + 1; map.put(str, m); } }
改進建議:
這道題HashMap、Map、Set等介面都是首次接觸,還不夠理解和熟練,這道題也是通過別人講解才能略懂一二,希望此類比較新穎的題目老師在今後可以講解。
題目集4
7-3 圖形繼承
設計與分析:
對於類Circle、Rectangle繼承類Shape,類Ball又繼承類Circle,類Box繼承類Rectangle,每個類的屬性均為private,用到getter和setter方法。
對於四種合法輸入:圓半徑、矩形寬長、球半徑、立方體寬長高,用switch解決。
踩坑心得:
注意輸出為float型別
String str = String.format("Circle's area:%.2f", circle.getArea());
String str1 = String.format("Rectangle's area:%.2f", rectangle.getArea());
String str2 = String.format("Ball's surface area:%.2f", ball.getArea());
String str3 = String.format("Ball's volume:%.2f", ball.getVolume());
String str4 = String.format("Box's surface area:%.2f", box.getArea());
String str5 = String.format("Box's volume:%.2f", box.getVolume());
題目集6
7-5圖形繼承與多型
設計與分析:
多型簡單的理解就是物件在不同情況下的不同表現,多型可以用“三個定義和兩個方法”來總結。三個定義分別是父類定義子類構建、介面定義實現類構建和抽象類定義實體類構建,而兩個方法分別是方法過載和方法重寫。本次作業採用的是抽象類定義、實體類構建的方式。即 Shape 為抽象類,Circle、Rectangle 及 Triangle 為實體類。
class Triangle extends Shape
class Rectangle extends Shape
class Circle extends Shape
abstract class Shape implements Comparable<Shape>
關於泛型:
a.泛型作用: 限制加入集合中元素的型別,將型別限制為同一種類型。泛型在編譯期間生效,不允許加入其他型別。
b.定義泛型類的語法格式:
類訪問修飾符 class 泛型類名 <型別引數> {
類體
}
c.泛型介面的定義格式:
interface 介面名<型別引數列表>
{
...
}
d.在實現介面時,也應當宣告與介面相同的型別引數:
class 類名<型別引數列表> implements 介面名<型別引數列表>
{
...
}
7-6實現圖形介面及多型性
封裝繼承多型我認為是逐步遞進的一個過程,多型的前提就是封裝繼承,有了這樣的前提,我們可以進行方法的過載和重寫 ,使得程式碼更加靈活簡潔,可讀性更強。
一個介面可以有多個直接父介面,但介面只能繼承介面,不能繼承類。
總結:
這三次作業主要是對於面向物件的三大特性:封裝、繼承、多型的題目練習,關於介面的題目練習,關於正則表示式的題目練習。
面向物件程式設計的三大技術特性:封裝,繼承,多型。在作業過程中逐步加深了對這三個特性的理解,每一個類的設計都要求屬性私有,同時設定私有屬性的getter,setter,每一次題目中都能體會到封裝性;影象繼承的一系列題目中,父類子類由大到小,體會到了設計的繼承性;在抽象類介面類中,子類重寫父類的方法,更加靈活,體會到了多型性的實際運用。
介面可以理解為一種特殊的類,裡面全部是由全域性常量和公共的抽象方法所組成。因為Java不支援多繼承,所以Java可以通過實現介面來彌補這個侷限。 為了宣告一個介面,我們使用interface這個關鍵字, 為了實現這個介面,我們使用implements關鍵詞去實現介面。
關於使用正則表示式解決問題,可能需要使用到很多字母或特殊符號才能表示,查詢符合題目要求的字元含義可能需要一定的時間,但是正則表示式在減少程式碼量以及改變程式碼的複雜度上起到了很大的作用。
這一週期的作業含金量很大,學到了很多面向物件的專業知識,但一部分首次接觸難於理解,部分型別的題目對於我而言還是有一定的難度,希望在今後的學習中可以鞏固之前所學的知識並且深入對面向物件程式設計的瞭解,做到溫故而知新。