java內部類

來源:互聯網
上載者:User

標籤:

1)內部類——一個外部內的內部定義一個類。

2)內部類可以是靜態static 也可以是public default protected 和 private 修飾

注意:內部類只是一種編譯的概念,編譯完成之後與外部內一樣,是兩個不同的類。

3)分類:成員內部類、局部內部類、嵌套內部類、匿名內部類

成員內部類:作為外部類的成員,可以訪問外部類的成員和方法,即使是private的。

  外部類訪問內部類的成員是,需由內部類對象來訪問。

  注意:成員內部類不能含有static的變數和方法。因為成員內部類需要先建立了外部類,才能建立它自己的

  在成員內部類要引用外部類對象時,使用outer.this來表示外部類對象;

  而需要建立內部類對象,可以使用outer.inner  obj = outerobj.new inner();

  1. public class Outer { 
  2.     public static void main(String[] args) { 
  3.         Outer outer = new Outer(); 
  4.         Outer.Inner inner = outer.new Inner(); 
  5.         inner.print("Outer.new"); 
  6.  
  7.         inner = outer.getInner(); 
  8.         inner.print("Outer.get"); 
  9.     } 
  10.  
  11.     // 個人推薦使用getxxx()來擷取成員內部類,尤其是該內部類的建構函式無參數時 
  12.     public Inner getInner() { 
  13.         return new Inner(); 
  14.     } 
  15.  
  16.     public class Inner { 
  17.         public void print(String str) { 
  18.             System.out.println(str); 
  19.         } 
  20.     } 
  21. }

局部內部類:是指內部類定義在方法和範圍內。Thinking in Java給了這麼兩個例子:定義在方法內:

  1. public class Parcel4 { 
  2.     public Destination destination(String s) { 
  3.         class PDestination implements Destination { 
  4.             private String label; 
  5.  
  6.             private PDestination(String whereTo) { 
  7.                 label = whereTo; 
  8.             } 
  9.  
  10.             public String readLabel() { 
  11.                 return label; 
  12.             } 
  13.         } 
  14.         return new PDestination(s); 
  15.     } 
  16.  
  17.     public static void main(String[] args) { 
  18.         Parcel4 p = new Parcel4(); 
  19.         Destination d = p.destination("Tasmania"); 
  20.     } 
  21. }
  1. public class Parcel5 { 
  2.     private void internalTracking(boolean b) { 
  3.         if (b) { 
  4.             class TrackingSlip { 
  5.                 private String id; 
  6.                 TrackingSlip(String s) { 
  7.                     id = s; 
  8.                 } 
  9.                 String getSlip() { 
  10.                     return id; 
  11.                 } 
  12.             } 
  13.             TrackingSlip ts = new TrackingSlip("slip"); 
  14.             String s = ts.getSlip(); 
  15.         } 
  16.     } 
  17.  
  18.     public void track() { 
  19.         internalTracking(true); 
  20.     } 
  21.  
  22.     public static void main(String[] args) { 
  23.         Parcel5 p = new Parcel5(); 
  24.         p.track(); 
  25.     } 
  26. }

 局部內部類也像別的類一樣進行編譯,但只是範圍不同而已,只在該方法或條件的範圍內才能使用,退出這些範圍後無法引用的。

嵌套內部類:嵌套內部類,就是修飾為static的內部類。聲明為static的內部類,不需要內部類對象和外部類對象之間的聯絡,就是說我們可以直接引用outer.inner,即不需要建立外部類,也不需要建立內部類。嵌套類和普通的內部類還有一個區別:普通內部類不能有static資料和static屬性,也不能包含嵌套類,但嵌套類可以。而嵌套類不能聲明為private,一般聲明為public,方便調用。

 

匿名內部類:

 new 父類構造器(參數列表)|實現介面()
 {
  //匿名內部類的類體部分
 }

 

從上面定義可以看出,匿名內部類必須繼承一個父類,或實現一個介面,但最多隻能繼承一個父類,或實現一個介面。
 關於匿名內部類還有如下兩條規則:
 1)匿名內部類不能是抽象類別,因為系統在建立匿名內部類的時候,會立即建立內部類的對象。因此不允許將匿名內部類
 定義成抽象類別。
 2)匿名內部類不等定義構造器,因為匿名內部類沒有類名,所以無法定義構造器,但匿名內部類可以定義執行個體初始化塊,

 

java內部類

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.