一、接口
interface、多继承、所有方法均为抽象方法、没有字段
二、匿名类
匿名类格式如下
new 父类构造器(参数列表)|实现接口()
{
//匿名内部类的类体部分
}
它不能是抽象类,必须继承某个类或某个接口,但是两者不可兼得,同时也只能继承一个类或者实现一个接口。且不能定义构造函数,不能存在任何静态成员变量和静态方法。匿名内部类为局部内部类,所以局部内部类的所有限制同样对匿名内部类生效。
三、Lambda表达式
Java Lambda表达式的一个重要用法是简化某些匿名内部类(Anonymous Classes)的写法。但Lambda表达式不能取代所有匿名内部类,只能用来取代函数接口(函数接口,是指内部只有一个抽象方法的接口)。
eg1 无参
JDK7 匿名内部类写法
new Thread(new Runnable(){// 接口名
@Override
public void run(){// 方法名
System.out.println("Thread run()");
}
}).start();
JDK8 Lambda表达式写法
new Thread(
() -> System.out.println("Thread run()")// 省略接口名和方法名
).start();
上述代码跟匿名内部类的作用是一样的,但比匿名内部类更进一步。这里连接口名和函数名都一同省掉了。
eg2 有参
JDK7 匿名内部类写法
Listlist = Arrays.asList("I", "love", "you", "too");
Collections.sort(list, new Comparator(){// 接口名
@Override
public int compare(String s1, String s2){// 方法名
if(s1 == null)
return -1;
if(s2 == null)
return 1;
return s1.length()-s2.length();
}
});
JDK8 Lambda表达式写法
Listlist = Arrays.asList("I", "love", "you", "too");
Collections.sort(list, (s1, s2) ->{// 省略参数表的类型
if(s1 == null)
return -1;
if(s2 == null)
return 1;
return s1.length()-s2.length();
});
四、泛型
“泛型”简单的意思就是泛指的类型(参数化类型)典型的就是
ArrayList Listlist=new ArrayList<>();
1.泛型类
类需要有很好的扩展性,那么我们可以将其设置成泛型的
class DataHolder{
T item;
public void setData(T t) {
this.item=t;
}
public T getData() {
return this.item;
}
}
泛型类定义时只需要在类名后面加上类型参数即可,当然你也可以添加多个参数,类似于
泛型类最常用的使用场景就是“元组”的使用。我们知道方法return返回值只能返回单个对象。如果我们定义一个泛型类,定义2个甚至3个类型参数,这样我们return对象的时候,构建这样一个“元组”数据,通过泛型传入多个对象,这样我们就可以一次性方法多个数据了。
2.泛型方法
泛型方法既可以存在于泛型类中,也可以存在于普通的类中。
class DataHolder{
T item;
public void setData(T t) {
this.item=t;
}
public T getData() {
return this.item;
}
/**
* 泛型方法
* @param e
*/
public void PrinterInfo(E e) {
System.out.println(e);
}
}
public与返回值中间声明,标明此方法为泛型方法,泛型类中使用了泛型成员的方法不是泛型方法。
3.泛型接口
public interface Generator{
public T next();
}
在声明类的时候,需将泛型的声明也一起加到类中
class FruitGeneratorimplements Generator{
@Override
public T next() {
return null;
}
}
4.Java泛型的通配符,上下边界
使用泛型的时候,我们还可以为传入的泛型类型实参进行上下边界的限制,如:类型实参只准传入某种类型的父类或某种类型的子类
public void showKeyValue1(Generic obj){
Log.d("泛型测试","key value is " + obj.getKey());
}
Genericgeneric1 = new Generic("11111");
Genericgeneric2 = new Generic(2222);
Genericgeneric3 = new Generic(2.4f);
Genericgeneric4 = new Generic(2.56);
//这一行代码编译器会提示错误,因为String类型并不是Number类型的子类
//showKeyValue1(generic1);
showKeyValue1(generic2);
showKeyValue1(generic3);
showKeyValue1(generic4);
其它还有下界通配符<? super T> <?>无限通配符
五、参考链接
https://objcoding.com/2019/03/04/lambda/
https://www.liaoxuefeng.com/wiki/1252599548343744/1265102638843296
不晓得这首歌里蕴含着多少故事
原文始发于微信公众号(赛博少女):Java核心技术卷Ⅰ —— 接口、匿名类、Lambda表达式、泛型
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论