匿名內部類

匿名內部類

[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
發佈了30 篇原創文章 · 獲贊 0 · 訪問量 449
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章