嵌套類與內部類在java中使用的很普遍,爲了不難以理解,這裏用了幾個小例子,說明它的用法。java
嵌套類與內部類的結構以下圖安全
靜態嵌套類,是一種在類以外聲明的嵌套類,因爲是靜態的,因此不通過初始化,就能夠經過類名,直接調用。ide
1 class out1{ 2 private static String name = "xingoo"; 3 static class info{ 4 void print(){ 5 System.out.println("name:"+name); 6 } 7 } 8 }
使用樣例函數
package testClass; class out1{ private static String name = "xingoo"; static class info{ void print(){ System.out.println("name:"+name); } } } class out2{ private static String name = "xingoo test 2"; static class info{ String name = "inner infomation!"; void printInner(){ System.out.println("name:"+name); } void printOuter(){ System.out.println("name:"+out2.name); } } } /** * 靜態嵌套類 * @author xingoo * */ public class test1 { public static void main(String[] args){ //建立對象時,以xxx.yyy這種格式建立 out1.info oi = new out1.info(); oi.print(); out2.info oi2 = new out2.info(); oi2.printInner(); oi2.printOuter(); } }
成員內部類,即該類做爲另外一個類的成員,所以只有引用另外一個類,才能建立這個類。測試
1 class outer{ 2 private String name = "xingoo"; 3 class inner{ 4 void print(){ 5 System.out.println(name); 6 } 7 } 8 }
一般也用於隱藏的實現某個接口,以下面所示,第一種是傳統的實現方式,第二種是隱藏了實現接口的實現方式。spa
1 interface Printer{ 2 void print(String name); 3 } 4 class outerImpl1 implements Printer{ 5 @Override 6 public void print(String name) { 7 System.out.println(name); 8 } 9 } 10 class outerImpl2{ 11 private class inner implements Printer{ 12 @Override 13 public void print(String name) { 14 System.out.println(name); 15 } 16 } 17 public Printer getPrinter(){ 18 return new inner(); 19 } 20 }
使用樣例設計
package testClass; /** * 簡單測試成員內部類 * @author xingoo * */ class outer{ private String name = "xingoo"; class inner{ void print(){ System.out.println(name); } } } interface Printer{ void print(String name); } class outerImpl1 implements Printer{ @Override public void print(String name) { System.out.println(name); } } class outerImpl2{ private class inner implements Printer{ @Override public void print(String name) { System.out.println(name); } } public Printer getPrinter(){ return new inner(); } } /** * 成員內部類 * @author xingoo * */ public class test2 { public static void main(String[] args){ //建立一個外部類的對象,經過調用這個對象的new方法建立其內部類的對象 outer o = new outer(); outer.inner i = o.new inner(); i.print(); //內部類實現接口隱藏 Printer out1 = new outerImpl1(); out1.print("xingoo test1"); outerImpl1 out1trans = (outerImpl1)out1;//支持向下轉換 Printer out2 = (new outerImpl2()).getPrinter(); out2.print("xingoo test2"); //沒法向下轉換,由於inner是private類型的,這樣就實現了接口的隱藏 } }
局部類的聲明之做用與某個代碼塊內,所以若是某個聲明的類僅僅被一段程序所使用,其餘地方再也用不到,就能夠用這種實現方式。·code
1 interface Logger{ 2 public void log(String message); 3 } 4 public class test3 { 5 6 String startTime = (new Date()).toString(); 7 /** 8 * 局部內部類,從定義上來說,不屬於任何其餘的類,由於是聲明在這個類內部的。與匿名內部類不一樣的就是它有名字。 9 * @return 10 */ 11 public Logger getLogger(){ 12 //因爲LoggerImpl只在 getLogger內部使用,所以把它定義在函數內部,相對來講更安全一些 13 class LoggerImpl implements Logger{ 14 @Override 15 public void log(String message) { 16 System.out.println(startTime + ":" + message); 17 } 18 } 19 return new LoggerImpl(); 20 } 21 22 public static void main(String[] args){ 23 test3 test = new test3(); 24 Logger logger = test.getLogger(); 25 logger.log("hello xingoo!"); 26 } 27 }
在使用new建立對象時,直接在後面建立它的實現類。對象
1 abstract class Printable{ 2 public void print(String name){ 3 4 } 5 } 6 /** 7 * 就是跟在new建立對象以後,直接定義它的類實現 8 * @author Administrator 9 */ 10 public class test4 { 11 public static void main(String[] args){ 12 Printable printer = new Printable(){ 13 public void print(String name){ 14 System.out.println(name); 15 } 16 };//注意由於這實際上是一個new語法,所以要加上分號; 17 printer.print("hello!xingoo!"); 18 } 19 }
參考資料:《JAVA 7程序設計》blog