Anonymous Inner Class(匿名內部類)是否可以繼承其它類?是否可以實現介面?【Java面試題】
阿新 • • 發佈:2018-12-26
回答:匿名內部類在實現時必須藉助一個藉口或者一個抽象類或者一個普通類來構造,從這過層次上講匿名內部類是實現了介面或者繼承了類,但是不能通過extends或implement關鍵詞來繼承類或實現介面。
匿名內部類即沒有名字的內部類。當我們只需要用某一個類一次時,且該類從意義上需要實現某個類或某個介面,這個特殊的擴充套件類就以匿名內部類來展現。
一般的用途:
1、覆蓋某個超類的方法,並且該擴充套件類只在本類內用一次。
2、繼承抽象類,並例項化其抽象方法,並且該擴充套件類只在本類內用一次。
3、實現介面,例項化其方法,並且該擴充套件類只在本類內用一次。
程式碼示例:
class Car{ void move(){} } interface Person{ void learn(); } abstract class Animal{ abstract void eat(); } public class AnonymousInnerClassDemo { public static void main(String[] args) { Car car = new Car(){ @Override void move() { System.out.println("匿名內部類的move方法"); } }; car.move(); Person person = new Person() { public void learn() { System.out.println("匿名內部類的learn方法"); } }; person.learn(); Animal animal = new Animal() { @Override void eat() { System.out.println("匿名內部類的eat方法"); } }; animal.eat(); } }
幾點說明:
一、由於匿名內部類沒有名字,所以它沒有建構函式。因為沒有建構函式,所以它必須完全借用父類的建構函式來例項化,匿名內部類完全把建立物件的任務交給了父類去完成。
二、在匿名內部類裡建立新的方法沒有太大意義,但它可以通過覆蓋父類的方法達到神奇效果,如上例所示。這是多型性的體現。
三、因為匿名內部類沒有名字,所以無法進行向下的強制型別轉換,持有對一個匿名內部類物件引用的變數型別一定是它的直接或間接父類型別。
四、注意匿名內部類的宣告是在編譯時進行的,例項化在執行時進行。這意味著for迴圈中的一個new語句會建立相同匿名類的幾個例項,而不是建立幾個不同匿名類的一個例項。