关键词:
第十周总结
一、知识总结
1.定义简单泛型类
1.1一个泛型类Generic class就是具有一个或多个类型变量的类
1.2Java中,使用E表示集合的元素类型,K和V表示Map的关键字和值的类型。T(需要时还可以使用临近的U和S)表示“任意类型”。
1.3泛型类可以看作普通类的工厂
2.泛型方法
2.1类型变量放在修饰符的后面,返回类型的前面。泛型方法可以定义在普通类中,也可以定义在泛型类中。
2.2当调用一个方法时,在方法名前的尖括号中放入具体的类型。
3.类型变量的限定
3.1<T extends BoundingType>表示T应该是绑定类型的子类型subtype,T和绑定类型可以是类,也可以是接口。一个类型变量或通配符可以有多个限定(用&)
3.2如果用一个类作为限定,它必须是限定列表中的第一个。
4.泛型代码和虚拟机
4.1无论何时定义一个泛型类型,都自动提供了一个相应的原始类型raw type。原始类型的名字就是删去类型参数后的泛型类型名。擦除erased类型变量,并替换为限定类型(无限定的变量用Object)
4.2为了提高效率,应该将标签tagging接口(即没有方法的接口)放在边界列表的末尾。
4.3桥方法bridge method
4.4具有协变的返回类型covariant return types
4.5记住有关泛型转换的事实:1.虚拟机中没有泛型,只有普通的类和方法;2.所有的类型参数都用它们的限定类型替换;3.桥方法被合成来保持多态;4.为保持类型安全性,必要时插入强制类型转换。
5.约束与局限性
5.1不能用基本类型实例化类型参数
5.2运行时类型查询只适用于原始类型
5.3不能创建参数化类型的数组
5.4Varargs警告:使用@SafeVarargs
5.5不能实例化类型变量
5.6不能构造泛型数组
5.7泛型类的静态上下文中类型变量无效
5.8不能抛出或捕获泛型类的实例
5.9可以消除对受查异常的检查
5.10注意擦除后的冲突
6.泛型类型的继承规则
6.1泛型类不是斜变的
7.通配符类型
7.1通配符类型中,允许类型参数变化。如Class<? extends SuperClass>表示任何泛型Class类型,它的类型参数是SuperClass的子类,如Class<subClass>
7.2超类型限定supertype bound:? super subClass 这个通配符限制为subClass的所有超类型。可以为方法提供参数,但不能使用返回值。
7.3无限定通配符 :Class<?> 和Class本质的不同在于:可以用任意的Object对象调用原始class的setObject方法
二、实验:泛型程序设计技术
1、实验目的与要求
(1) 理解泛型概念;
(2) 掌握泛型类的定义与使用;
(3) 掌握泛型方法的声明与使用;
(4) 掌握泛型接口的定义与实现;
(5)了解泛型程序设计,理解其用途。
2、实验内容和步骤
实验1: 导入第8章示例程序,测试程序并进行代码注释。
测试程序1:
l 编辑、调试、运行教材311、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.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; /** * @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;
结果:
三、实验总结
本次实验主要是在上周实验的基础上更加深刻的去理解泛型概念;掌握泛型类的定义与使用以及泛型方法的声明与使用;了解泛型接口的定义与实现。
201771010108-韩腊梅-第十三周学习总结(代码片段)
第十三周学习总结一、 知识总结1.在Java的swing编程中,Java中的事件机制非常常用事件监听器的参与者:1-1.事件对象: 一般继承自java.util.EventObject对象,由开发者自行定义1-2.事件源: 就是触发事件的源头,不同的事... 查看详情
201771010108-韩腊梅-第十八周学习总结(代码片段)
实验十八 总复习1、实验目的与要求 (1)综合掌握java基本程序结构;(2)综合掌握java面向对象程序设计特点;(3)综合掌握javaGUI程序设计结构;(4)综合掌握java多线程编程模型;(5)综合编程练习... 查看详情
201771010108-韩腊梅-第十七周学习总结(代码片段)
第十七周学习总结 一、知识总结1.创建线程的2种方法方式1:继承java.lang.Thread类,并覆盖run()方法。优势:编写简单;劣势:无法继承其他父类方式2:实现java.lang.Runnable接口,并实现run()方法。优势:可以继承其他类,多线... 查看详情
201771010108-韩腊梅-第十六周学习总结(代码片段)
第十六周总结一、知识总结1.创建线程的2种方法方式1:继承java.lang.Thread类,并覆盖run()方法。优势:编写简单;劣势:无法继承其他父类方式2:实现java.lang.Runnable接口,并实现run()方法。优势:可以继承其他类,多线程可以共... 查看详情
201771010108-韩腊梅-第九周学习总结(代码片段)
第九周学习总结一、知识总结1.异常对象均为派生于Throwable类的一个实例,Throwable类下分为Errow类和Exception类,其中Errow类以及其子类描述了Java运行时的系统错误和资源耗尽错误,Exception类又可以下分为两类,即RuntimeException和其... 查看详情
201771010108-韩腊梅-第七周学习总结(代码片段)
第六周实验总结 一、知识点总结1、继承的概述:在多个类中存在相同的属性和行为,把这些相同的部分抽取到一个单独的类中,把这个单独的类叫作父类,也叫基类或者超类,把其他被抽取的类叫作子类,并且父类的所有... 查看详情
201771010108韩腊梅《面向对象程序设计(java)》第一周学习总结
第一部分:课程准备部分填写课程学习平台注册账号,平台名称注册账号博客园:www.cnblogs.com木子林程序设计评测:https://pintia.cn/[email protected]代码托管平台:https://github.com/hanlamei中国大学MOOC:https://www.icourse163.org/1936203991以... 查看详情
第十周java学习总结
目录第十周java学习总结学习内容代码上传截图代码链接第十周java学习总结学习内容第12章Java多线程机制主要内容Java中的线程Thread类与线程的创建线程的常用方法线程同步协调同步的线程线程联合GUI线程计时器线程重点和难点重... 查看详情
第十周学习总结
#include<stdio.h>#include"C:UsersAdministratorDesktopCTestoutpart1.c"intmain()inta=1,b=2,c;c=add(a,b);PR("%d",c);return0; #include<stdio.h>#definePRprintfintadd(inta,in 查看详情
第十周学习总结
#include<stdio.h>#include"C:UsersAdministratorDesktopCTestoutpart1.c"intmain()inta=1,b=2,c;c=add(a,b);PR("%d",c);return0; #include<stdio.h>#definePRprintfintadd(inta,intb)intc;c=a+b;returnc; 查看详情
linux学习第十周总结(代码片段)
linux学习第十周总结接着上周的mysql,重点终结日志管理,备份还原,主从复制和mysql集群一、mysql日志管理事务日志transactionlog错误日志errorlog通用日志generallog慢查询日志slowquerylog二进制日志binarylog中继日志releylog1.事务日志事务... 查看详情
20175333曹雅坤第十周学习总结###教材学习内容总结(代码片段)
20175333曹雅坤第十周学习总结教材学习内容总结第十二章Java多线程机制进程与线程线程是比进程更小的执行单位,一个进程在其执行过程中,可以产生多个线程,形成多条执行线索,每条线索,即每个线程也有它自身的产生、存... 查看详情
201723292017-2018-2《程序设计与数据结构》第十周学习总结
201723292017-2018-2《程序设计与数据结构》第十周学习总结教材学习内容总结第十三章一、集合与数据结构1、集合:是一种对象,类似于保存其他对象的存储库;2、作用:表示一个专用与保存元素的对象,并且该对象还提供增添、... 查看详情
第十周学习知识总结(代码片段)
一、循环双向链结表插入元素intinsert(DList*L,ElemTypee)Linkcurrent=L->head;Linkprevious=L->tail;LinknewNode;intsize=getSize(*L);intposition=0;if(current==NULL)//Case1:当循环双向链结表为空时。newNode=(Link)malloc(sizeof 查看详情
201723272017-2018-2《程序设计与数据结构》第十周学习总结
学号2017-2018-2《程序设计与数据结构》第十周学习总结教材学习内容总结第11章异常-异常处理:1.错误和异常都是对象,代表非正常情况或无效处理。2.常见的异常问题:-试图做除以0的操作。-数组索引越界。-找不到指定的文件... 查看详情
20175306王佳烁第十周学习总结
201753062018-2019-2《Java程序设计》第10周学习总结教材学习内容总结进程:进程是程序的一次动态执行过程,对应了从代码加载、执行至执行完毕的一个完整过程,这个过程也是进程本身从产生、发展至消亡的过程。线程:线程是... 查看详情
2017-2018-220179317卿爽《网络攻防技术》第十周学习总结
##实验一:Nmap+Wireshark攻击方与防守方均使用Kali虚拟机,本人IP:192.168.2.160,结对方:192.168.2.239,攻击方通过Nmap工具探测防守方,防守方用tcpdump工具与Wireshark工具通过抓包分析对方攻击目的和Nmap命令。使用nmap进行探测: &n... 查看详情
第十周助教总结
一、同学们本周学习的情况分析本周的题目稍有难度,但这阻挡不了同学们学习的热情,有问题及时请教二、同学们的问题1.韩信点兵题目没读懂2.整除光棍一脸懵逼,用模拟除法三、解决方法1.要同学们一个字一个字的读题目2.... 查看详情