第11章 Java枚举与泛型总结
11.1枚举
枚举是一个被命名的整型常数的集合,用于声明一组带标识符的常数。枚举在曰常生活中很常见,例如一个人的性别只能是“男”或者“女”,一周的星期只能是 7 天中的一个等。类似这种当一个变量有几种固定可能的取值时,就可以将它定义为枚举类型。
enum WeekDay {Mon("Monday"),Tue("Tuesday"),Wed("Wednesday"),Thu("Thursday"),Fri("Friday"),Sat("Saturday"),Sun("Sunday");// 以上是枚举的成员,必须先定义,而且使用分号结束private final String day;private WeekDay(String day) {this.day = day;}public static void printDay(int i) {switch(i) {case 1:System.out.println(WeekDay.Mon);break;case 2:System.out.println(WeekDay.Tue);break;case 3:System.out.println(WeekDay.Wed);break;case 4:System.out.println(WeekDay.Thu);break;case 5:System.out.println(WeekDay.Fri);break;case 6:System.out.println(WeekDay.Sat);break;case 7:System.out.println(WeekDay.Sun);break;default:System.out.println("wrong number!");}}public String getDay() {return day;}
}
public static void main(String[] args) {for(WeekDay day : WeekDay.values()) {System.out.println(day+"====>" + day.getDay());}WeekDay.printDay(5);
}
11.1.1使用枚举类型设置常量
enum-modifiers 表示枚举的修饰符主要包括 public、private 和 internal;enumname 表示声明的枚举名称;enum-base 表示基础类型;enum-body 表示枚举的成员,它是枚举类型的命名常数。
11.1.2深入了解枚举类型
Java 中的每一个枚举都继承自 java.lang.Enum 类。当定义一个枚举类型时,每一个枚举类型成员都可以看作是 Enum 类的实例,这些枚举成员默认都被 final、public, static 修饰,当使用枚举类型成员时,直接使用枚举名称调用成员即可。
enum Signal {// 定义一个枚举类型GREEN,YELLOW,RED
}
public class TrafficLight {Signal color = Signal.RED;public void change() {switch(color) {case RED:color = Signal.GREEN;break;case YELLOW:color = Signal.RED;break;case GREEN:color = Signal.YELLOW;break;}}
}
public class Jihe {public enum Sex {// 定义一个枚举male,female;}public static void main(String[] args) {compare(Sex.valueOf("male")); // 比较}public static void compare(Sex s) {for(int i = 0;i < Sex.values().length;i++) {System.out.println(s + "与" + Sex.values()[i] + "的比较结果是:" + s.compareTo(Sex.values()[i]));}}
}
11.1.3使用枚举类型的优势
enum Signal {// 定义一个枚举类型GREEN,YELLOW,RED;
}
public static void main(String[] args) {for(int i = 0;i < Signal.values().length;i++) {System.out.println("枚举成员:"+Signal.values()[i]);}
}
EnumMap 与 EnumSet
为了更好地支持枚举类型,java.util 中添加了两个新类:EnumMap 和 EnumSet。使用它们可以更高效地操作枚举类型。
EnumMap 类
EnumMap 是专门为枚举类型量身定做的 Map 实现。虽然使用其他的 Map(如 HashMap)实现也能完成枚举类型实例到值的映射,但是使用 EnumMap 会更加高效。
HashMap 只能接收同一枚举类型的实例作为键值,并且由于枚举类型实例的数量相对固定并且有限,所以 EnumMap 使用数组来存放与枚举类型对应的值,使得 EnumMap 的效率非常高。
11.2泛型
Java 集合之所以被设计成这样,是因为集合的设计者不知道我们会用集合来保存什么类型的对象,所以他们把集合设计成能保存任何类型的对象,只要求具有很好的通用性,但这样做带来如下两个问题:
集合对元素类型没有任何限制,这样可能引发一些问题。例如,想创建一个只能保存 Dog 对象的集合,但程序也可以轻易地将 Cat 对象“丢”进去,所以可能引发异常。
由于把对象“丢进”集合时,集合丢失了对象的状态信息,集合只知道它盛装的是 Object,因此取出集合元素后通常还需要进行强制类型转换。这种强制类型转换既增加了编程的复杂度,也可能引发 ClassCastException 异常。
泛型本质上是提供类型的“类型参数”,也就是参数化类型。我们可以为类、接口或方法指定一个类型参数,通过这个参数限制操作的数据类型,从而保证类型转换的绝对安全。
11.2.1回顾”向上转型“与”向下转型“
11.2.3泛型的常规用法
public class Jihe {public static void main(String[] args) {// 创建3个Book对象Book book1 = new Book(1, "唐诗三百首", 8);Book book2 = new Book(2, "小星星", 12);Book book3 = new Book(3, "成语大全", 22);Map<Integer, Book> books = new HashMap<Integer, Book>(); // 定义泛型 Map 集合books.put(1001, book1); // 将第一个 Book 对象存储到 Map 中books.put(1002, book2); // 将第二个 Book 对象存储到 Map 中books.put(1003, book3); // 将第三个 Book 对象存储到 Map 中System.out.println("泛型Map存储的图书信息如下:");for (Integer id : books.keySet()) {// 遍历键System.out.print(id + "——");System.out.println(books.get(id)); // 不需要类型转换}List<Book> bookList = new ArrayList<Book>(); // 定义泛型的 List 集合bookList.add(book1);bookList.add(book2);bookList.add(book3);System.out.println("泛型List存储的图书信息如下:");for (int i = 0; i < bookList.size(); i++) {System.out.println(bookList.get(i)); // 这里不需要类型转换}}
}
public class Jihe {public static <T> void List(T book) { // 定义泛型方法if (book != null) {System.out.println(book);}}public static void main(String[] args) {Book stu = new Book(1, "细学 Java 编程", 28);List(stu); // 调用泛型方法}
}
11.2.4泛型的高级用法
泛型的用法非常灵活,除在集合、类和方法中使用外,本节将从三个方面介绍泛型的高级用法,包括限制泛型可用类型、使用类型通配符、继承泛型类和实现泛型接口。
1. 限制泛型可用类型
在 Java 中默认可以使用任何类型来实例化一个泛型类对象。
// 限制ListClass的泛型类型必须实现List接口
public class ListClass<T extends List> {public static void main(String[] args) {// 实例化使用ArrayList的泛型类ListClass,正确ListClass<ArrayList> lc1 = new ListClass<ArrayList>();// 实例化使用LinkedList的泛型类LlstClass,正确ListClass<LinkedList> lc2 = new ListClass<LinkedList>();// 实例化使用HashMap的泛型类ListClass,错误,因为HasMap没有实现List接口// ListClass<HashMap> lc3=new ListClass<HashMap>();}
2. 使用类型通配符
Java 中的泛型还支持使用类型通配符,它的作用是在创建一个泛型类对象时限制这个泛型类的类型必须实现或继承某个接口或类。
A<? extends List>a = null;
a = new A<ArrayList> (); // 正确
b = new A<LinkedList> (); // 正确
c = new A<HashMap> (); // 错误
3. 继承泛型类和实现泛型接口
定义为泛型的类和接口也可以被继承和实现。
11.2.5泛型总结
泛型方法使得该方法能够独立于类而产生变化。如果使用泛型方法可以取代类泛型化,那么就应该只使用泛型方法。另外,对一个 static 的方法而言,无法访问泛型类的类型参数。因此,如果 static 方法需要使用泛型能力,就必须使其成为泛型方法。
第11章 Java枚举与泛型总结相关推荐
- java泛型 ppt_第7章-Java集合与泛型-精品课件(PPT)-精品课件(PPT)最新版
<第7章 -Java集合与泛型-精品课件(PPT)-精品课件(PPT).ppt>由会员分享,可免费在线阅读全文,更多与<第7章 -Java集合与泛型-精品课件(PPT)-精品课件(P ...
- java 枚举与泛型_Java枚举和泛型
这件事让我困扰了一段时间.以前我曾问过 questions,可能是一个不好的措辞和一个太抽象的例子.所以不清楚我实际在问什么.我会再尝试.请不要跳过结论.我期待这个问题根本不容易回答! 为什么我不能在 ...
- Java 第十一章总结 枚举与泛型
11.1 枚举 (1) 使用枚举类型设置常量 在项目中创建Constants接口,在接口中定义常量的常规方式. public interface Constants{ public static fi ...
- 【Java】第11章 JAVA 异常处理 头歌Educoder实训作业(十一)
第1关:学习-Java异常处理之try-catch之异常捕获 任务描述 本关任务:求给定两个数的商,并捕获除数为 0 的异常. 相关知识 为了完成本关任务,你需要掌握: 1.什么是异常: 2.如何捕获 ...
- Java编程思想学习笔记-第11章
<?xml version="1.0" encoding="utf-8"?> Java编程思想学习笔记-第11章 Java编程思想学习笔记-第11章 ...
- 《JAVA编程思想》学习笔记:第19章(枚举)
目录 Java编程思想(一)第1~4章:概述 Java编程思想(二)第5章:初始化和清理 Java编程思想(三)第6章:访问权限 Java编程思想(四)第7章:复用类 Java编程思想(五)第8章:多 ...
- JavaSE_第11章 泛型
第11章 泛型 学习目标 能够使用泛型定义类.接口.方法 能够理解泛型上限 能够阐述泛型通配符的作用 能够识别通配符的上下限 第十一章 泛型 11.1 泛型的概念 11.1.1 泛型的引入 例如:生产 ...
- JAVA常用基础知识点[继承,抽象,接口,静态,枚举,反射,泛型,多线程...]
类的继承 Java只支持单继承,不允许多重继承 - 一个子类只能有一个父类 - 一个父类可以派生出多个子类 这里写图片描述 子类继承了父类,就继承了父类的方法和属性. 在子类中,可以使用父类中定义的方 ...
- Thinking in java 第11章 持有对象 笔记+习题
Thinking in java 第11章 持有对象 学习目录 11.1 泛型和类型安全的容器 1. 当你制定了某个类型作为泛型参数时,你并不仅限于只能将该确切类型的对象放置到容器中.向上转型也可一样 ...
- 《Java编程思想》阅读笔记之第11章-持有对象
第11章-持有对象 容器类的引入:Java需要有不同的方式来保存对象(或说是对象的引用). 如数组可以保存一组对象或一组基本类型数据,也推荐使用,但是数组必需有固定的尺寸,但在实际的情况中,可能根本不 ...
最新文章
- LeetCode:Remove Nth Node From End of List
- ftp 工具_ftp工具,ftp工具如何下载使用?Linux如何配置ftp服务器?
- 建模matlab的算法代码呀,数学建模算法打包
- Django框架(19.Django中获取url的参数(位置参数以及关键字参数))
- 下两个网段转发的路由设置_收藏 | 多台路由器,不同网段的设备之间如何互访?...
- 计算机培训开场语,辅导班家长会主持词开场白
- oracle高水位线
- 【缅怀妈妈系列诗歌】之八:妈妈,我不会忘记
- 【BZOJ4668】冷战 并查集
- 7.3联盟最多的服务器,1.7.3 超级服务器inetd和xinetd
- CSS显示:内联vs内联块[重复]
- php魔法函数用途,PHP中的Magic Methods (魔术函数)
- 第一阶段✦第一章☞信息化知识
- CentOS7 官网下载及各版本区别
- c语言井字棋程序设计报告,井字棋游戏(课程设计)总结报告.doc
- 有哪些冷门却好用的东西可以网购?
- 一个SAP开发人员的2019年终总结
- Python获取excel数据
- Go语言如何捕获fatal致命错误并输出到日志
- 分享一波电脑软件下载、编程学习、壁纸下载网站
热门文章
- 利用openssl之 htps服务端和客户端编写
- SEO和SEM的区别与联系有哪些?SEM和SEO是什么?
- seo和sem的区别是什么?网站seo具体怎么做?
- Si24R1,CI24R1,nRF24L01简单解析对比
- android开发者模式 device,Settings中开发者模式的影藏和显示
- 【深度学习+组合优化】深度学习和强化学习在组合优化方面有哪些应用?
- 【组合优化】旅行商问题Traveling Salesman Problem(TSP)-概述
- Spring Cloud之路---1.注册中心eureka与服务提供者
- 小米6X 线刷兼救砖_解账户锁_纯净刷机包_教程
- Git更新本地分支信息