java匿名內(nèi)部類

http://blog.sina.com.cn/s/blog_62ea4cf40100mubj.html

匿名類是不能有名稱的類凌摄,所以沒辦法引用它們。必須在創(chuàng)建時猪落,作為new語句的一部分來聲明它們盖袭。這就要采用另一種形式的new語句蛋褥,如下所示: new <類或接口> <類的主體> 這種形式的new語句聲明一個新的匿名類,它對一個給定的類進行擴展浴捆,或者實現(xiàn)一個給定的接口蒜田。它還創(chuàng)建那個類的一個新實例,并把它作為語句的結(jié)果而返回选泻。要擴展的類和要實現(xiàn)的接口是new語句的操作數(shù)冲粤,后跟匿名類的主體。如果匿名類對另一個類進行擴展页眯,它的主體可以訪問類的成員梯捕、覆蓋它的方法等等,這和其他任何標準的類都是一樣的窝撵。如果匿名類實現(xiàn)了一個接口科阎,它的主體必須實現(xiàn)接口的方法屎暇。

java 代碼

interface?pr

{

void?print1();

}

public?class?noNameClass

{

public?prdest()

{

return?new?pr(){

public?void?print1()

{

System.out.println("Helloworld!!");

}

};

}

public?static?void?main(Stringargs[])

{

noNameClass c=new?noNameClass();

prhw=c.dest();

hw.print1();

}

}

pr也可以是一個類但是你外部調(diào)用的方法必須在你的這個類或接口中聲明外部不能調(diào)用匿名類內(nèi)部的方法

Java中內(nèi)部匿名類用的最多的地方也許就是在Frame中加入Listner了吧优俘。

如下:

java 代碼

import ?java.awt.*;

import ?java.awt.event.*;

public?class?QFrame?extends?Frame{

public?QFrame(){

this.setTitle(\"myapplication\");

addWindowListener(new?WindowAdapter(){

public?void?windowClosing(WindowEvente){

dispose();

System.exit(0);

}

});

this.setBounds(10,10,200,200);

}

}

內(nèi)部匿名類界赔,就是建立一個內(nèi)部的類佛嬉,但沒有給你命名脱羡,也就是沒有引用實例的變量磅废。

new WindowAdapter() {

public void windowClosing(WindowEvent e) {

dispose();

System.exit(0);

}

}

new 是建立一個 WindowAdapter對象 菠秒,后面一個 {} 表示這個括號中的操作作用于這個默認的對名象赊瞬,而上面的Java程序中后面是一個函數(shù)體隆豹。

這個用法的作用是:創(chuàng)建一個對象的實例椭岩,并且 override 它的一個函數(shù)。打開 WindowAdapter 的代碼可以發(fā)現(xiàn)。它是一個抽象類判哥。它是對 WindowListener 接口的一個實現(xiàn)献雅。Frame.addWindowListner(); 的參數(shù)是一個 WindowListner ,而實現(xiàn)上是傳一個從WindowAdapter 派生出的一個匿名類塌计。

1.怎樣判斷一個匿名類的存在巴ι怼?看不見名字锌仅,感覺只是父類new出一個對象而已章钾,沒有匿名類的名字。

先看段偽代碼

abstract class Father(){

....

}

public class Test{

Father f1 = new Father(){ .... }//這里就是有個匿名內(nèi)部類

}

一般來說热芹,new 一個對象時小括號后應(yīng)該是分號贱傀,也就是new出對象該語句就結(jié)束了。

但是出現(xiàn)匿名內(nèi)部類就不一樣伊脓,小括號后跟的是大括號府寒,大括號中是該new 出對象的具體的實現(xiàn)方法。

因為我們知道报腔,一個抽象類是不能直接new 的椰棘,必須先有實現(xiàn)類了我們才能new出它的實現(xiàn)類。

上面的偽代碼就是表示new 的是Father的實現(xiàn)類榄笙,這個實現(xiàn)類是個匿名內(nèi)部類邪狞。

其實拆分上面的匿名內(nèi)部類可為

class SonOne extends Father{

...//這里的代碼和上面匿名內(nèi)部類,大括號中的代碼是一樣的

}

public class Test{

Father f1 = new SonOne() ;

}

2.匿名內(nèi)部類的注意事項

注意匿名類的聲明是在編譯時進行的茅撞,實例化在運行時進行帆卓。這意味著for循環(huán)中的一個new語句會創(chuàng)建相同匿名類的幾個實例,而不是創(chuàng)建幾個不同匿名類的一個實例米丘。

在使用匿名內(nèi)部類時剑令,要記住以下幾個原則:

·匿名內(nèi)部類不能有構(gòu)造方法。

·匿名內(nèi)部類不能定義任何靜態(tài)成員拄查、方法和類吁津。

·匿名內(nèi)部類不能是public,protected,private,static。

·只能創(chuàng)建匿名內(nèi)部類的一個實例堕扶。

·一個匿名內(nèi)部類一定是在new的后面碍脏,用其隱含實現(xiàn)一個接口或?qū)崿F(xiàn)一個類。

·因匿名內(nèi)部類為局部內(nèi)部類稍算,所以局部內(nèi)部類的所有限制都對其生效典尾。

·靜態(tài)內(nèi)部類只能訪問外部類的靜態(tài)變量或靜態(tài)方法。

匿名類和內(nèi)部類中的中的this :

有時候糊探,我們會用到一些內(nèi)部類和匿名類钾埂。當在匿名類中用this時河闰,這個this則指的是匿名類或內(nèi)部類本身。這時如果我們要使用外部類的方法和變量的話褥紫,則應(yīng)該加上外部類的類名

