日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > java >内容正文

java

java 匿名类型_Java之匿名类讲解

發(fā)布時間:2025/3/12 java 23 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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語言規(guī)范上是這么描述匿名類的:

匿名類的聲明:

匿名類的聲明是由java編譯器自動派生自一個類實例創(chuàng)建表達式。

匿名類永遠不能是抽象的。

匿名類總是隱式的final。

匿名類總是一個內部類;并且不能是static的。

匿名構造函數:

匿名類不能有顯式聲明的構造函數。相反的,Java編譯器必須為這個匿名類自動提供一個匿名構造函數。匿名類C繼承于父類S那么匿名構造函數是下面的形式:

如果S不是一個內部類或者S是一個靜態(tài)上下文中的局部類,那么這個匿名構造函數有一個形參為每一個在C的類實例創(chuàng)建表達式中的實際參數。

類的實例創(chuàng)建表達式的實際參數用來確定S的一個構造函數cs,使用方法調用相同的規(guī)則。

每一個匿名構造函數的形參必須和cs中的相關形參一致。

這個構造函數中顯式的包括super(...)構造函數調用,這個實際參數是構造函數的形參,按它們聲明的順序。

否則,C的構造函數第一個形參描述了這個值,直接包圍實例i相對于S。參數的類型是S的class類型。

構造函數有一個額外的形參為每一個類實例創(chuàng)建語句聲明在匿名類中的實際參數。第n個形參和第n-1個實際參數相關。

類的實例創(chuàng)建表達式的實際參數用來確定S的一個構造函數cs,使用方法調用相同的規(guī)則。

每一個匿名構造函數的形參必須和cs中的相關形參一致。

這個構造函數中顯式的包括super(...)構造函數調用,這個實際參數是構造函數的形參,按它們聲明的順序。

在所有的情況下,匿名構造函數的throws語句必須列出所有的檢查異常,包括父類構造函數顯式調用語句拋出的和匿名類的實例初始化或者變量初始化拋出的異常。

注意:匿名構造函數的簽名涉及到了一個不可達類型是可能的(例如,出現在父類構造函數中的類型),這不會導致任何編譯時和運行時錯誤。

實際使用中我們只需注意這幾點兒:

1、使用匿名內部類時,我們必須是繼承一個類或者實現一個接口,但是兩者不可兼得,同時也只能繼承一個類或者實現一個接口。

2、匿名內部類中是不能定義構造函數的。

3、匿名內部類中不能存在任何的靜態(tài)成員變量和靜態(tài)方法。

4、匿名內部類為局部內部類,所以局部內部類的所有限制同樣對匿名內部類生效。

5、匿名內部類不能是抽象的,它必須要實現繼承的類或者實現的接口的所有抽象方法。

編譯時的命名規(guī)則:

內部類的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之匿名类讲解的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。