一、內部類的分類:
1、靜態內部類
2、非靜態內部類
1)、成員內部類
2)、方法內部類:在外部類的方法或者代碼塊中定義內部類
3)、匿名內部類
注意:1、內部類任然是一個獨立的類,編譯形成.class文件,只是在前面加上
外部類名和$符號。
2、內部類也可以使用修飾符:private、protected、default、public
3、內部類的定義大多數情況下僅僅是爲了讓外部類使用。
4、匿名內部類多數情況下放在方法裏面,因此它既是匿名內部類,又是方法內部類。
二:靜態內部類:
1、靜態內部類中可以包含靜態的內部成員,也可以包含非靜態的內部成員。
2、靜態內部類可以直接調用外類的靜態屬性和方法,但不能調用非靜態的屬性和方法。
3、再不相關的類中可以直接創建靜態內部類的對象,無需經過外部類。
4、靜態內部類實際上和外部類聯繫很少,只是在命名空間上的聯繫。
5、成員內部類的創建方式:
1)Outer.Inner in = new Outer.Inner();
2)Inner in = new Inner()
建議採用第一種方式。
三:成員內部類:
1、成員內部類就像是外部類的一個屬性一樣
2、成員內部類可以訪問外部類的所有成員(包括private型)
3、成員內部類中的this指的是內部類的對象,獲得外部類對象:外部類名+.this
4、成員內部類不能有靜態成員(除非聲明爲final常量)
final static int d = 80;// 可以
final static Date d2 = new Date();// 不可以
5、成員內部類綁定到外部類上,要利用內部類,先要獲得內部類。
6、成員內部類的創建方式:
Outer outer = new Outer;
Outer.Inner inner = Outer.new Inner();
上面也可以直接寫爲:Outer.Inner inner = new Outer().new Inner();
四:方法內部類:
1、方法內部類的地位與方法內部的局部變量類似,因此不能修飾局部變量的修飾符也不能修飾
方法內部類,如:public、private、protected、static、transient
2、方法內部類只能在聲明的方法內可見,因此定義局部內部類後,想用的話要在方法內直接
實例化,記住這裏順序一定不能反,先聲明,後使用。
3、方法內部類不能訪問定義它的方法內的局部變量,除非這個變量被定義爲final。
本質原因:局部變量和方法內部類生命週期不一致所致。
4、方法內部類只能包含非靜態成員。
五:匿名內部類:
根據聲明的位置,判斷匿名內部類是成員內部類還是方法內部內。
注:一般是方法內部類,這就具備了方法內部類的特性。
匿名內部類只能使用一次。
三種使用方式:
1、繼承式
2、接口式
3、參數式
關於匿名內部類的代碼實例:
package com.chen.Anonymous_Inner_Class;
/**
* 測試匿名內部類
* 1、繼承式
* 2、接口式
* 3、參數式
* @author Administrator
*
*/
public class Test {
public static void main(String[] args) {
Outer05 outer = new Outer05();
outer.test();
// 3、參數式
outer.test02(new Car() {
@Override
public void run() {
System.out.println("我的車再跑!");
}
});
}
}
class Outer05 {
// 2、接口式
Runnable runnable = new Runnable(){
@Override
public void run() {
// TODO Auto-generated method stub
}
};
// 1、繼承式
public void test() {
Car car = new Car(){
@Override
public void run() {
System.out.println("子類的汽車再跑!");
}
};
car.run();
}
// 3、參數式
public void test02(Car car) {
car.run();
}
}
class Car {
public void run() {
System.out.println("汽車再跑!");
}
}