1. 程式人生 > >匿名內部類以及Lambda表示式的理解

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