3.匿名內(nèi)部類的作用

Java的內(nèi)部類和C++中的嵌套類有本質(zhì)的不同:C++的嵌套類沒有指向包裝類的句柄姜性。僅僅表達一個封裝的概念;但是Java的內(nèi)部類不同髓考,它可以訪問包裝類的成員(這表示它擁有指向包裝類的句柄)部念。

匿名內(nèi)部類是內(nèi)部類的一種簡化寫法:return new Wrapper {

...

};

等價于:Wrapped extends Wrapper {

...

}

return new Wrapped();

難道匿名內(nèi)部類就只這一點作用嗎?

考慮一下這樣的case:

interface ICount {

int count();

}

class Parent {

int i = 0;

int count() {

return i++;

}

}

有一個類Child绳军,它既想繼承Parent的count()方法印机,又想實現(xiàn)ICount接口中的count方法矢腻,這個時候怎么辦呢门驾?內(nèi)部類就可以大顯身手了:

class Child extends Parent {

ICount getCount() {

return new ICount {

int i = 0;

int count() {

return (i *= 2);

}

}

}

}

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市多柑,隨后出現(xiàn)的幾起案子奶是,更是在濱河造成了極大的恐慌,老刑警劉巖竣灌,帶你破解...
    沈念sama閱讀 218,546評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件聂沙,死亡現(xiàn)場離奇詭異,居然都是意外死亡初嘹,警方通過查閱死者的電腦和手機及汉,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,224評論 3 395
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來屯烦,“玉大人坷随,你說我怎么就攤上這事∽す辏” “怎么了温眉?”我有些...
    開封第一講書人閱讀 164,911評論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長翁狐。 經(jīng)常有香客問我类溢,道長,這世上最難降的妖魔是什么露懒? 我笑而不...
    開封第一講書人閱讀 58,737評論 1 294
  • 正文 為了忘掉前任闯冷,我火速辦了婚禮,結(jié)果婚禮上懈词,老公的妹妹穿的比我還像新娘窃躲。我一直安慰自己,他們只是感情好钦睡,可當我...
    茶點故事閱讀 67,753評論 6 392
  • 文/花漫 我一把揭開白布蒂窒。 她就那樣靜靜地躺著躁倒,像睡著了一般。 火紅的嫁衣襯著肌膚如雪洒琢。 梳的紋絲不亂的頭發(fā)上秧秉,一...
    開封第一講書人閱讀 51,598評論 1 305
  • 那天,我揣著相機與錄音衰抑,去河邊找鬼象迎。 笑死,一個胖子當著我的面吹牛呛踊,可吹牛的內(nèi)容都是我干的砾淌。 我是一名探鬼主播,決...
    沈念sama閱讀 40,338評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼谭网,長吁一口氣:“原來是場噩夢啊……” “哼汪厨!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起愉择,我...
    開封第一講書人閱讀 39,249評論 0 276
  • 序言:老撾萬榮一對情侶失蹤劫乱,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后锥涕,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體衷戈,經(jīng)...
    沈念sama閱讀 45,696評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,888評論 3 336
  • 正文 我和宋清朗相戀三年层坠,在試婚紗的時候發(fā)現(xiàn)自己被綠了殖妇。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,013評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡破花,死狀恐怖谦趣,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情旧乞,我是刑警寧澤蔚润,帶...
    沈念sama閱讀 35,731評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站尺栖,受9級特大地震影響嫡纠,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜延赌,卻給世界環(huán)境...
    茶點故事閱讀 41,348評論 3 330
  • 文/蒙蒙 一除盏、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧挫以,春花似錦者蠕、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,929評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽粪小。三九已至,卻和暖如春抡句,著一層夾襖步出監(jiān)牢的瞬間探膊,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,048評論 1 270
  • 我被黑心中介騙來泰國打工待榔, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留逞壁,地道東北人。 一個月前我還...
    沈念sama閱讀 48,203評論 3 370
  • 正文 我出身青樓锐锣,卻偏偏與公主長得像腌闯,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子雕憔,可洞房花燭夜當晚...
    茶點故事閱讀 44,960評論 2 355

推薦閱讀更多精彩內(nèi)容

  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語法姿骏,類相關(guān)的語法,內(nèi)部類的語法橘茉,繼承相關(guān)的語法工腋,異常的語法姨丈,線程的語...
    子非魚_t_閱讀 31,634評論 18 399
  • 本文首發(fā)于我的個人博客 —— Bridge for You畅卓,轉(zhuǎn)載請標明出處。 前言 我們先來看一道很簡單的小題: ...
    柳樹之閱讀 1,361評論 3 23
  • 導語 學完匿名內(nèi)部類就懂的情書蟋恬。 主要內(nèi)容 接口與抽象類和匿名內(nèi)部類的關(guān)系 具體內(nèi)容 匿名內(nèi)部類也就是沒有名字的內(nèi)...
    java部落閱讀 171評論 0 0
  • 熟悉Java的應(yīng)該都知道翁潘,Java匿名內(nèi)部類會隱式持有一個外部類對象。所以在匿名內(nèi)部類里可以調(diào)用外部類各個方法歼争。 ...
    Jerry2015閱讀 10,923評論 5 14
  • 天拜马,藍得肆無忌憚,花沐绒,美得超凡脫俗俩莽! 銜邊公園,俯手即拍乔遮,養(yǎng)眼潤心扮超! ...................
    落筆軒閱讀 377評論 0 1