写在前面
本文主要讲解了Java中接口与泛型机制,一起来领悟Java的多重实现与参数化的魅力吧。
活动地址:CSDN21天学习挑战赛
学习的最大理由是想摆脱平庸,早一天就多一份人生的精彩;迟一天就多一天平庸的困扰。各位小伙伴,如果您:
想系统/深入学习某技术知识点…
一个人摸索学习很难坚持,想组团高效学习…
想写博客但无从下手,急需写作干货注入能量…
热爱写作,愿意让自己成为更好的人…
接口
定义
接口是抽象类的延伸,在1.8之前,接口与抽象类一样,不允许有具体的方法实现,在1.8之后为接口增加了改进,允许接口中存在默认的方法实现,默认方法的关键字使用default和static关键字修饰。
接口使用interface关键字定义,格式如下:
[public] interface 接口名 [extends 父接口名列表]{
[public] [static] [final] 域类型 域名 = 常量值;
修饰符 返回值 方法名();
[default|static] 返回值 方法名(){
//TODO...
}
}
Tips
接口中,方法必须被public和abstract(1.8后新增default与static)修饰
接口中任何字段都是static和final的。
一个类通过使用implements关键字实现接口。
接口的用途
接口定义了一套行为规范,一个类实现该接口便要遵守这个接口所定义的规范——实现接口中定义的所有抽象方法,有一个抽象方法未实现,该类便只能是抽象类。
接口的多重实现机制很大程度上弥补了java类的单重继承的局限性,不仅一个类可以实现多个接口,而且多个无关类可以实现同一个接口。
接口的实现注意事项
- 一个类可以实现多个接口,在声明时用implements关键字声明该类将要实现哪些接口,多个接口之间使用逗号隔开;
- 如果实现某接口的类不是抽象类,则在类的定义部分必须实现指定接口的所有抽象方法;
- 一个类实现某接口的抽象方法时,必须重写该方法;
- 接口的抽象方法都是访问限制符默认为public,在实现方法时要显示加上public修饰符。
泛型
定义
泛型是Java语言的新特性,泛型本质上是参数化类型——程序中的数据类型被指定为一个参数。泛型可以用在类、接口和方法的创建中,分别称为泛型类、泛型接口、泛型方法。
例如
public class Example<T>{
private T obj;
public Example(T obj){
this.obj = obj;
}
public T getObj(){
return obj;
}
public void showType(){
System.out.println("T的实际类型是:" + obj.getClass().getName());
}
}
意义
在1.5之前,Java不支持泛型,为实现方法参数的通用性,一般将参数定义为Object类型,任意对象都可以传递给Object类型引用变量,从而实现参数的“任意化”,但是,要将对象转化为原有类型就必须强制类型转换,容易带来问题。(Object是万类之祖,非必要不要声明Object类型的参数;需要使用的参数类型一般是有限的)
好处
泛型在定义的时候不指定参数的类型,在使用的时候确定,增加了程序的通用性,使程序更为“模板”化;
在编译的时候检查类型安全,并且所有的强制转换都是自动和隐式的。
使用规则
- 泛型的类型参数只能是类类型(包括自定义类),不能是简单类型(基本数据类型需要使用对应的封装类);
- 泛型的类型参数可以有多个,例如Map<K,V>;
- 泛型的参数类型可以使用extends语句,例如<T extends Number>,extends在这里并非是继承的意思,而是表示类型上界限制,代表着T<=Number;
- 泛型的参数类型可以是通配符类型,ArrayList<? extends Number>,表示Number范围的某个类型,其中,“?”代表着未定类型;
- 泛型的参数类型还支持super子句,<? super T>表示类型的下界限制,表示参数化类型是T或T的父类型。
Tip:集合类大部分都是泛型类,关于集合类博主以后会介绍,敬请期待。
泛型方法
特点
Java允许有泛型方法,即某个方法的参数是参数化的,参数的实际类型取决于实参,泛型方法与其类是否是泛型没有关系。
格式
public class Example{
public <T> void getObj(T x){
System.out.println(x.getClass().getName());
}
}