匿名内部类以及Lambda表达式的理解
程序员文章站
2024-02-29 23:27:10
...
首先,我的理解是匿名内部类和lambda的主要作用是简化代码。
而且匿名内部类可以实现类似多重继承的作用。
那么如何创建匿名内部类的对象呢。比较一下如下代码
这段代码输出456 123
第一次a指向匿名内部类,匿名内部类重写了test方法,所以输出456,第二次指向类A,所以输出123
那么如何创建内部类的对象呢
比如有如下所示的内部类
class A{
public void test(){
System.out.println("A");
}
class B{
public void test(){
System.out.println("B");
}
}
}
然后创建A对象,用a对象newB类的对象即可。 A a = new A();
B inner = a.new B();
inner.test();
以上使用常用于多线程编程中 或者threadlocal中。
new Thread(new Runnable() {
@Override
public void run() {
ticket.sale();
}
},"A").start();
private static ThreadLocal<Integer> seqNum = new ThreadLocal<Integer>() {
public Integer initialValue() {
return 0;
}
};
第一个例子是有问题的,在new Runable创建一个Runable对象,那么问题来了,Runable是一个接口,为什么可以new出来呢。因为后面加上{}后相当于创建了一个匿名内部类,通过这个匿名内部类来创建这个对象即可。
我们知道lamdba可以简化以上操作,更加简化代码的书写。
new Thread(() ->{ticket.sale();},"aa").start();
lamda表达式只能用于接口,且接口中有且只有一个抽象方法的时候才可以创建,也就是在接口中有@FunctionalInterface注解的时候才可以使用,原理是通过反射机制来动态加载方法。
第二个例子就比较鸡蛋,创建ThreadLocal对象并且覆盖initialValue方法。
上一篇: 运行时多态和编译时多态