201874040116-李鑫《面向对象程序设计(java)》第十一周学习总结
项目 |
内容 |
这个作业属于哪个课程 |
https://www.cnblogs.com/nwnu-daizh/ |
这个作业的要求在哪里 |
https://www.cnblogs.com/nwnu-daizh/p/11815810.html |
作业学习目标 |
|
第一部分:总结第八章关于泛型程序设计理论知识:
1.Java 泛型
1)Java 泛型(generics)是 JDK 5 中引入的一个新特性, 泛型提供了编译时类型安全检测机制,该机制允许程序员在编译时检测到非法的类型。
2)泛型的本质是参数化类型,也就是说所操作的数据类型被指定为一个参数。
3)泛型程序设计(Generic programming) 意味着编写的代码可以被很多不同类型的对象所重用。就像 ArrayList 类一样。
2.泛型类
1)泛型类就是具有一个或多个类型变量的类。
2)定义泛型类的关键在于保证类的通用性和低限制。
3.泛型方法
1)泛型方法不一定要定义在泛型类中。
2)可以通过限定类型的继承与接口的实现关系来确保接受的数据类型是合法的。
4.约束与局限性
1)不能使用基本类型实例化类型参数。
2)运行时类型查询只适用于原始类型。
3)不能创建参数化类型的数组。
4)不能构造泛型数组。
5)泛型类的静态上下文中类型变量无效。
6)不能抛出或捕获泛型类的实例。
7)可以消除对受查异常的检查。
8)当泛型类型被擦除时,无法创建引发冲突的条件。
5.通配符类型
1)使用?代替具体的类型参数来表示可接受的类型。
2)子类型限定: Pair<? extends Employee>
3)超类限定:Pair<? super Manager>
4)实现接口限定:<T extends Comparable>
第二部分:实验部分
实验1:测试程序1
1 public class PairTest1 2 { 3 public static void main(String[] args) 4 { 5 String[] words = { "Mary", "had", "a", "little", "lamb" }; 6 Pair<String> mm = ArrayAlg.minmax(words); //构建一个属性的数据类型为 String 的泛型类 7 System.out.println("min = " + mm.getFirst()); 8 System.out.println("max = " + mm.getSecond()); 9 } 10 } 11 12 class ArrayAlg 13 { 14 15 public static Pair<String> minmax(String[] a) //返回类型为 属性的数据类型为 String 的泛型类 16 { 17 if (a == null || a.length == 0) return null; 18 String min = a[0]; 19 String max = a[0]; 20 for (int i = 1; i < a.length; i++) 21 { 22 if (min.compareTo(a[i]) > 0) min = a[i]; 23 if (max.compareTo(a[i]) < 0) max = a[i]; 24 } 25 return new Pair<>(min, max); 26 } 27 } 28 public class Pair<T> //属性只有一种数据类型的泛型类 29 { 30 private T first; 31 private T second; 32 33 public Pair() { first = null; second = null; } 34 public Pair(T first, T second) { this.first = first; this.second = second; } 35 36 public T getFirst() { return first; } 37 public T getSecond() { return second; } 38 39 public void setFirst(T newValue) { first = newValue; } 40 public void setSecond(T newValue) { second = newValue; } 41 }
测试程序2
1 import java.time.*; 2 3 public class PairTest2 4 { 5 public static void main(String[] args) 6 { 7 LocalDate[] birthdays = 8 { 9 LocalDate.of(1906, 12, 9), // G. Hopper 10 LocalDate.of(1815, 12, 10), // A. Lovelace 11 LocalDate.of(1903, 12, 3), // J. von Neumann 12 LocalDate.of(1910, 6, 22), // K. Zuse 13 }; 14 Pair<LocalDate> mm = ArrayAlg.minmax(birthdays); //实例化LocalDate类型的变量 mm 15 System.out.println("min = " + mm.getFirst()); 16 System.out.println("max = " + mm.getSecond()); 17 } 18 } 19 20 class ArrayAlg 21 { 22 /** 23 Gets the minimum and maximum of an array of objects of type T. 24 @param a an array of objects of type T 25 @return a pair with the min and max values, or null if a is null or empty 26 */ 27 public static <T extends Comparable> Pair<T> minmax(T[] a) //返回类型限定为实现了Comparable接口的类型 的泛型方法 28 { 29 if (a == null || a.length == 0) return null; 30 T min = a[0]; 31 T max = a[0]; 32 for (int i = 1; i < a.length; i++) 33 { 34 if (min.compareTo(a[i]) > 0) min = a[i]; 35 if (max.compareTo(a[i]) < 0) max = a[i]; 36 } 37 return new Pair<>(min, max); 38 } 39 } 40 public class Pair<T> //泛型类Pair 41 { 42 private T first; 43 private T second; 44 45 public Pair() { first = null; second = null; } 46 public Pair(T first, T second) { this.first = first; this.second = second; } 47 48 public T getFirst() { return first; } 49 public T getSecond() { return second; } 50 51 public void setFirst(T newValue) { first = newValue; } 52 public void setSecond(T newValue) { second = newValue; } 53 }
测试程序3
1 public class PairTest3 2 { 3 public static void main(String[] args) 4 { 5 var ceo = new Manager("Gus Greedy", 800000, 2003, 12, 15); 6 var cfo = new Manager("Sid Sneaky", 600000, 2003, 12, 15); 7 var buddies = new Pair<Manager>(ceo, cfo); 8 printBuddies(buddies); 9 10 ceo.setBonus(1000000); 11 cfo.setBonus(500000); 12 Manager[] managers = { ceo, cfo }; 13 14 var result = new Pair<Employee>(); 15 minmaxBonus(managers, result); 16 System.out.println("first: " + result.getFirst().getName() 17 + ", second: " + result.getSecond().getName()); 18 maxminBonus(managers, result); 19 System.out.println("first: " + result.getFirst().getName() 20 + ", second: " + result.getSecond().getName()); 21 } 22 23 public static void printBuddies(Pair<? extends Employee> p) //限定参数类型为Employee的子类的泛型方法 24 { 25 Employee first = p.getFirst(); 26 Employee second = p.getSecond(); 27 System.out.println(first.getName() + " and " + second.getName() + " are buddies."); 28 } 29 30 public static void minmaxBonus(Manager[] a, Pair<? super Manager> result) //限定参数类型为 Manager 的超类的泛型方法 31 { 32 if (a.length == 0) return; 33 Manager min = a[0]; 34 Manager max = a[0]; 35 for (int i = 1; i < a.length; i++) 36 { 37 if (min.getBonus() > a[i].getBonus()) min = a[i]; 38 if (max.getBonus() < a[i].getBonus()) max = a[i]; 39 } 40 result.setFirst(min); 41 result.setSecond(max); 42 } 43 44 public static void maxminBonus(Manager[] a, Pair<? super Manager> result) //限定参数类型为 Manager 的超类的泛型方法 45 { 46 minmaxBonus(a, result); 47 PairAlg.swapHelper(result); // OK--swapHelper captures wildcard type 48 } 49 // can't write public static <T super manager> . . . 50 } 51 52 class PairAlg 53 { 54 public static boolean hasNulls(Pair<?> p) 55 { 56 return p.getFirst() == null || p.getSecond() == null; 57 } 58 59 public static void swap(Pair<?> p) { swapHelper(p); } 60 61 public static <T> void swapHelper(Pair<T> p) 62 { 63 T t = p.getFirst(); 64 p.setFirst(p.getSecond()); 65 p.setSecond(t); 66 } 67 } 68 public class Pair<T> //泛型类 69 { 70 private T first; 71 private T second; 72 73 public Pair() { first = null; second = null; } 74 public Pair(T first, T second) { this.first = first; this.second = second; } 75 76 public T getFirst() { return first; } 77 public T getSecond() { return second; } 78 79 public void setFirst(T newValue) { first = newValue; } 80 public void setSecond(T newValue) { second = newValue; } 81 } 82 83 import java.time.*; 84 85 public class Employee 86 { 87 private String name; 88 private double salary; 89 private LocalDate hireDay; 90 91 public Employee(String name, double salary, int year, int month, int day) 92 { 93 this.name = name; 94 this.salary = salary; 95 hireDay = LocalDate.of(year, month, day); 96 } 97 98 public String getName() 99 { 100 return name; 101 } 102 103 public double getSalary() 104 { 105 return salary; 106 } 107 108 public LocalDate getHireDay() 109 { 110 return hireDay; 111 } 112 113 public void raiseSalary(double byPercent) 114 { 115 double raise = salary * byPercent / 100; 116 salary += raise; 117 } 118 } 119 120 public class Manager extends Employee //继承自Employee类 121 { 122 private double bonus; 123 124 /** 125 @param name the employee's name 126 @param salary the salary 127 @param year the hire year 128 @param month the hire month 129 @param day the hire day 130 */ 131 public Manager(String name, double salary, int year, int month, int day) 132 { 133 super(name, salary, year, month, day); 134 bonus = 0; 135 } 136 137 public double getSalary() 138 { 139 double baseSalary = super.getSalary(); 140 return baseSalary + bonus; 141 } 142 143 public void setBonus(double b) 144 { 145 bonus = b; 146 } 147 148 public double getBonus() 149 { 150 return bonus; 151 } 152 }
实验2:结对编程练习
实验总结:
学习了 泛型 这一java特性;了解了定义泛型类,泛型方法需要注意的关键点,以及如何限定泛型类型。