溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Java有哪些內部類與內部接口

發布時間:2021-11-02 14:06:10 來源:億速云 閱讀:247 作者:iii 欄目:編程語言

這篇文章主要講解了“Java有哪些內部類與內部接口”,文中的講解內容簡單清晰,易于學習與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學習“Java有哪些內部類與內部接口”吧!

一. 內部類

    內部類就是在類中定義類。我們可以把類中的類看做是類的一個屬性,一個屬性可以是static也可以是非static的。而內部類也可以定義在類的方法中,再加上匿名類,總共有5種內部類。 

    1. 靜態內部類

            靜態內部類就是在class內部定義一個static的class,如下代碼所示:

public class StaticInnerClass {

   static class Inner {
       void print() {
           log.info("Inner class is: " + this);
       }
   }

   public static void main(String[] args) {
       StaticInnerClass.Inner inner = new StaticInnerClass.Inner();
       inner.print();
   }
}

注意:靜態內部類中因為static變量可以直接根據類名來存取,所以我們使用new StaticInnerClass.Inner()來實例化內部類。 

    2.  非靜態內部類

        非靜態內部類就是在class中定義的類也可以是非靜態的,如下代碼所示: 

public class InnerClass {

    class Inner {
       void print() {
           log.info("Inner class is: " + this);
       }
   }

   public static void main(String[] args) {
       InnerClass.Inner inner = new InnerClass().new Inner();
       inner.print();
   }
}

注意:非靜態內部類要訪問到類的變量,需要實例化外部內,然后再實例化內部類:new InnerClass().new Inner()。 (注:需要使用到兩個new) 

 3.靜態方法內部類

    靜態方法內部類就是在 靜態方法中定義一個類,這個類其實就相當于方法中的變量,這個變量當然不能是static的。如下代碼所示: 

public class StaticMethodInnerClass {
   private static String x = "static x";

   public static void print() {
       class MyInner {
           public void printOuter() {
               log.info("x is " + x);
           }
       }
       MyInner i = new MyInner();
       i.printOuter();
   }

   public static void main(String[] args) {
       StaticMethodInnerClass.print();
   }
}

注意:方法中的類,我們是無法在外部實例化的。 

4. 非靜態方法內部類

    同樣的非靜態方法也可以定義內部類,如下代碼所示:

public class MethodInnerClass {

   private  String x = "non static x";

   public  void print() {
       class MyInner {
           public void printOuter() {
               log.info("x is " + x);
           }
       }
       MyInner i = new MyInner();
       i.printOuter();
   }

   public static void main(String[] args) {
       new MethodInnerClass().print();
   }
}

注意:這里需要先實例化外部類才可以繼續調用。 

5. 匿名內部類

    匿名類是直接在需要的時候實例化的類。匿名類很常見,比如在構建SortedSet的時候,可以傳入自定義的Comparator,我們可以用匿名類來實現,也可以直接使用lambda表達式。如下代碼所示:

public class AnonymousClass {

   public static void main(String[] args) {
       SortedSet sortedSet1 = new ConcurrentSkipListSet(new Comparator(){
           @Override
           public 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{
   @Override
   public Object getKey() {
       return 0;
   }

   @Override
   public Object getValue() {
       return null;
   }

   @Override
   public Object setValue(Object value) {
       return null;
   }
}

感謝各位的閱讀,以上就是“Java有哪些內部類與內部接口”的內容了,經過本文的學習后,相信大家對Java有哪些內部類與內部接口這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是億速云,小編將為大家推送更多相關知識點的文章,歡迎關注!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

亚洲午夜精品一区二区_中文无码日韩欧免_久久香蕉精品视频_欧美主播一区二区三区美女