匿名內部類以及Lambda表示式的理解
阿新 • • 發佈:2018-12-26
首先,我的理解是匿名內部類和lambda的主要作用是簡化程式碼。
而且匿名內部類可以實現類似多重繼承的作用。
那麼如何建立匿名內部類的物件呢。比較一下如下程式碼
這段程式碼輸出456 123
第一次a指向匿名內部類,匿名內部類重寫了test方法,所以輸出456,第二次指向類A,所以輸出123
那麼如何建立內部類的物件呢
比如有如下所示的內部類
然後建立A物件,用a物件newB類的物件即可。class A{ public void test(){ System.out.println("A"); } class B{ public void test(){ System.out.println("B"); } } }
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方法。