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


  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值