1. 程式人生 > 實用技巧 >內部類之匿名內部類

內部類之匿名內部類

  • 內部類識別符號:
      每個類會產生一個.class檔案,檔名即為類名。同樣,內部類也會產生一個.class檔案,但是它的名稱卻不是內部類的類名,而是有著嚴格限制:外圍類的名字,加上$,再加上內部類名字

  • 匿名內部類
      也就是沒有名字的內部類,其名稱由Java編譯器給出,一般是形如:外部類名稱+$+匿名類順序,沒有名稱也就是其他地方就不能引用,不能例項化,只用一次,當然也就不能有構造器。它通常用來簡化程式碼編寫

  • 匿名內部的建立格式:
new 父類構造器(引數列表)|實現介面()
{
    //匿名內部類的類體部分
}

  • 匿名類分類
      匿名類由於是一個new的結果,所以其實可以賦值給一個父類物件。因此可以分為兩種匿名類,成員匿名類和區域性匿名類(作為函式引數)。

  • 使用匿名內部類前提條件
      必須繼承一個父類或實現一個介面當然也僅能只繼承一個父類或者實現介面。同時它也是沒有class關鍵字,這是因為匿名內部類是直接使用new來生成一個物件的引用。當然這個引用是隱式

  • 匿名內部類使用的注意事項
      1、使用匿名內部類時,我們必須是繼承一個類或者實現一個介面,但是兩者不可兼得,同時也只能繼承一個類或者實現一個介面。同時要實現父類或介面中所有抽象方法,可以改寫父類中的方法,新增自定義方法。
       2、匿名內部類因為沒有類名,可知匿名內部類中是不能定義建構函式的。
       3、匿名內部類中不能存在任何的靜態成員變數和靜態方法。
       4、匿名內部類為區域性內部類,所以區域性內部類的所有限制同樣對匿名內類生效。
       5、因為在建立匿名內部類的時候,會立即建立它的例項,匿名內部類不能是抽象的,它必須要實現繼承的類或者實現介面的類的所有抽象方法。
       6、匿名內部類和外部類有同名變數方法)時,預設訪問的是匿名內部類的變數(方法),要訪問外部類的變數(方法)則需要加上外部類的類名。匿名內部類訪問外部類成員變數或成員方法必須用static修飾

  • 匿名內部類的使用

package com.vg.demo04;

//不使用匿名內部類來實現抽象方法
	abstract class Person{
		public abstract void eat();
	}
	
	class Child extends Person{
		public void eat() {
			System.out.println("eat something");
		}
	}
public class TestDemoniming {
	
	public static void main(String[] args) {
		Person p = new Child();
		p.eat();

	}

}
package com.vg.demo04;

//匿名內部類的基本實現
	abstract class Person{
		public abstract void eat();
	}
	
	
public class TestDemoniming {
	
	public static void main(String[] args) {
		Person p = new Person() {
			public void eat() {
				System.out.println("eat something");
			}
		};
		p.eat();

	}

}
package com.vg.demo04;

//在介面上使用匿名內部類
	interface Person{
		public abstract void eat();
	}
	
	
public class TestDemoniming {
	
	public static void main(String[] args) {
		Person p = new Person() {
			public void eat() {
				System.out.println("eat something");
			}
		};
		p.eat();

	}

}
package com.vg.demo04;

//Thread類的匿名內部類實現	
public class TestDemoniming {
	
	public static void main(String[] args) {
		Thread t = new Thread() {
			public void run () {
				for(int i = 1;i<=5;i++) {
					System.out.println(i+" ");
				}
			}
		};
		t.start();
	}

}
package com.vg.demo04;

//Runnable介面的匿名內部類實現	
public class TestDemoniming {
	
	public static void main(String[] args) {
		Runnable r = new Runnable() {
			public void run () {
				for(int i = 1;i<=5;i++) {
					System.out.println(i+" ");
				}
			}
		};
		Thread t = new Thread(r);
		t.start();
	}

}