標籤:
1)內部類——一個外部內的內部定義一個類。
2)內部類可以是靜態static 也可以是public default protected 和 private 修飾
注意:內部類只是一種編譯的概念,編譯完成之後與外部內一樣,是兩個不同的類。
3)分類:成員內部類、局部內部類、嵌套內部類、匿名內部類
成員內部類:作為外部類的成員,可以訪問外部類的成員和方法,即使是private的。
外部類訪問內部類的成員是,需由內部類對象來訪問。
注意:成員內部類不能含有static的變數和方法。因為成員內部類需要先建立了外部類,才能建立它自己的,
在成員內部類要引用外部類對象時,使用outer.this來表示外部類對象;
而需要建立內部類對象,可以使用outer.inner obj = outerobj.new inner();
- public class Outer {
- public static void main(String[] args) {
- Outer outer = new Outer();
- Outer.Inner inner = outer.new Inner();
- inner.print("Outer.new");
-
- inner = outer.getInner();
- inner.print("Outer.get");
- }
-
- // 個人推薦使用getxxx()來擷取成員內部類,尤其是該內部類的建構函式無參數時
- public Inner getInner() {
- return new Inner();
- }
-
- public class Inner {
- public void print(String str) {
- System.out.println(str);
- }
- }
- }
局部內部類:是指內部類定義在方法和範圍內。Thinking in Java給了這麼兩個例子:定義在方法內:
- public class Parcel4 {
- public Destination destination(String s) {
- class PDestination implements Destination {
- private String label;
-
- private PDestination(String whereTo) {
- label = whereTo;
- }
-
- public String readLabel() {
- return label;
- }
- }
- return new PDestination(s);
- }
-
- public static void main(String[] args) {
- Parcel4 p = new Parcel4();
- Destination d = p.destination("Tasmania");
- }
- }
- public class Parcel5 {
- private void internalTracking(boolean b) {
- if (b) {
- class TrackingSlip {
- private String id;
- TrackingSlip(String s) {
- id = s;
- }
- String getSlip() {
- return id;
- }
- }
- TrackingSlip ts = new TrackingSlip("slip");
- String s = ts.getSlip();
- }
- }
-
- public void track() {
- internalTracking(true);
- }
-
- public static void main(String[] args) {
- Parcel5 p = new Parcel5();
- p.track();
- }
- }
局部內部類也像別的類一樣進行編譯,但只是範圍不同而已,只在該方法或條件的範圍內才能使用,退出這些範圍後無法引用的。
嵌套內部類:嵌套內部類,就是修飾為static的內部類。聲明為static的內部類,不需要內部類對象和外部類對象之間的聯絡,就是說我們可以直接引用outer.inner,即不需要建立外部類,也不需要建立內部類。嵌套類和普通的內部類還有一個區別:普通內部類不能有static資料和static屬性,也不能包含嵌套類,但嵌套類可以。而嵌套類不能聲明為private,一般聲明為public,方便調用。
匿名內部類:
new 父類構造器(參數列表)|實現介面()
{
//匿名內部類的類體部分
}
從上面定義可以看出,匿名內部類必須繼承一個父類,或實現一個介面,但最多隻能繼承一個父類,或實現一個介面。
關於匿名內部類還有如下兩條規則:
1)匿名內部類不能是抽象類別,因為系統在建立匿名內部類的時候,會立即建立內部類的對象。因此不允許將匿名內部類
定義成抽象類別。
2)匿名內部類不等定義構造器,因為匿名內部類沒有類名,所以無法定義構造器,但匿名內部類可以定義執行個體初始化塊,
java內部類