java內部類之成員內部類之匿名內部類

biubiubiuo發表於2018-02-21

匿名內部類特點:
1.匿名內部類是沒有名稱的內部類,沒辦法引用它們。必須在建立時,作為new語句的一部分來宣告並建立它們的例項。
2.匿名內部類必須繼承一個類(抽象的、非抽象的都可以)或者實現一個介面。如果父類(或者父介面)是抽象類,則匿名抽象類
必須實現其所有抽象方法。
3.匿名內部類中可以定義程式碼塊,用於例項的初始化,但是不能定義靜態程式碼塊。

匿名內部類語句:
new interface/superclass(){//類體}
這種形式的new語句宣告一個新的匿名類,它對一個給定的類進行擴充套件,或者實現一個給定的介面,並同時建立該匿名類的一個新
例項。

public class AnonymousInnerClass {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Person p = new Person();
		/*Animal dog = new Dog();
		p.feed(dog);*/
		
		//匿名類
		
		new Animal() {//匿名類可以有自己的屬性和方法,但是不可以例項化,因為例項化的是父類,父類沒有改匿名類中屬性和方法
			private String name = "aaa";
			
			{//匿名類中可以有程式碼塊,初始化。不能用靜態程式碼塊如:static{}
				name = "哈哈";
			}
			public void eat() {
				System.out.println("啃骨頭");
			}
			public void show() {
				System.out.println(name);
			}
		}.show(); ;
		
		Animal dog = new Animal(){//實現呼叫多次
			public void eat() {
				System.out.println("啃骨頭");
			}
		};
		
		p.feed(dog);
		p.feed(dog);
		
		p.feed(new Animal(){
			public void eat() {
				System.out.println("吃魚肉");
			}
		});
	}

}

class Person{
	public void feed(Animal animal) {
		animal.eat();
	}
}

abstract class Animal{
	public abstract void eat();
}


/*class Dog extends Animal{
	public void eat() {
		System.out.println("啃骨頭");
	}
}*/

  

相關文章