第十週總結java
1、知識總結編程
1.1一個泛型類Generic class就是具備一個或多個類型變量的類數組
1.2Java中,使用E表示集合的元素類型,K和V表示Map的關鍵字和值的類型。T(須要時還可使用臨近的U和S)表示「任意類型」。安全
1.3泛型類能夠看做普通類的工廠dom
2.1類型變量放在修飾符的後面,返回類型的前面。泛型方法能夠定義在普通類中,也能夠定義在泛型類中。ide
2.2當調用一個方法時,在方法名前的尖括號中放入具體的類型。模塊化
3.1<T extends BoundingType>表示T應該是綁定類型的子類型subtype,T和綁定類型能夠是類,也能夠是接口。一個類型變量或通配符能夠有多個限定(用&)測試
3.2若是用一個類做爲限定,它必須是限定列表中的第一個。this
4.1不管什麼時候定義一個泛型類型,都自動提供了一個相應的原始類型raw type。原始類型的名字就是刪去類型參數後的泛型類型名。擦除erased類型變量,並替換爲限定類型(無限定的變量用Object)spa
4.2爲了提升效率,應該將標籤tagging接口(即沒有方法的接口)放在邊界列表的末尾。
4.3橋方法bridge method
4.4具備協變的返回類型covariant return types
4.5記住有關泛型轉換的事實:1.虛擬機中沒有泛型,只有普通的類和方法;2.全部的類型參數都用它們的限定類型替換;3.橋方法被合成來保持多態;4.爲保持類型安全性,必要時插入強制類型轉換。
5.1不能用基本類型實例化類型參數
5.2運行時類型查詢只適用於原始類型
5.3不能建立參數化類型的數組
5.4Varargs警告:使用@SafeVarargs
5.5不能實例化類型變量
5.6不能構造泛型數組
5.7泛型類的靜態上下文中類型變量無效
5.8不能拋出或捕獲泛型類的實例
5.9能夠消除對受查異常的檢查
5.10注意擦除後的衝突
6.1泛型類不是斜變的
7.1通配符類型中,容許類型參數變化。如Class<? extends SuperClass>表示任何泛型Class類型,它的類型參數是SuperClass的子類,如Class<subClass>
7.2超類型限定supertype bound:? super subClass 這個通配符限制爲subClass的全部超類型。能夠爲方法提供參數,但不能使用返回值。
7.3無限定通配符 :Class<?> 和Class本質的不一樣在於:能夠用任意的Object對象調用原始class的setObject方法
2、實驗:泛型程序設計技術
1、實驗目的與要求
(1) 理解泛型概念;
(2) 掌握泛型類的定義與使用;
(3) 掌握泛型方法的聲明與使用;
(4) 掌握泛型接口的定義與實現;
(5)瞭解泛型程序設計,理解其用途。
2、實驗內容和步驟
實驗1: 導入第8章示例程序,測試程序並進行代碼註釋。
測試程序1:
l 編輯、調試、運行教材3十一、312頁 代碼,結合程序運行結果理解程序;
l 在泛型類定義及使用代碼處添加註釋;
l 掌握泛型類的定義及使用。
代碼:
package pair1; /** * @version 1.00 2004-05-10 * @author Cay Horstmann */ public class Pair<T> //Pair類引入了一個類型變量T,用尖括號括起來 { private T first; private T second; //指方法的返回類型以及域和局部變量的類型 public Pair() { first = null; second = null; } public Pair(T first, T second) { this.first = first; this.second = second; } public T getFirst() { return first; } public T getSecond() { return second; } public void setFirst(T newValue) { first = newValue; } public void setSecond(T newValue) { second = newValue; } }
package pair1; /** * @version 1.01 2012-01-26 * @author Cay Horstmann */ public class PairTest1 { public static void main(String[] args) { String[] words = { "Mary", "had", "a", "little", "lamb" }; //ArrayAlg調用靜態方法minmax(); Pair<String> mm = ArrayAlg.minmax(words); System.out.println("min = " + mm.getFirst()); System.out.println("max = " + mm.getSecond()); } } class ArrayAlg { /** * Gets the minimum and maximum of an array of strings. * @param a an array of strings * @return a pair with the min and max value, or null if a is null or empty */ public static Pair<String> minmax(String[] a)//定義靜態泛型方法,將類型變量實例化爲String; { if (a == null || a.length == 0) return null;//a.length是數組的屬性值; String min = a[0]; String max = a[0]; for (int i = 1; i < a.length; i++) { if (min.compareTo(a[i]) > 0) min = a[i]; if (max.compareTo(a[i]) < 0) max = a[i]; } return new Pair<>(min, max);//調用泛型類對象,返回一個實例化後的類對象; } }
結果:
測試程序2:
l 編輯、調試運行教材315頁 PairTest2,結合程序運行結果理解程序;
l 在泛型程序設計代碼處添加相關注釋;
l 掌握泛型方法、泛型變量限定的定義及用途。
代碼:
package pair2; /** * @version 1.00 2004-05-10 * @author Cay Horstmann */ public class Pair<T> { private T first; private T second; public Pair() { first = null; second = null; } public Pair(T first, T second) { this.first = first; this.second = second; } public T getFirst() { return first; } public T getSecond() { return second; } public void setFirst(T newValue) { first = newValue; } public void setSecond(T newValue) { second = newValue; } }
package pair2; //import PairTest1.Pair; import java.time.*; /** * @version 1.02 2015-06-21 * @author Cay Horstmann */ public class PairTest2 { public static void main(String[] args) { LocalDate[] birthdays = { //按ASCII碼比較,大寫字母比小寫字母的ASCII碼小; LocalDate.of(1906, 12, 9), // G. Hopper LocalDate.of(1815, 12, 10), // A. Lovelace LocalDate.of(1903, 12, 3), // J. von Neumann LocalDate.of(1910, 6, 22), // K. Zuse }; //ArrayAlg調用靜態方法minmax(); Pair<LocalDate> mm = ArrayAlg.minmax(birthdays); System.out.println("min = " + mm.getFirst()); System.out.println("max = " + mm.getSecond()); } } class ArrayAlg { /** Gets the minimum and maximum of an array of objects of type T. @param a an array of objects of type T @return a pair with the min and max value, or null if a is null or empty */ public static <T extends Comparable> Pair<T> minmax(T[] a) //泛型變量加了泛型約束的方法; { if (a == null || a.length == 0) return null; T min = a[0]; T max = a[0]; for (int i = 1; i < a.length; i++) { if (min.compareTo(a[i]) > 0) min = a[i]; if (max.compareTo(a[i]) < 0) max = a[i]; } return new Pair<>(min, max);//返回一個實例化泛型Pair類對象; } }
結果:
測試程序3:
l 用調試運行教材335頁 PairTest3,結合程序運行結果理解程序;
l 瞭解通配符類型的定義及用途。
代碼:
package pair3; /** * @version 1.00 2004-05-10 * @author Cay Horstmann */ public class Pair<T> { private T first; private T second; public Pair() { first = null; second = null; } public Pair(T first, T second) { this.first = first; this.second = second; } public T getFirst() { return first; } public T getSecond() { return second; } public void setFirst(T newValue) { first = newValue; } public void setSecond(T newValue) { second = newValue; } }
package pair3; /** * @version 1.01 2012-01-26 * @author Cay Horstmann */ public class PairTest3 { public static void main(String[] args) { Manager ceo = new Manager("Gus Greedy", 800000, 2003, 12, 15); Manager cfo = new Manager("Sid Sneaky", 600000, 2003, 12, 15); Pair<Manager> buddies = new Pair<>(ceo, cfo); printBuddies(buddies); ceo.setBonus(1000000); cfo.setBonus(500000); Manager[] managers = { ceo, cfo }; Pair<Employee> result = new Pair<>(); minmaxBonus(managers, result); System.out.println("first: " + result.getFirst().getName() + ", second: " + result.getSecond().getName()); maxminBonus(managers, result); System.out.println("first: " + result.getFirst().getName() + ", second: " + result.getSecond().getName()); } public static void printBuddies(Pair<? extends Employee> p) //<? extends type>表示帶有上界 { Employee first = p.getFirst(); Employee second = p.getSecond(); System.out.println(first.getName() + " and " + second.getName() + " are buddies."); } //"?"在這兒是通配符,符號代表參數的類型能夠是任何一種類型,它和參數T的含義是有區別的 public static void minmaxBonus(Manager[] a, Pair<? super Manager> result)//<? super type>表示帶有下界 { if (a.length == 0) return; Manager min = a[0]; Manager max = a[0]; for (int i = 1; i < a.length; i++) { if (min.getBonus() > a[i].getBonus()) min = a[i]; if (max.getBonus() < a[i].getBonus()) max = a[i]; } result.setFirst(min); result.setSecond(max); } //T表示一種未知類型,而「?」表示任何一種類型 public static void maxminBonus(Manager[] a, Pair<? super Manager> result) { minmaxBonus(a, result); PairAlg.swapHelper(result); // swapHelper捕獲通配符類型 } } class PairAlg { public static boolean hasNulls(Pair<?> p) { return p.getFirst() == null || p.getSecond() == null; } public static void swap(Pair<?> p) { swapHelper(p); } public static <T> void swapHelper(Pair<T> p) { T t = p.getFirst(); p.setFirst(p.getSecond()); p.setSecond(t); } }
package pair3; import java.time.*; public class Employee { private String name; private double salary; private LocalDate hireDay; public Employee(String name, double salary, int year, int month, int day) { this.name = name; this.salary = salary; hireDay = LocalDate.of(year, month, day); } public String getName() { return name; } public double getSalary() { return salary; } public LocalDate getHireDay() { return hireDay; } public void raiseSalary(double byPercent) { double raise = salary * byPercent / 100; salary += raise; } }
package pair3; public class Manager extends Employee { private double bonus; /** @param name the employee's name @param salary the salary @param year the hire year @param month the hire month @param day the hire day */ public Manager(String name, double salary, int year, int month, int day) { super(name, salary, year, month, day); bonus = 0; } public double getSalary() { double baseSalary = super.getSalary(); return baseSalary + bonus; } public void setBonus(double b) { bonus = b; } public double getBonus() { return bonus; } }
結果:
實驗2:編程練習:
編程練習1:實驗九編程題總結
l 實驗九編程練習1總結(從程序整體結構說明、模塊說明,目前程序設計存在的困難與問題三個方面闡述)。
程序整體結構:主類Main和子類test
模塊說明:主類當中進行文件的讀取以及操做,test類實現了comparable接口,控制其輸出形式
困難與問題:對捕獲知識掌握的很差
l 實驗九編程練習2總結(從程序整體結構說明、模塊說明,目前程序設計存在的困難與問題三個方面闡述)。
程序整體結構:主類和yunsuan類
模塊說明:主類調用以及實現yunsuan類的功能,yunsuan類主要模塊化實現各類操做
困難與問題:在yunsuan類的編寫中,不少操做不知怎樣具體化;對於switch語句掌握很差
編程練習2:採用泛型程序設計技術改進實驗九編程練習2,使之可處理實數四則運算,其餘要求不變。
代碼:
package fghjg; import java.util.Random; import java.util.Scanner; import java.io.FileNotFoundException; import java.io.PrintWriter; public class Main{ public static void main(String[] args) { yunsuan counter=new yunsuan();//與其它類創建聯繫 PrintWriter out=null; try { out=new PrintWriter("D:/text.txt");//將文件裏的內容讀入到D盤名叫text的文件中 }catch(FileNotFoundException e) { System.out.println("文件找不到"); e.printStackTrace(); } int sum=0; for(int i=0;i<10;i++) { int a=new Random().nextInt(100); int b=new Random().nextInt(100); Scanner in=new Scanner(System.in); //in.close(); switch((int)(Math.random()*4)) { case 0: System.out.println( ""+a+"+"+b+"="); int c1 = in.nextInt(); out.println(a+"+"+b+"="+c1); if (c1 == counter.plus(a, b)) { sum += 10; System.out.println("答案正確"); } else { System.out.println("答案錯誤"); } break ; case 1: if(a<b) { int temp=a; a=b; b=temp; }//爲避免減數比被減數大的狀況 System.out.println(""+a+"-"+b+"="); /*while((a-b)<0) { b = (int) Math.round(Math.random() * 100); }*/ int c2 = in.nextInt(); out.println(a+"-"+b+"="+c2); if (c2 == counter.minus(a, b)) { sum += 10; System.out.println("答案正確"); } else { System.out.println("答案錯誤"); } break ; case 2: System.out.println(""+a+"*"+b+"="); int c = in.nextInt(); out.println(a+"*"+b+"="+c); if (c == counter.multiply(a, b)) { sum += 10; System.out.println("答案正確"); } else { System.out.println("答案錯誤"); } break; case 3: while(b==0) { b = (int) Math.round(Math.random() * 100);//知足分母不爲0 } while(a%b!=0) { a = (int) Math.round(Math.random() * 100); b = (int) Math.round(Math.random() * 100); } System.out.println(""+a+"/"+b+"="); int c0= in.nextInt(); out.println(a+"/"+b+"="+c0); if (c0 == counter.divide(a, b)) { sum += 10; System.out.println("答案正確"); } else { System.out.println("答案錯誤"); } break; } } System.out.println("totlescore:"+sum); out.println(sum); out.close(); } }
package fghjg; public class yunsuan <T>{ private T a; private T b; public void yunsaun() { a=null; b=null; } public void yunsuan(T a,T b) { this.a=a; this.b=b; } public int plus(int a,int b) { return a+b; } public int minus(int a,int b) { return a-b; } public int multiply(int a,int b) { return a*b; } public int divide(int a,int b) { if(b!=0 && a%b==0) return a/b; else return 0; } }
結果:
3、實驗總結
本次實驗主要是在上週實驗的基礎上更加深入的去理解泛型概念;掌握泛型類的定義與使用以及泛型方法的聲明與使用;瞭解泛型接口的定義與實現。