溫馨提示×

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

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

Java有哪些內(nèi)部類與內(nèi)部接口

發(fā)布時(shí)間:2021-11-02 14:06:10 來源:億速云 閱讀:193 作者:iii 欄目:編程語言

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

一. 內(nèi)部類

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

    1. 靜態(tài)內(nèi)部類

            靜態(tài)內(nèi)部類就是在class內(nèi)部定義一個(gè)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();
   }
}

注意:靜態(tài)內(nèi)部類中因?yàn)閟tatic變量可以直接根據(jù)類名來存取,所以我們使用new StaticInnerClass.Inner()來實(shí)例化內(nèi)部類。 

    2.  非靜態(tài)內(nèi)部類

        非靜態(tài)內(nèi)部類就是在class中定義的類也可以是非靜態(tài)的,如下代碼所示: 

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();
   }
}

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

 3.靜態(tài)方法內(nèi)部類

    靜態(tài)方法內(nèi)部類就是在 靜態(tài)方法中定義一個(gè)類,這個(gè)類其實(shí)就相當(dāng)于方法中的變量,這個(gè)變量當(dāng)然不能是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();
   }
}

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

4. 非靜態(tài)方法內(nèi)部類

    同樣的非靜態(tài)方法也可以定義內(nèi)部類,如下代碼所示:

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();
   }
}

注意:這里需要先實(shí)例化外部類才可以繼續(xù)調(diào)用。 

5. 匿名內(nèi)部類

    匿名類是直接在需要的時(shí)候?qū)嵗念?。匿名類很常見,比如在?gòu)建SortedSet的時(shí)候,可以傳入自定義的Comparator,我們可以用匿名類來實(shí)現(xiàn),也可以直接使用lambda表達(dá)式。如下代碼所示:

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);
   }
}

二. 內(nèi)部接口

    Inner Interface是指在接口中定義的接口。我們最常見的就是Map中的Entry了: 

public interface Map<K, V> {
   interface Entry<K, V> {
       K getKey();
   } }

    這里的內(nèi)部接口一定是static的,因?yàn)榻涌谑遣荒軐?shí)例化的,所以為了訪問到接口中的接口,必須定義為static。如果不指定,則默認(rèn)就是static。

下面就來看看一個(gè)該內(nèi)部接口的實(shí)現(xiàn),如下代碼所示:

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有哪些內(nèi)部類與內(nèi)部接口”的內(nèi)容了,經(jīng)過本文的學(xué)習(xí)后,相信大家對(duì)Java有哪些內(nèi)部類與內(nèi)部接口這一問題有了更深刻的體會(huì),具體使用情況還需要大家實(shí)踐驗(yàn)證。這里是億速云,小編將為大家推送更多相關(guān)知識(shí)點(diǎn)的文章,歡迎關(guān)注!

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI