中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

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

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

Java內部類知識總結

發布時間:2021-09-02 01:47:29 來源:億速云 閱讀:112 作者:chen 欄目:編程語言

本篇內容主要講解“Java內部類知識總結”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強。下面就讓小編來帶大家學習“Java內部類知識總結”吧!

Java內部類

一、 含義

  在Java編程語言里,程序是由類(class)構建而成的。在一個類的內部也可以聲明類,我們把這樣的類叫做內部類。

二、 作用

?實現了更好的封裝,我們知道,普通類(非內部類)的訪問修飾符不能為private或protected,而內部類可以。當我們將內部類聲明為private時,只有外部類可以訪問內部類,很好地隱藏了內部類。
?內部類可以繼承(extends)或實現(implements)其他的類或接口,而不受外部類的影響。
?內部類可以直接訪問外部類的字段和方法,即使是用private修飾的,相反的,外部類不能直接訪問內部類的成員。

三、 原理

  內部類是一個編譯時的概念,編譯后會生成兩個獨立的class文件,如下:

  public class Outer{
    private String outerName = "outer";
    class Inner{
      private String innerName = "inner";
    }
  }

     編譯后的文件如下圖:

 Java內部類知識總結

  編譯后Outer.Inner被重命名為Outer$Inner,句點(.)被替換成了美元符號($)。

四、 分類

  Java內部類可分為成員內部類、局部內部類、匿名內部類、靜態內部類。

  1) 成員內部類

    成員內部類可以看成是外部類的一個成員,在成員內部類中無法聲明靜態成員,但static final字段是個例外。我們知道加載類時,會先初始化靜態成員,如果成員內部類有靜態成員,那么內部類就會在外部類之前生成,而內部類是為外部類服務的,內部類在外部類之前就生成可能會脫離掌控。在實例化成員內部類時,成員內部類會持有一個外部類當前對象的引用,這樣在成員內部類中就可以直接訪問外部類的成員,即使是private修飾的。

    import static java.lang.System.out;
    public class Outer{
    private String outerName = "outer";
    //外部類無法直接訪問內部類的成員,需要實例化內部類對象
    private Inner inner = new Inner(); 
    public class Inner{
       private String innerName = "inner";
      public void show(){
        out.println(outerName); //可以直接訪問外部類的成員
      }
    }
    public void show(){
       out.println(inner.innerName);
      inner.show();
    }
    public static void main(String[] args){
       Outer outer = new Outer();
      outer.show();
      //實例化內部類
      Outer.Inner inner = outer.new Inner();
      inner.show();
    }
  }

  運行結果:

    inner

    outer

    outer

    成員內部類對外部類對象的引用,是通過在this前面加上外部類的名字構成的,這種形式叫作

  限定-this,out.println(outerName)與out.println(Outer.this.outerName)是等價的。

 2)  局部內部類

  局部內部類的使用和成員內部類的使用基本一致,只是局部內部類定義在外部類的方法中,就像局部變量一樣,并不是外部類的成員。局部內部類在方法外是無法訪問到的,但它的實例可以從方法中返回,并且實例在不再被引用之前會一直存在。局部內部類也可以訪問所在方法的局部變量、方法參數等,限制是局部變量或方法參數只有在聲明為final時才能被訪問。  

  import static java.lang.System.out;
  public class Outer{
    private String outerName = "outer";
    public void show(final String str){  //方法參數為final類型
      class Inner{
        public void print(){
          out.println(outerName+str);
        }
      }
      Inner inner = new Inner();
      inner.print();
    }
    public static void main(String[] args){
      Outer outer = new Outer();
      outer.show(":lalala");
    }
  }

  運行結果:

      outer:lalala

3)  匿名內部類

  可以把匿名內部類想象成是沒有類名的局部內部類,匿名內部類有以下特點:

   1、匿名內部類不能有構造器,匿名內部類沒有類名,肯定無法聲明構造器。

   2、匿名內部類必須繼承或實現一個接口,指定給new的類型為匿名類的超類型,匿名類不能有顯示的extends或implements子句,也不能有任何修飾符。

   3、匿名內部類和成員內部類、局部內部類一樣,也不能聲明靜態成員。   

  import static java.lang.System.out;
  public class Outer{
     private String outerName = "outer";
     public void show(final String str){
        new Inner(){  //實現了Inner接口
           public void print(){
              out.println(outerName+str);
           }
        }.print();
     }
     public static void main(String[] args){
         Outer outer = new Outer();
         outer.show(":lalala");
      }
  }
  interface Inner{
      void print();
  }

  運行結果:

      outer:lalala

4) 靜態內部類

  靜態內部類,有的書上也稱為嵌套類,聲明它時需要用static修飾符,靜態內部類不同于前三種內部類,靜態內部類不會持有外部類當前對象的引用,所以在靜態內部類中無法訪問外部類的非靜態成員,可以這么說,靜態內部類不依賴于外部類。 

  import static java.lang.System.out;
  public class Outer{
    private String outerName = "outer";
    private static int id = 123;
    private Inner inner = new Inner();
    public static class Inner{
      public void print1(){
        //out.println(outerName); 無法訪問外部類的非靜態成員
        out.println(id);
      }
      public static void print2(){
        out.println(id);
      }
    }
    public void show(){
      inner.print1();
    }
    public static void main(String[] args){
      Outer outer = new Outer();
      outer.show();
      Outer.Inner.print2(); //直接通過類名訪問靜態內部類
    }
  }

到此,相信大家對“Java內部類知識總結”有了更深的了解,不妨來實際操作一番吧!這里是億速云網站,更多相關內容可以進入相關頻道進行查詢,關注我們,繼續學習!

向AI問一下細節

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

AI

宁安市| 锡林郭勒盟| 临夏市| 渭南市| 同江市| 隆昌县| 涪陵区| 都江堰市| 临夏市| 科技| 田阳县| 石城县| 白山市| 安塞县| 古丈县| 霍州市| 隆子县| 会同县| 抚顺市| 泸溪县| 布尔津县| 老河口市| 静宁县| 麻城市| 恩施市| 布拖县| 若尔盖县| 阿坝县| 马尔康县| 阿坝| 重庆市| 历史| 伊宁县| 马龙县| 定陶县| 宁阳县| 芜湖市| 高台县| 阜南县| 舟曲县| 兴安盟|