欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

匿名内部类以及Lambda表达式的理解

程序员文章站 2024-02-29 23:27:10
...

首先,我的理解是匿名内部类和lambda的主要作用是简化代码。

而且匿名内部类可以实现类似多重继承的作用。

那么如何创建匿名内部类的对象呢。比较一下如下代码


匿名内部类以及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方法。