匿名类
介绍
当接口,抽象类的实现类。在整个项目中使用一次。则可以考虑匿名类
使用方法
public interface Runnable{
void run();
}
// 假设这个类只有在一个场景使用
public class Person implements Runnable{
public void run(){
System.out.println("打印--run");
}
}
public class test{
public static void main(String[] args) {
//假设Runnable这个类只有在一个场景使用
// 则之间使用下面的方式使用匿名类
Runnable = new Runnable() {
@Override
public void run() {
}
};
}
}
注意
- 匿名类不能定义除编译时常量以外的static 常量
- 匿名类只能访问final或有效final的局部变量
- 匿名类不能定义构造方法,可以有初始化块
- 匿名类可以直接访问外部类的所有成员
常用用途
-
方法需要传入一段代码的时候,代码传递
public class Times{ public interface Block{ void running(); }; public static void test(Block block){ // 计算时间 } } public class test{ public static void main(String[] args) { //假设Runnable这个类只有在一个场景使用 // 则之间使用下面的方式使用匿名类 Times.test(new Block(){ @Override public void running() { // 去做操作逻辑 } }); } }
-
过滤
-
回调
public class Times{ public interface Block{ void success(); }; public static void test(String name, Block block){ // 计算时间 if(条件){ block.success(); } } } public class test{ public static void main(String[] args) { //假设Runnable这个类只有在一个场景使用 // 则之间使用下面的方式使用匿名类 Times.test(new Block(){ @Override public void success() { 得到了成功的返回 } }); } }
Lambda(java 8后的语法)
介绍
- 函数式接口
- 只包含一个抽象方法的接口
- @FunctionalInterface 可以表达这是一个函数式接口。可以规范接口
- 当使用的是函数式接口的时候可以使用lambda优化
语法
(参数)->{实现} 例如上面的 Times.test(new Block(){ @Override public void success() { 得到了成功的返回 } }); 可以改成 Times.test(()-{ // 做逻辑 });
使用注意
只能访问final 或者有效的final局部变量
不能引用新的作用域Lambda 与 匿名类的区别
Lambda没有引入新的作用域
可以看到Lambad 上面的this.age没有报错。而匿名类的this.age报错
因为匿名类下的this代表得失test那个对象。 - 函数式接口
方法引用
- 当使用方法Lambad语法里面引入的是一个方法时候。则可以使用方法引用直接精简代码。如