0. 枚举
两种实现方式
1. 自定义枚举类
class Season {
private String name;
private String desc;
/*
1.将构造器私有化
2.去掉setXxx方法,防止属性被修改
3.在Season内部,直接创建固定对象
4.优化,可以加入final关键字
*/
public static final Season SPRING = new Season("春天", "温暖");
public static final Season SUMMER = new Season("夏天", "炎热");
public static Season AUTUMN = new Season("秋天", "凉爽");
public static Season WINTER = new Season("冬天", "寒冷");
private Season(String name, String desc) {
this.name = name;
this.desc = desc;
}
public String getName() {
return name;
}
public String getDesc() {
return desc;
}
@Override
public String toString() {
return "Season{" +
"name='" + name + '\'' +
", desc='" + desc + '\'' +
'}';
}
}
2. 使用枚举关键字
enum Season2 {
SPRING("春天", "温暖"),
SUMMER("夏天", "炎热"),
AUTUMN("秋天", "凉爽"),
WINTER("冬天", "寒冷");
private String name;
private String desc;
Season2(String name, String desc) {
this.name = name;
this.desc = desc;
}
@Override
public String toString() {
return "Season2{" +
"name='" + name + '\'' +
", desc='" + desc + '\'' +
'}';
}
}
- 当我们使用 enum 关键字开发一个枚举类时,默认会继承 Enum 类, 而且是一个 final 类[如何证明],老师使用 javap 工 具来演示
类的单继承机制,使得enum可以多实现接口,但不能继承其他的类。 - 传统的 public static final Season2 SPRING = new Season2(“春天”, “温暖”); 简化成 SPRING(“春天”, “温暖”), 这里必 须知道,它调用的是哪个构造器.
- 如果使用无参构造器 创建 枚举对象,则实参列表和小括号都可以省略 第 482页
韩顺平循序渐进学 Java 零基础第 483页 - 当有多个枚举对象时,使用,间隔,最后有一个分号结尾
- 枚举对象必须放在枚举类的行首.
3. 三个基本的 Annotation:
-
@Override: 限定某个方法,是重写父类方法, 该注解只能用于方法
-
@Deprecated: 用于表示某个程序元素(类, 方法等)已过时 。不推荐使用,可以使用。什么都可以修饰。
-
@SuppressWarnings: 抑制编译器警告。
可以放置在类,方法,属性前。
@Target 是修饰注解的注解,称为元注解。
1. 集合框架
学习集合目标
:
1.会使用集合存储数据
2.会遍历集合,把数据取出来
3.掌握每种集合的特性
2个接口:
List接口:
1.有序的集合(),存储和取出元素的顺序相同
2.允许存储重复元素
3.有索引,可以使用普遍的for循环遍历
Vector集合 ArrayList集合 LinkedList集合
Set接口:
1.不允许有重复元素
2.没有索引下标(不能使用for循环遍历)
TreeSet集合 HashSet集合
LinkedHahSet(继承父类HashSet)(有序集合,存和取顺序一样)
List接口 与 Set接口 向上共性抽取形成Collection接口
定义的是所有单列集合中共性的方法
所有的单列集合都可以使用共性的方法
没有带索引的方法
集合框架的的学习方式:
1.学习顶层。学习顶层接口/抽象类中共性的方法,所有的子类都可以使用。
2.使用底层。使用底层子类创建对象时用。
collection中常用功能(顶层功能):
public boolean add(E e); 把给定对象添加到当前集合中。
public void clear(); 清空集合中所有元素。
public boolean remove(); 把给定对象在当前集合中删除。
public boolean contains(); 判断当前集合中是否包含给定的对象。
public boolean isEmpty(); 判断当前集合是否为空。
public int size(); 返回集合中元素的个数。
public Object[] toArray(); 把集合中的元素,存储到数组中。
2. 迭代器Iterator
迭代:在collection集合元素的通用获取方式。在取元素之前先要判断集合中有没有元素,
如果有,就把这个元素取出来,继续再判断,如果还有就再取出来。一直到集合中所有元素全部取出。
这种取出方式叫迭代。
Iterator接口中有两个常用方法:
boolean hasNext(); 如果仍有元素可以迭代,返回true;否则返回false。
E next(); 返回迭代的下一个元素。
Iterator迭代器,是一个接口,我们无法直接使用,需要使用Iterator接口的实现类对象。
collection方法中有一个方法叫iterator(),返回的就是Iterator接口的实现类对象。
迭代器的使用步骤【重点】:
1.使用集合中的方法iterator()获取迭代器的实现类对象。使用Iterator接口接收。(多态)
2.使用Iaterator接口中的hasNext()方法判断有没有下一个元素。
3.使用Iaterator接口中的next方法取出集合中的下一个元素。
迭代器Iterator有泛型,迭代器的泛型跟着集合走,集合是什么泛型,迭代器就是什么泛型。
3. 增强for循环:
用来遍历集合和数组
格式:
for(集合/数组数据类型 变量名:集合名/数组名){
sout(变量名);}
【增强for循环必须有被遍历的目标。目标只能是collection或者是数组。】
4. 泛型:
创建集合对象,使用泛型
好处:
1.避免了类型转换的麻烦,存储的是什么类型,取出的就是什么类型
2.把运行期异常(代码运行之后会抛出的异常),提升到了编译器。
弊端:
泛型确定后,就只能存储那一种数据类型
创建集合对象,不使用泛型:
好处:集合不使用泛型,默认的就是Object类型,可以存储任意类型的数据。
弊端:不安全,会引发异常。
泛型的定义和使用:
不确定用什么数据类型的时候可以使用泛型;
泛型可以接受任意的数据类型,【创建对象的时候确定泛型的数据类型】。
含有泛型的方法:
泛型定义在方法的修饰符和返回值类型之间
格式:
修饰符 <泛型> 返回值类型 方法名(参数列表 (使用泛型)){
//...}
含有泛型的接口:
首先定义含有泛型的接口。和定义含有泛型的类比较像。
使用方法2种:
1.定义接口的实现类时,确认泛型具体数据类型。(实现接口,指定接口的类型。)
2.接口是用什么泛型,实现类就用什么泛型,类跟着接口走。
相当于定义了一个含有泛型的类,创建对象的时候确定泛型。
泛型通配符:
?代表任意数据类型
使用方式:
不能创建对象使用
只能作为方法的参数使用。【定义的时候不能用,作为参数传递的时候可以用】
定义一个方法以后,我们不知道方法体中的集合使用什么数据类型,可以使用泛型通配符 ? 来接收数据类型。
泛型是没有继承概念的。
泛型的上限限定,下限限定。
(extends super 父类 ???)
斗地主案例:
四部思路。
Collections.shuffle方法。对集合进行随机打乱排序。