程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> 關於JAVA >> 深刻解析Java中的外部類

深刻解析Java中的外部類

編輯:關於JAVA

深刻解析Java中的外部類。本站提示廣大學習愛好者:(深刻解析Java中的外部類)文章只能為提供參考,不一定能成為您想要的結果。以下是深刻解析Java中的外部類正文


概述

比來進修python,發明python是支撐多繼續的,這讓我想起Java是經由過程外部類完成的這套機制。這篇文章不是講若何經由過程外部類完成多繼續,而是總結一下外部類的類型和應用辦法。

Java外部類分為:

  •     非靜態外部類
  •     靜態外部類
  •     部分外部類
  •     匿名外部類

外部類在Android源碼中被年夜量的應用,先引見一下這四種外部類的配合點:

  •     外部類依然是一個自力的類,在編譯以後外部類會被編譯成自力的.class文件,然則後面冠之外部類的類名和$符號。
  •     外部類不克不及用通俗的方法拜訪。外部類是內部類的一個成員,由於外部類可以自在的拜訪內部類的成員,包含private成員。
  •     外部類聲明為靜態的,就不克不及隨便的拜訪內部類的成員變量了,此時外部類只能拜訪到內部類的靜態成員變量。

接上去,分離引見一下這幾種外部類。
非靜態外部類

當一個類作為另外一個類的非靜態成員時,則這個類就是一個非靜態外部類。
創立非靜態外部類的示例代碼以下:

class OutClass {
 class InnerClass {}
}

當我們用javac去編譯的時刻,發明生成了兩個.class文件:OutClass.class和OutClass$InnerClass.class。以下圖所示:

從內部類的非靜態辦法中實例化外部類

在內部類中拜訪外部類是很輕易的,直接創立外部類對象,然後經由過程對象實例挪用類內的辦法便可。示例代碼以下:

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

從內部類的靜態辦法中實例化外部類

在內部類中拜訪外部類是比擬簡略的,可以直接new出外部類對象,然則假如想在內部類的內部應用外部類,接不克不及直接new外部類名的方法了,而是須要以下方法:

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

也就是說,在內部挪用非靜態外部類,須要先實例化內部類,然後經由過程內部類對象再去實例化外部類。示例代碼以下:

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


靜態外部類

下面引見了非靜態外部類,接上去我們進修神馬是靜態外部類。

靜態外部類就是在內部類中飾演一個靜態成員的腳色,創立靜態外部類和創立非靜態外部類的情勢很類似,只是class後面多了一個static潤飾符。

    留意,內部類是弗成能應用static潤飾符停止潤飾的。

示例代碼以下:

class OutClass {
 static class InnerClass {
 }
}


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

從內部類的非靜態辦法中實例化靜態外部類

從內部類中拜訪靜態外部類,和在內部類中拜訪非靜態外部類是一樣的。然則,須要留意一點,此時靜態外部類只能拜訪內部類的靜態成員,沒法拜訪非靜態成員了。

示例代碼以下:

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


履行成果以下:

OutClass$InnerClass@79a340
0


從內部類靜態辦法中實例化靜態外部類

    留意:
    由於靜態外部類是內部類的靜態成員,而靜態成員是跟類綁定,而不是跟類實例化的對象綁定。所以,在內部類的靜態辦法中實例化外部類,是不須要先實例化內部類的。

示例代碼以下:

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運用開辟中的確是眾多,各類listener對象的完成許多都是經由過程匿名外部類。

匿名外部類從名字上便可以曉得這是代表沒有類名的外部類,平日用來簡化代碼。

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

履行成果以下:

another thread is running...

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved