实现了某一个接口的匿名类的例子_java中的内部类内部接口详解,一文搞定
簡介
一般來說,我們創建類和接口的時候都是一個類一個文件,一個接口一個文件,但有時候為了方便或者某些特殊的原因,java并不介意在一個文件中寫多個類和多個接口,這就有了我們今天要講的內部類和內部接口。
內部類
先講內部類,內部類就是在類中定義的類。類中的類可以看做是類的一個屬性,一個屬性可以是static也可以是非static的。而內部類也可以定義在類的方法中,再加上匿名類,總共有5種內部類。
靜態內部類
我們在class內部定義一個static的class,如下所示:
@Slf4j public class StaticInnerClass {static class Inner {void print() {Home("Inner class is: " + this);}}public static void main(String[] args) {StaticInnerClass.Inner inner = new StaticInnerClass.Inner();inner.print();} }因為static變量可以直接根據類名來存取,所以我們使用new StaticInnerClass.Inner()來實例化內部類。
非靜態內部類
class中定義的類也可以是非靜態的,如下所示:
@Slf4j public class InnerClass {class Inner {void print() {Home("Inner class is: " + this);}}public static void main(String[] args) {InnerClass.Inner inner = new InnerClass().new Inner();inner.print();} }要訪問到類的變量,需要實例化外部內,然后再實例化內部類:new InnerClass().new Inner()。
注意這里我們需要使用到兩個new。
靜態方法內部類
我們可以在靜態方法中定義一個類,這個類其實就相當于方法中的變量,這個變量當然不能是static的。我們看下面的例子:
@Slf4j public class StaticMethodInnerClass {private static String x = "static x";public static void print() {class MyInner {public void printOuter() {Home("x is " + x);}}MyInner i = new MyInner();i.printOuter();}public static void main(String[] args) {StaticMethodInnerClass.print();} }方法中的類,我們是無法在外部實例化的。
非靜態方法的內部類
同樣的非靜態方法也可以定義內部類:
@Slf4j public class MethodInnerClass {private String x = "non static x";public void print() {class MyInner {public void printOuter() {Home("x is " + x);}}MyInner i = new MyInner();i.printOuter();}public static void main(String[] args) {new MethodInnerClass().print();} }注意,這里需要先實例化外部類才可以繼續調用。
匿名類
最后一個,匿名類,直接在需要的時候實例化的類。匿名類我們遇到了很多次了,比如在構建SortedSet的時候,可以傳入自定義的Comparator,我們可以用匿名類來實現,也可以直接使用lambda表達式。
public class AnonymousClass {public static void main(String[] args) {SortedSet sortedSet1 = new ConcurrentSkipListSet(new Comparator(){@Overridepublic int compare(Object o1, Object o2) {return 0;}});SortedSet sortedSet2 = new ConcurrentSkipListSet((o1, o2) -> 0);} }內部接口
Inner Interface是指在接口中定義的接口。最常見的就是Map中的Entry了:
public interface Map<K, V> {interface Entry<K, V> {K getKey();}這里的內部接口一定是static的,因為接口是不能實例化的,所以為了訪問到接口中的接口,必須定義為static。如果不指定,則默認就是static。
我們看一個該內部接口的實現:
public class MapImpl implements Map.Entry{@Overridepublic Object getKey() {return 0;}@Overridepublic Object getValue() {return null;}@Overridepublic Object setValue(Object value) {return null;} }總結
本文講解了5個內部類的實現和一個內部接口的應用。大家只要把內部的類或者接口看成一個變量,就可以很好的理解上面的內容了。
總結
以上是生活随笔為你收集整理的实现了某一个接口的匿名类的例子_java中的内部类内部接口详解,一文搞定的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 安卓纸牌游戏(安卓纸牌)
- 下一篇: oracle中join另一个表后会查询不