最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

深入解析Java中的內部類

 更新時間:2015年07月29日 09:49:34   作者:低調小一  
這篇文章主要介紹了Java中的內部類,是Java入門學習中的基礎知識,需要的朋友可以參考下

概述

最近學習python,發(fā)現(xiàn)python是支持多繼承的,這讓我想起Java是通過內部類實現(xiàn)的這套機制。這篇文章不是講如何通過內部類實現(xiàn)多繼承,而是總結一下內部類的類型和使用方法。

Java內部類分為:

  •     非靜態(tài)內部類
  •     靜態(tài)內部類
  •     局部內部類
  •     匿名內部類

內部類在Android源碼中被大量的使用,先介紹一下這四種內部類的共同點:

  •     內部類仍然是一個獨立的類,在編譯之后內部類會被編譯成獨立的.class文件,但是前面冠以外部類的類名和$符號。
  •     內部類不能用普通的方式訪問。內部類是外部類的一個成員,因為內部類可以自由的訪問外部類的成員,包括private成員。
  •     內部類聲明為靜態(tài)的,就不能隨意的訪問外部類的成員變量了,此時內部類只能訪問到外部類的靜態(tài)成員變量。

接下來,分別介紹一下這幾種內部類。
非靜態(tài)內部類

當一個類作為另一個類的非靜態(tài)成員時,則這個類就是一個非靜態(tài)內部類。
創(chuàng)建非靜態(tài)內部類的示例代碼如下:

class OutClass {
 class InnerClass {}
}

當我們用javac去編譯的時候,發(fā)現(xiàn)生成了兩個.class文件:OutClass.class和OutClass$InnerClass.class。如下圖所示:

201572994546125.jpg (603×85)

從外部類的非靜態(tài)方法中實例化內部類

在外部類中訪問內部類是很容易的,直接創(chuàng)建內部類對象,然后通過對象實例調用類內的方法即可。示例代碼如下:

public class OutClass {
 private static int a = 0;

 public void makeInner() {
  InnerClass inClass = new InnerClass();
  inClass.seeOuter();
 }

 public static void main(String[] args) {
  OutClass oClass = new OutClass();
  oClass.makeInner();
 }

 class InnerClass {
  public void seeOuter() {
   System.out.println(a);
   a++;
  }
 }
}


運行結果如下:
0

從外部類的靜態(tài)方法中實例化內部類

在外部類中訪問內部類是比較簡單的,可以直接new出內部類對象,但是如果想在外部類的外部使用內部類,接不能直接new內部類名的方式了,而是需要如下方式:

OutClass.InnerClass innerClass = new OutClass().new InnerClass();

也就是說,在外部調用非靜態(tài)內部類,需要先實例化外部類,然后通過外部類對象再去實例化內部類。示例代碼如下:

public class OutClass {
 private static int a = 0;

 public void makeInner() {
  InnerClass inClass = new InnerClass();
  inClass.seeOuter();
 }

 public static void main(String[] args) {
  OutClass oClass = new OutClass();
  oClass.makeInner();

  OutClass.InnerClass innerClass = new OutClass().new InnerClass();
  innerClass.seeOuter();
 }

 class InnerClass {
  public void seeOuter() {
   System.out.println(a);
   a++;
  }
 }
}

運行結果:

0
1

內部類的this引用

普通的類可以使用this引用當前的對象,內部類也是如此。但是假若內部類想引用外部類當前的對象呢?可以使用如下方式:

外部類名.this

示例代碼如下:

public class OutClass {
 private static int a = 0;

 public void makeInner() {
  InnerClass inClass = new InnerClass();
  inClass.seeOuter();
 }

 public static void main(String[] args) {
  OutClass oClass = new OutClass();
  oClass.makeInner();

  OutClass.InnerClass innerClass = new OutClass().new InnerClass();
  innerClass.seeOuter();
 }

 class InnerClass {
  public void seeOuter() {
   System.out.println(this);
   System.out.println(OutClass.this);
  }
 }
}


靜態(tài)內部類

