java 匿名类型_Java之匿名类讲解
匿名類,正如名字一樣在java中沒有名字標識的類,當然了編譯后還是會安排一個名字的。
下面是一個關于匿名類的簡單例子:
public classClient {public static voidmain(String[] args) throws InterruptedException {
Thread t=new Thread(newRunnable() {
@Overridepublic voidrun() {
System.out.println("hello,dusk!");
}
});
t.start();
}
}
Java語言規范上是這么描述匿名類的:
匿名類的聲明:
匿名類的聲明是由java編譯器自動派生自一個類實例創建表達式。
匿名類永遠不能是抽象的。
匿名類總是隱式的final。
匿名類總是一個內部類;并且不能是static的。
匿名構造函數:
匿名類不能有顯式聲明的構造函數。相反的,Java編譯器必須為這個匿名類自動提供一個匿名構造函數。匿名類C繼承于父類S那么匿名構造函數是下面的形式:
如果S不是一個內部類或者S是一個靜態上下文中的局部類,那么這個匿名構造函數有一個形參為每一個在C的類實例創建表達式中的實際參數。
類的實例創建表達式的實際參數用來確定S的一個構造函數cs,使用方法調用相同的規則。
每一個匿名構造函數的形參必須和cs中的相關形參一致。
這個構造函數中顯式的包括super(...)構造函數調用,這個實際參數是構造函數的形參,按它們聲明的順序。
否則,C的構造函數第一個形參描述了這個值,直接包圍實例i相對于S。參數的類型是S的class類型。
構造函數有一個額外的形參為每一個類實例創建語句聲明在匿名類中的實際參數。第n個形參和第n-1個實際參數相關。
類的實例創建表達式的實際參數用來確定S的一個構造函數cs,使用方法調用相同的規則。
每一個匿名構造函數的形參必須和cs中的相關形參一致。
這個構造函數中顯式的包括super(...)構造函數調用,這個實際參數是構造函數的形參,按它們聲明的順序。
在所有的情況下,匿名構造函數的throws語句必須列出所有的檢查異常,包括父類構造函數顯式調用語句拋出的和匿名類的實例初始化或者變量初始化拋出的異常。
注意:匿名構造函數的簽名涉及到了一個不可達類型是可能的(例如,出現在父類構造函數中的類型),這不會導致任何編譯時和運行時錯誤。
實際使用中我們只需注意這幾點兒:
1、使用匿名內部類時,我們必須是繼承一個類或者實現一個接口,但是兩者不可兼得,同時也只能繼承一個類或者實現一個接口。
2、匿名內部類中是不能定義構造函數的。
3、匿名內部類中不能存在任何的靜態成員變量和靜態方法。
4、匿名內部類為局部內部類,所以局部內部類的所有限制同樣對匿名內部類生效。
5、匿名內部類不能是抽象的,它必須要實現繼承的類或者實現的接口的所有抽象方法。
編譯時的命名規則:
內部類的class文件命名是:主類+$+內部類名
匿名類的class文件命名是:主類+$+(1,2,3....)
定義一個場景:
package com.dusk.anonymous;public classAnonymousClassTest {private Runnable r1=newRunnable() {
@Overridepublic voidrun() {
System.out.println(1);
}
};public voidmethod1(){
Runnable r2=newRunnable() {
@Overridepublic voidrun() {
System.out.println(2);
}
};
}public static voidmain(String[] args) {
Runnable r3=newRunnable() {
@Overridepublic voidrun() {
System.out.println(3);
}
};
}
}
從代碼中我們可以看出定義了三個匿名類:
我們反編譯出來:
package com.dusk.anonymous;
import java.io.PrintStream;class AnonymousClassTest$1implements Runnable
{
AnonymousClassTest$1(AnonymousClassTest paramAnonymousClassTest) {}public voidrun()
{
System.out.println(1);
}
}
package com.dusk.anonymous;
import java.io.PrintStream;class AnonymousClassTest$2implements Runnable
{
AnonymousClassTest$2(AnonymousClassTest paramAnonymousClassTest) {}public voidrun()
{
System.out.println(2);
}
}
package com.dusk.anonymous;
import java.io.PrintStream;class AnonymousClassTest$3implements Runnable
{public voidrun()
{
System.out.println(3);
}
}
我們可以看出匿名類的名字中的數字和他們在代碼中出現的位置一模一樣。
總結
以上是生活随笔為你收集整理的java 匿名类型_Java之匿名类讲解的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: openglshader实现虚拟场景_虚
- 下一篇: (并查集)小希的迷宫