积木(01)
泛型
使用传统的方法的缺点:
-
不能对加入到集合中的数据类型进行约束(不安全)
-
遍历的时候,需要进行类型转换,如果集合中的数据量较大,对效率有影响
ArrayList arryList = new ArrayList();
说明:
-
ArrayList 表示放到ArrayList 集合中的元素都是Dog类型
-
如果编译器发现添加的类型不满足要求,就会报错
-
在遍历的是,可以直接去除Dog类型,而不是Object
泛型的好处
-
编译时,检查添加的元素类型,提高了安全性
-
减少了类型转换的次数,提高了效率
泛型介绍
-
泛型又称参数化类型,是JDK5.0 出现的新特性,解决数据类型的安全性问题
-
在类声明或实例化时子只要指定好需要的具体的类型即可
-
Java泛型可以保证如果程序在编译时没有发出警告,运行时就不会产生ClassCastException异常。同时,代码更加简洁,健壮
-
泛型的作用是:可以在类声明时通过一个标识表示类中某个元素的类型,或者是某个方法的返回值的类型,或者是参数的类型
//E 表示 s的数据类型,该数据类型是在定义Person对象的时候指定的,即在编译期间就确定E是什么类型
class Person{
E s;
public Person(E s){
this.s = s;
}
public E f(){
return s;
}
}
泛型语法
-
泛型的声明
-
interface 接口 {}
-
class 类<K,V>{}
-
其中,T,K,V不代表值,而是表示类型
-
任意字母都可以。常用T表示,是Type的缩写
-
-
泛型的实例化
注意细节
-
<>里面只能是引用类型
-
在指定泛型具体类型后,可以传入该类型或者其子类型
-
实际开发中
-
ArrayList a = new ArrayList<>();
-
后面会把<>里面的内容省略
-
自定义泛型
class Tiger<T,R,M>{
}
-
Tiger 后面泛型,所以我们把Tiger就称为自定义泛型类
-
范式的标识符,一般都是大写字母
-
泛型标识符可以有多个
-
普通成员可以使用泛型(属性,方法)
-
使用泛型的数组不能初始化
- 类型没有确定下来,编译器不知道开多大空间
-
静态方法不能使用泛型
- 因为静态是和类相关的,在类加载时,对象还没创建
自定义泛型接口
-
接口中,静态成员也不能使用泛型
-
泛型接口的类型在继承接口或者实现接口时确定
-
没有指定类型,默认Objec
自定义泛型方法
-
基本语法
- 修饰符 <T,R> 返回类型 方法名(参数列表){}
-
泛型方法,可以定义在普通类中,也可以定义在泛型类中
-
当泛型方法被调用时,类型会确定
-
public void eat(E e){}
-
修饰符后面没有<>
-
该方法不是泛型方法,而是使用了泛型
-
泛型的继承和通配符
//不允许这样写
List<Object> list = new ArrayList<String>();
通配符
- <?> 支持仍以泛型类型
- <? extend A> 支持A类以及A类的子类,规定了泛型的上限
- <? super A>支持A类以及A类的父类,不限于直接父类,规定了泛型的下限
栈和队列
栈
基本理解:Stack 是一个类,可以直接创建对象
Queue
基本理解:Queue是一个接口,不能直接实现
-
访问第一个元素
-
peek (安全)
-
element(不安全)
-
-
出队
-
poll(安全)
-
remove(不安全)
-
-
入队
-
offer(安全)
-
add(不安全)
-
内部类
内部类表示的事物是外部类的一部分
内部类单独出现没有任何意义
比如说:迭代器
内部类的访问特点
-
内部类可以直接访问外部类的成员,包括私有
-
外部类要访问内部类的成员,必须创建对象
匿名内部类
本质:隐藏了名字的内部类
使用场景:当方法的参数是接口或者类时,并且这个接口或者是对象只使用一次,就可以用匿名内部类