深刻解析Java中的外部類。本站提示廣大學習愛好者:(深刻解析Java中的外部類)文章只能為提供參考,不一定能成為您想要的結果。以下是深刻解析Java中的外部類正文
概述
比來進修python,發明python是支撐多繼續的,這讓我想起Java是經由過程外部類完成的這套機制。這篇文章不是講若何經由過程外部類完成多繼續,而是總結一下外部類的類型和應用辦法。
Java外部類分為:
外部類在Android源碼中被年夜量的應用,先引見一下這四種外部類的配合點:
接上去,分離引見一下這幾種外部類。
非靜態外部類
當一個類作為另外一個類的非靜態成員時,則這個類就是一個非靜態外部類。
創立非靜態外部類的示例代碼以下:
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...