劉志梅 201771010115 《面向物件程式設計(java)》 第八週學習總結
實驗六 介面的定義與使用
實驗時間 2018-10-18
1、實驗目的與要求
(1) 介面定義:介面不是類,而是對類的一組需求描述,這些類要遵從介面描述的統一格式進行定義;由常量和一組抽象方法組成;介面中的是所有方法自動地屬於public。
任何實現Comparable介面的類都需要包含compareTo方法,並且這個方法的引數必須是一個Object物件,返回一個整型數值。
為了讓類實現一個介面,兩個步驟:1、將類宣告為實現給定的介面
2、對介面中的所有方法進行定義
要讓一個類使用排序服務必須讓它實現compareTo方法。
(2)介面的特性:介面不是類,尤其不能使用new運算子例項化一個介面;介面變數必須引用實現了介面的類物件;使用instance檢查一個物件是否實現了某個特定的介面;介面也可以被擴充套件;雖然在介面中不能包含例項域或靜態方法,但卻可以包含常量;儘管每個類只能夠擁有一個超類,但卻可以實現多個介面。
(3)回撥:回撥是一種常見的程式設計模式,在這種模式中,可以指出某個特定事件時應該採取的動作。
在java.swing包中有一個Timer類,可以使用它在到達給定的時間間隔時發出通告
(4) Comparator介面:對於每一個類,需要確定:1、預設的clone方法是否滿足要求2、是否可以在可變的子物件上呼叫clone來修補預設的clone方法3、是否不該使用clone。
(5) Lambdajava中的一種lambda的表達形式:引數,箭頭(->)以及一個表示式;無需指定lambda表示式的返回型別,lambda表示式的返回型別總是會由上下文推匯出。
(6) 預設的克隆操作是
淺拷貝的影響:如果原物件和淺克隆物件共享的子物件不是可變的,那麼這種共享就是安全的;或者在物件的生命期中,子物件一直包含不變的常量,沒有更改器方法會改變它,也沒有方法會生成它的引用,這種情況下同樣是安全的。
不過,通常子物件都是可變的,必須重新定義clone方法來建立一個深拷貝,同時克隆所有子物件。
(7) 內部類:內部類是定義在另一個類中的類。
使用內部類的原因如下:
內部類既可以訪問自身的資料域,也可以訪問建立它的外圍類物件的資料域(外圍類的引用在構造器中設定),編譯器修改了所有的內部類的構造器,新增一個外圍類引用的引數。
(注意,在外圍類的作用域之外,可以這樣引用內部類:OuterClass.InnerClass)
內部類中宣告的所有靜態域都必須是final(如果這個域不是final,它可能就不是唯一的);內部類不能有static方法。
2、實驗內容和步驟
實驗1: 匯入第6章示例程式,測試程式並進行程式碼註釋。
測試程式1:
l 編輯、編譯、除錯執行閱讀教材214頁-215頁程式6-1、6-2,理解程式並分析程式執行結果;
l 在程式中相關程式碼處新增新知識的註釋。
l 掌握介面的實現用法;
l 掌握內建介面Compareable的用法。
測試程式2:
l 編輯、編譯、除錯以下程式,結合程式執行結果理解程式;
interface A { double g=9.8; void show( ); } class C implements A { public void show( ) {System.out.println("g="+g);} }
class InterfaceTest { public static void main(String[ ] args) { A a=new C( ); a.show( ); System.out.println("g="+C.g); } } |
實驗結果:
測試程式3:
l 在elipse IDE中除錯執行教材223頁6-3,結合程式執行結果理解程式;
l 26行、36行程式碼參閱224頁,詳細內容涉及教材12章。
l 在程式中相關程式碼處新增新知識的註釋。
l 掌握回撥程式設計模式;
實驗結果;
測試程式4:
l 除錯執行教材229頁-231頁程式6-4、6-5,結合程式執行結果理解程式;
l 在程式中相關程式碼處新增新知識的註釋。
l 掌握物件克隆實現技術;
l 掌握淺拷貝和深拷貝的差別。
實驗2: 匯入第6章示例程式6-6,學習Lambda表示式用法。
l 除錯執行教材233頁-234頁程式6-6,結合程式執行結果理解程式;
l 在程式中相關程式碼處新增新知識的註釋。
l 將27-29行程式碼與教材223頁程式對比,將27-29行程式碼與此程式對比,體會Lambda表示式的優點。
實驗截圖:
注:以下實驗課後完成
實驗3: 程式設計練習
l 編制一個程式,將身份證號.txt 中的資訊讀入到記憶體中;
l 按姓名字典序輸出人員資訊;
l 查詢最大年齡的人員資訊;
l 查詢最小年齡人員資訊;
l 輸入你的年齡,查詢身份證號.txt中年齡與你最近人的姓名、身份證號、年齡、性別和出生地;
l 查詢人員中是否有你的同鄉。
package Test; public class Student implements Comparable<Student> { private String name; private String number ; private String sex ; private int age; private String province; public String getName() { return name; } public void setName(String name) { this.name = name; } public String getnumber() { return number; } public void setnumber(String number) { this.number = number; } public String getsex() { return sex ; } public void setsex(String sex ) { this.sex =sex ; } public int getage() { return age; } public void setage(int age) { // int a = Integer.parseInt(age); this.age= age; } public String getprovince() { return province; } public void setprovince(String province) { this.province=province ; } public int compareTo(Student o) { return this.name.compareTo(o.getName()); } public String toString() { return name+"\t"+sex+"\t"+age+"\t"+number+"\t"+province+"\n"; } }
import java.io.BufferedReader; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.IOException; import java.io.InputStreamReader; import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; import java.util.Scanner; public class Search{ private static ArrayList<Person> Personlist1; public static void main(String[] args) { Personlist1 = new ArrayList<>(); Scanner scanner = new Scanner(System.in); File file = new File("E:\\面向物件程式設計Java\\實驗\\實驗六\\身份證號.txt"); try { FileInputStream F = new FileInputStream(file); BufferedReader in = new BufferedReader(new InputStreamReader(F)); String temp = null; while ((temp = in.readLine()) != null) { Scanner linescanner = new Scanner(temp); linescanner.useDelimiter(" "); String name = linescanner.next(); String id = linescanner.next(); String sex = linescanner.next(); String age = linescanner.next(); String place =linescanner.nextLine(); Person Person = new Person(); Person.setname(name); Person.setid(id); Person.setsex(sex); int a = Integer.parseInt(age); Person.setage(a); Person.setbirthplace(place); Personlist1.add(Person); } } catch (FileNotFoundException e) { System.out.println("查詢不到資訊"); e.printStackTrace(); } catch (IOException e) { System.out.println("資訊讀取有誤"); e.printStackTrace(); } boolean isTrue = true; while (isTrue) { System.out.println("******************************************"); System.out.println("1:按姓名字典順序輸出資訊;"); System.out.println("2:查詢最大年齡與最小年齡人員資訊;"); System.out.println("3:按省份找你的同鄉;"); System.out.println("4:輸入你的年齡,查詢年齡與你最近人的資訊;"); System.out.println("5:退出"); System.out.println("******************************************"); int type = scanner.nextInt(); switch (type) { case 1: Collections.sort(Personlist1); System.out.println(Personlist1.toString()); break; case 2: int max=0,min=100;int j,k1 = 0,k2=0; for(int i=1;i<Personlist1.size();i++) { j=Personlist1.get(i).getage(); if(j>max) { max=j; k1=i; } if(j<min) { min=j; k2=i; } } System.out.println("年齡最大:"+Personlist1.get(k1)); System.out.println("年齡最小:"+Personlist1.get(k2)); break; case 3: System.out.println("place?"); String find = scanner.next(); String place=find.substring(0,3); String place2=find.substring(0,3); for (int i = 0; i <Personlist1.size(); i++) { if(Personlist1.get(i).getbirthplace().substring(1,4).equals(place)) { System.out.println("你的同鄉:"+Personlist1.get(i)); } } break; case 4: System.out.println("年齡:"); int yourage = scanner.nextInt(); int close=ageclose(yourage); int d_value=yourage-Personlist1.get(close).getage(); System.out.println(""+Personlist1.get(close)); break; case 5: isTrue = false; System.out.println("再見!"); break; default: System.out.println("輸入有誤"); } } } public static int ageclose(int age) { int m=0; int max=53; int d_value=0; int k=0; for (int i = 0; i < Personlist1.size(); i++) { d_value=Personlist1.get(i).getage()-age; if(d_value<0) d_value=-d_value; if (d_value<max) { max=d_value; k=i; } } return k; } } //jiekouwenjiaan public class Person implements Comparable<Person> { private String name; private String id; private int age; private String sex; private String birthplace; public String getname() { return name; } public void setname(String name) { this.name = name; } public String getid() { return id; } public void setid(String id) { this.id= id; } public int getage() { return age; } public void setage(int age) { // int a = Integer.parseInt(age); this.age= age; } public String getsex() { return sex; } public void setsex(String sex) { this.sex= sex; } public String getbirthplace() { return birthplace; } public void setbirthplace(String birthplace) { this.birthplace= birthplace; } public int compareTo(Person o) { return this.name.compareTo(o.getname()); } public String toString() { return name+"\t"+sex+"\t"+age+"\t"+id+"\t"; }
實驗4:內部類語法驗證實驗
實驗程式1:
l 編輯、除錯執行教材246頁-247頁程式6-7,結合程式執行結果理解程式;
l 瞭解內部類的基本用法。
實驗程式2:
l 編輯、除錯執行教材254頁程式6-8,結合程式執行結果理解程式;
l 瞭解匿名內部類的用法。
實驗截圖:
實驗程式3:
l 在elipse IDE中除錯執行教材257頁-258頁程式6-9,結合程式執行結果理解程式;
l 瞭解靜態內部類的用法。
實驗截圖:
實驗總結:通過本週實驗學習了介面,lambda表示式與內部類,學習了其定義瞭解了其用法,但是在真正寫程式的應用中並不能很好的掌握和應用,對淺拷貝和深拷貝不明白,寫程式時還有困難,然後自己會 好好看程式碼、多多練習編碼的編寫;這次的實驗編寫程式碼的確實有困難。