上面介紹了非靜態(tài)內部類,接下來我們學習神馬是靜態(tài)內部類。

靜態(tài)內部類就是在外部類中扮演一個靜態(tài)成員的角色,創(chuàng)建靜態(tài)內部類和創(chuàng)建非靜態(tài)內部類的形式很相似,只是class前面多了一個static修飾符。

    注意,外部類是不可能使用static修飾符進行修飾的。

示例代碼如下:

class OutClass {
 static class InnerClass {
 }
}


用javac命令編譯一下,可以看到一樣都是有兩個.class文件,如下圖所示:

201572994701880.jpg (583×69)

從外部類的非靜態(tài)方法中實例化靜態(tài)內部類

從外部類中訪問靜態(tài)內部類,和在外部類中訪問非靜態(tài)內部類是一樣的。但是,需要注意一點,此時靜態(tài)內部類只能訪問外部類的靜態(tài)成員,無法訪問非靜態(tài)成員了。

示例代碼如下:

public class OutClass {
 private static int a = 0;
 private int b = 1;

 public void makeInner() {
  InnerClass inClass = new InnerClass();
  inClass.seeOuter();
 }

 public static void main(String[] args) {
  OutClass oClass = new OutClass();
  oClass.makeInner();

 }

 static class InnerClass {
  public void seeOuter() {
   System.out.println(this);
   System.out.println(a);
   // System.out.println(b);
  }
 }
}


執(zhí)行結果如下:

OutClass$InnerClass@79a340
0


從外部類靜態(tài)方法中實例化靜態(tài)內部類

    注意:
    因為靜態(tài)內部類是外部類的靜態(tài)成員,而靜態(tài)成員是跟類綁定,而不是跟類實例化的對象綁定。所以,在外部類的靜態(tài)方法中實例化內部類,是不需要先實例化外部類的。

示例代碼如下:

public class OutClass {
 private static int a = 0;
 private int b = 1;

 public void makeInner() {
  InnerClass inClass = new InnerClass();
  inClass.seeOuter();
 }

 public static void main(String[] args) {
  OutClass oClass = new OutClass();
  oClass.makeInner();

  OutClass.InnerClass inClass = new OutClass.InnerClass();
  inClass.seeOuter();
 }

 static class InnerClass {
  public void seeOuter() {
   System.out.println(this);
   System.out.println(a);
   // System.out.println(b);
  }
 }
}

匿名內部類

匿名內部類在Android應用開發(fā)中簡直是泛濫,各種listener對象的實現(xiàn)很多都是通過匿名內部類。

匿名內部類從名字上就可以知道這是代表沒有類名的內部類,通常用來簡化代碼。

相信寫Java的同學都使用過線程,那Thread的時候我們可以傳一個Runnable對象,也可以傳一個匿名內部類。示例代碼如下:

public class OutClass {
 public void testAnonymousClass() {
  Thread t = new Thread(new Runnable() {

   @Override
   public void run() {
    for (int i = 0; i < 10; i ++) {
     System.out.println(i);
     try {
      Thread.sleep(500);
     } catch (InterruptedException e) {
      e.printStackTrace();
     }
    }
   }
  });
  t.start();

  System.out.println("another thread is running...");
 }

 public static void main(String[] args) {
  OutClass oClass = new OutClass();
  oClass.testAnonymousClass();
 }
}

執(zhí)行結果如下:

another thread is running...

相關文章

最新評論

安阳县| 拉萨市| 门源| 开鲁县| 勐海县| 洛阳市| 福州市| 成都市| 鲜城| 新余市| 旬邑县| 塔城市| 巴林左旗| 会东县| 达日县| 额尔古纳市| 大田县| 黄山市| 镇宁| 灵石县| 敦煌市| 红原县| 临颍县| 化德县| 称多县| 荥阳市| 广灵县| 合作市| 永康市| 铜陵市| 六枝特区| 盐源县| 大厂| 镇雄县| 彰武县| 江达县| 海宁市| 灵丘县| 松溪县| 九寨沟县| 天气|