Java中匿名内部类与Lambda表达式解析
·
先理解匿名内部类
- 不是真正意义上的类,实际上是一个对象
new Swim(){
@Override
public void swim() {
System.out.println("重写了游泳的方法”);
}
};
最开始swim与new都没有,这时就是一个没名字的类,swim就是他实现的接口或者继承的类,new则是将没名字的类实例化,()则是代表用的是无参构造
- 因为他是一个对象,可以直接传入方法中,而他又有继承或是实现的状态,这时天然构成了方法要传入的父类参指向子类对象,也就是多态,编译看父类有没有此方法,运行则直接调用子类的相关方法
Swim s = new Swim(){
@Override
public void swim() {
System.out.println("重写之后游泳方法”);
}
s.swim();
new Swim(){
@Override
public void swim() {
System.out.println(“重写之后游泳方法”);
}.swim();
- Swim s = new swim()可以把他传给一个引用,随后通过s.来调用方法,同样他也可以在整个语句的最后.调用自己的方法
引入Lambda
- 可以看到有用的只是System那一行,比较浪费,为了简化就有了Lambda(还是一个对象)
语法
() -> {
System.out.println("hello");
}
//()中是参数,后面是方法体
也就是
new Runnable() {
@Override
public void run() {
System.out.println("hello");
}
}
的简化(只可以简化函数式接口,也就是只有一个抽象函数的接口)
运用
new Thread(new Runnable() {
@Override
public void run() {
System.out.println("线程");
}
}).start();
优化为
new Thread(() -> {
System.out.println("线程");
}).start();
核心思想
只保留方法的内容,让编译器自己推断接口名,方法名,参数类型
- 推断过程
1.看Thread的构造函数,就匹配到了Runnable这个接口
2.再查询里面的抽象方法run,随后知道了Lambda就要顶替run这个方法
3.括号里就是形参,->后面就是执行的具体的逻辑,其余的返回值等等都会自动补齐
更多推荐

所有评论(0)