【java開發系列】—— 嵌套類與內部類

 

嵌套類與內部類在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(); } }
View Code

  成員內部類

  成員內部類,即該類做爲另外一個類的成員,所以只有引用另外一個類,才能建立這個類。測試

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類型的,這樣就實現了接口的隱藏
 } }
View Code

  局部內部類

  局部類的聲明之做用與某個代碼塊內,所以若是某個聲明的類僅僅被一段程序所使用,其餘地方再也用不到,就能夠用這種實現方式。·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

相關文章
相關標籤/搜索