匿名內部類
[toc]
匿名內部類也就是沒有名字的內部類
正因爲沒有名字,所以匿名內部類只能使用一次
匿名內部類只能使用一次?
匿名內部類只能使用一次?
看下面代碼:
A2 a2 = new A2() {
@Override
public void sayName() {
System.out.println("來自匿名內部類2,我實現了抽象類A2");
}
};
a2.sayName();
這裏的匿名內部類繼承自類A2,所以可以向上轉型(上溯造型),所以用父類A2的引用指向這個匿名內部類。這個過程只能有一次,如果再有:
A2 a3 = new A2() {
@Override
public void sayName() {
System.out.println("來自匿名內部類2,我實現了抽象類A2");
}
};
縱使這兩個匿名內部類內部的結構一模一樣,仍然是兩個不同的匿名內部類。但是父類的引用a2和a3的方法可以執行無數次。
java裏對匿名內部類的規定:
- 首先,要遵循Java對局部內部類的規定;
Java對局部內部類的規定?
1.不能使用訪問修飾符public、private、protected等修飾這個類;
2.類裏面不能包含靜態信息,即不能有使用static修飾的變量和方法;
3.可以訪問外部類的任何信息;
4.可以訪問局部裏的final變量;
5.只能在該局部使用,即外部類或其他類不能訪問這個類。
-
其次,使用匿名內部類時必須是繼承一個類或者實現一個接口,但是兩者不可兼得,只能繼承一個類或者實現一個接口;
-
不能包含構造函數;
-
匿名內部類不能是抽象類,因爲它是要繼承類或實現接口的類;
-
匿名內部類裏面可以有自己定義的方法。
使用格式:
new 類名/接口名(){
};//因爲是局部的,所以這裏別忘了分號。
具體的例子:
//類A1
class A1 {
public void sayName() {
System.out.println("我是A1的sayName方法");
}
}
//抽象類A2
abstract class A2 {
public abstract void sayName();
}
//接口B1
interface B1 {
public abstract void sayName();
}
//公共類Test
public class Test {
public static void main(String[] args) {
1.匿名內部類繼承一個普通類
A1 a1 = new A1() {
public void sayName() {
System.out.println("來自匿名內部類1,我重寫了A1的sayName方法");
sayAge();
};
public void sayAge() {
System.out.println("來自匿名內部類1,這是我自定義的方法sayAge,我的年齡是10歲");
}
};
a1.sayName();
2.匿名內部類繼承抽象類
//(要實現這個抽象類的所有抽象方法)
A2 a2 = new A2() {
@Override
public void sayName() {
System.out.println("來自匿名內部類2,我繼承了抽象類A2");
}
};
a2.sayName();
3.匿名內部類實現一個接口
//(要實現這個接口的所有抽象方法)
B1 b1 = new B1() {
@Override
public void sayName() {
System.out.println("來自匿名內部類3,我實現了接口B1");
}
};
b1.sayName();
}
}
例子的全部代碼:
package com.cn.Java;
//類A1
class A1 {
public void sayName() {
System.out.println("我是A1的sayName方法");
}
}
//抽象類A2
abstract class A2 {
public abstract void sayName();
}
//接口B1
interface B1 {
public abstract void sayName();
}
//公共類Test
public class Test {
public static void main(String[] args) {
A1 a1 = new A1() {
public void sayName() {
System.out.println("來自匿名內部類1,我重寫了A1的sayName方法");
sayAge();
};
public void sayAge() {
System.out.println("來自匿名內部類1,這是我自定義的方法sayAge,我的年齡是10歲");
}
};
a1.sayName();
A2 a2 = new A2() {
@Override
public void sayName() {
System.out.println("來自匿名內部類2,我繼承了抽象類A2");
}
};
a2.sayName();
B1 b1 = new B1() {
@Override
public void sayName() {
System.out.println("來自匿名內部類3,我實現了接口B1");
}
};
b1.sayName();
}
}
運行結果:
來自匿名內部類1,我重寫了A1的sayName方法
來自匿名內部類1,這是我自定義的方法sayAge,我的年齡是10歲
來自匿名內部類2,我繼承了抽象類A2
來自匿名內部類3,我實現了接口B1