內部類的分類
內部類主要分爲成員內部類、局部內部類、匿名內部類
其中成員內部類又廢物非靜態內部類和靜態內部類
成員內部類可用private public protected default修飾符進行修飾
.
非靜態內部類
public class TestInnerClass {
public static void main(String[] args) {
//創建內部類對象時先創建外部類對象 內部類對象依託於外部類對象存在的
Outer.Inner oInner = new Outer().new Inner();
oInner.show();
}
}
//外部類的靜態方法、代碼塊不能訪問非靜態內部類並且不能使用非靜態內部類定義變量創建實例
class Outer{ //外部類 普通類
private int age = 18; //外部類成員變量
public void testOuter(){ //普通方法
System.out.println("outer");
}
/*非靜態內部類必須即存在一個外部類對象裏
非靜態內部類的對象販毒屬於外部類的某個對象
內部類可以直接訪問外部類的成員
雖然是內部類但是編譯時生成兩個不同的class文件
非靜態內部類不能有靜態方法、屬性、初始化塊
*/
class Inner{ //成員內部類 ( 非靜態內部類 )
int age = 20; //內部類成員變量
public void show(){
int age = 23; //方法中的局部變量
System.out.println("訪問外部類的成員變量" + Outer.this.age);
System.out.println("訪問內部類的成員變量" + this.age);
System.out.println("訪問局部變量" + age);
}
}
}
.
靜態內部類
用static修飾的內部類 可以將靜態內部類看作是外部類的靜態成員
與非靜態內部類不同,靜態內部類對象存在並不一定存在對應的外部類對象
靜態內部類的實例方法不能直接訪問外部類的實例方法
public class TestStaticClass {
public static void main(String[] args) {
Outer1.Inner oInner = new Outer1.Inner(); //創建內部類對象 靜態內部類不依託於外部對象
oInner.show();
}
}
class Outer1{
static class Inner{ //相當於外部類的一個靜態成員變量
public void run(){
System.out.println("靜態內部類中的方法");
}
public static void show(){
System.out.println("靜態內部類中的靜態方法");
}
}
}
.
匿名內部類
匿名內部類只適合只需要使用一次的類
匿名內部類沒有訪問修飾符、沒有類名,不可以構造函數和創建對象
public class TestAnonymousInnerClass {
public static void test(Man wang) {
wang.speak();
}
public static void main(String[] args) {
TestAnonymousInnerClass.test(new Man(){
//匿名內部類定義好的對象傳給test方法中的wang然後在調用裏面的speak方法
@Override
public void speak() {
System.out.println("匿名內部類");
}
});
}
}
interface Man{
void speak();
}
.
局部內部類
局部內部類是一種定義在方法內部的類,作用域只限於本方法
局部內部類編譯時也產生兩個不同的class文件
public class TestPartInnerClass {
public void people() {
//作用域僅限於該方法
class Inner {
public void look() {
System.out.println("I see ..");
}
}
new Inner().look();
}
public void main(String[] args) {
new TestPartInnerClass().people();
}
}