1. 程式人生 > 實用技巧 >2020年9月1日 內部類的分類、成員內部類、區域性內部類、匿名內部類

2020年9月1日 內部類的分類、成員內部類、區域性內部類、匿名內部類

/*
* 1、內部類:
* 定義在另外一個類裡面的類,就叫做內部類,為了區別,把外面的類稱為外部類。
*
* 2、分類
* 根據內部類的所在的位置不同:
* (1)成員內部類:外部類中方法外
* (2)區域性內部類:方法體內,(雖然也可以在程式碼塊內,但是不討論這個)
*
*
* 成員內部類:
* (1)有static修飾的:靜態成員內部類,我們通常就簡稱為靜態內部類
* (2)沒有static修飾的:非靜態成員內部類,我們通常就簡稱為成員內部類
* 【修飾符】 class 外部類{
* 【其他修飾符】 static class 靜態內部類{
* }
* 【其他修飾符】 class 非靜態成員內部類{

* }
* }
*
* 【修飾符】 class 外部類 【extends 父類】 【implements 父介面們】{
* 【其他修飾符】 static class 靜態內部類 【extends 父類】 【implements 父介面們】{
* }
* 【其他修飾符】 class 非靜態成員內部類 【extends 父類】 【implements 父介面們】{
* }
* }
* 說明:外部類、內部類的父類、父介面沒有關係,各是各的
*
*
* 區域性內部類:
* (1)有名字的區域性內部類:簡稱區域性內部類
* (2)沒名字的區域性內部類:簡稱匿名內部類

*
* 區域性內部類的語法格式:
* 【修飾符】 class 外部類 【extends 父類】 【implements 父介面們】{
* 【修飾符】 返回值型別 方法名(【形參列表】){
* 【修飾符】 class 有名字的區域性內部類 【extends 父類】 【implements 父介面們】{
* ...
* }
* }
* }
*
* 匿名內部類的語法格式:
* 特殊
*/

7.10.1 匿名內部類

1、語法格式:

//在匿名子類中呼叫父類的無參構造
new 父類(){
內部類的成員列表
}

//在匿名子類中呼叫父類的有參構造
new 父類(實參列表){
內部類的成員列表
}

//介面沒有構造器,那麼這裡表示匿名子類呼叫自己的無參構造,呼叫預設父類Object的無參構造
new 父介面名(){

}

2、匿名內部類、匿名物件的區別?

System.out.println(new Student("張三"));//匿名物件

Student stu = new Student("張三");//這個物件有名字,stu

//既有匿名內部類,又是一個匿名的物件
new Object(){
public void test(){
.....
}
}.test();

//這個匿名內部類的物件,使用obj這個名字引用它,既物件有名字,但是這個Object的子類沒有名字
Object obj = new Object(){
public void test(){
.....
}
};

3、使用的形式

(1)示例程式碼:繼承式

abstract class Father{
public abstract void test();
}
class Test{
public static void main(String[] args){
//用父類與匿名內部類的物件構成多型引用
Father f = new Father(){
public void test(){
System.out.println("用匿名內部類繼承了Father這個抽象類,重寫了test抽象方法")
}
};
f.test();
}
}

(2)示例程式碼:實現式

interface Flyable{
void fly();
}
class Test{
public static void main(String[] args){
//用父介面與匿名內部類的物件構成了多型引用
Flyable f = new Flyable(){
public void fly(){
System.out.println("用匿名內部類實現了Flyable這個介面,重寫了抽象方法");
}
};
f.fly();
}
}

(3)示例程式碼:用匿名內部類的匿名物件直接呼叫方法

new Object(){
public void test(){
System.out.println("用匿名內部類的匿名物件直接呼叫方法")
}
}.test();

(4)示例程式碼:用匿名內部類的匿名物件直接作為實參

Student[] all = new Student[3];
all[0] = new Student("張三",23);
all[1] = new Student("李四",22);
all[2] = new Student("王五",20);

//用匿名內部類的匿名物件直接作為實參
//這個匿名內部類實現了Comparator介面
//這個匿名內部類的物件,是定製比較器的物件
Arrays.sort(all, new Comparator(){
public int compare(Obeject o1, Object o2){
Student s1 = (Student)o1;
Student s2 = (Student)o2;
return s1.getAge() - s2.getAge();
}
});