java匿名內(nèi)部類

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

匿名類是不能有名稱的類,所以沒(méi)辦法引用它們。必須在創(chuàng)建時(shí),作為new語(yǔ)句的一部分來(lái)聲明它們。這就要采用另一種形式的new語(yǔ)句,如下所示: new <類或接口> <類的主體> 這種形式的new語(yǔ)句聲明一個(gè)新的匿名類,它對(duì)一個(gè)給定的類進(jìn)行擴(kuò)展,或者實(shí)現(xiàn)一個(gè)給定的接口。它還創(chuàng)建那個(gè)類的一個(gè)新實(shí)例,并把它作為語(yǔ)句的結(jié)果而返回。要擴(kuò)展的類和要實(shí)現(xiàn)的接口是new語(yǔ)句的操作數(shù),后跟匿名類的主體。如果匿名類對(duì)另一個(gè)類進(jìn)行擴(kuò)展,它的主體可以訪問(wèn)類的成員、覆蓋它的方法等等,這和其他任何標(biāo)準(zhǔn)的類都是一樣的。如果匿名類實(shí)現(xiàn)了一個(gè)接口,它的主體必須實(shí)現(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也可以是一個(gè)類但是你外部調(diào)用的方法必須在你的這個(gè)類或接口中聲明外部不能調(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)部匿名類,就是建立一個(gè)內(nèi)部的類,但沒(méi)有給你命名,也就是沒(méi)有引用實(shí)例的變量。

new WindowAdapter() {

public void windowClosing(WindowEvent e) {

dispose();

System.exit(0);

}

}

new 是建立一個(gè) WindowAdapter對(duì)象 ,后面一個(gè) {} 表示這個(gè)括號(hào)中的操作作用于這個(gè)默認(rèn)的對(duì)名象,而上面的Java程序中后面是一個(gè)函數(shù)體。

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

1.怎樣判斷一個(gè)匿名類的存在啊?看不見(jiàn)名字,感覺(jué)只是父類new出一個(gè)對(duì)象而已,沒(méi)有匿名類的名字。

先看段偽代碼

abstract class Father(){

....

}

public class Test{

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

}

一般來(lái)說(shuō),new 一個(gè)對(duì)象時(shí)小括號(hào)后應(yīng)該是分號(hào),也就是new出對(duì)象該語(yǔ)句就結(jié)束了。

但是出現(xiàn)匿名內(nèi)部類就不一樣,小括號(hào)后跟的是大括號(hào),大括號(hào)中是該new 出對(duì)象的具體的實(shí)現(xiàn)方法。

因?yàn)槲覀冎溃粋€(gè)抽象類是不能直接new 的,必須先有實(shí)現(xiàn)類了我們才能new出它的實(shí)現(xiàn)類。

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

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

class SonOne extends Father{

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

}

public class Test{

Father f1 = new SonOne() ;

}

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

注意匿名類的聲明是在編譯時(shí)進(jìn)行的,實(shí)例化在運(yùn)行時(shí)進(jìn)行。這意味著for循環(huán)中的一個(gè)new語(yǔ)句會(huì)創(chuàng)建相同匿名類的幾個(gè)實(shí)例,而不是創(chuàng)建幾個(gè)不同匿名類的一個(gè)實(shí)例。

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

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

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

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

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

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

·因匿名內(nèi)部類為局部?jī)?nèi)部類,所以局部?jī)?nèi)部類的所有限制都對(duì)其生效。

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

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

有時(shí)候,我們會(huì)用到一些內(nèi)部類和匿名類。當(dāng)在匿名類中用this時(shí),這個(gè)this則指的是匿名類或內(nèi)部類本身。這時(shí)如果我們要使用外部類的方法和變量的話,則應(yīng)該加上外部類的類名

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

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

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

...

};

等價(jià)于:Wrapped extends Wrapper {

...

}

return new Wrapped();

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

考慮一下這樣的case:

interface ICount {

int count();

}

class Parent {

int i = 0;

int count() {

return i++;

}

}

有一個(gè)類Child,它既想繼承Parent的count()方法,又想實(shí)現(xiàn)ICount接口中的count方法,這個(gè)時(shí)候怎么辦呢??jī)?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)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

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

  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語(yǔ)法,類相關(guān)的語(yǔ)法,內(nèi)部類的語(yǔ)法,繼承相關(guān)的語(yǔ)法,異常的語(yǔ)法,線程的語(yǔ)...
    子非魚_t_閱讀 31,766評(píng)論 18 399
  • 本文首發(fā)于我的個(gè)人博客 —— Bridge for You,轉(zhuǎn)載請(qǐng)標(biāo)明出處。 前言 我們先來(lái)看一道很簡(jiǎn)單的小題: ...
    柳樹(shù)之閱讀 1,368評(píng)論 3 23
  • 導(dǎo)語(yǔ) 學(xué)完匿名內(nèi)部類就懂的情書。 主要內(nèi)容 接口與抽象類和匿名內(nèi)部類的關(guān)系 具體內(nèi)容 匿名內(nèi)部類也就是沒(méi)有名字的內(nèi)...
    java部落閱讀 182評(píng)論 0 0
  • 熟悉Java的應(yīng)該都知道,Java匿名內(nèi)部類會(huì)隱式持有一個(gè)外部類對(duì)象。所以在匿名內(nèi)部類里可以調(diào)用外部類各個(gè)方法。 ...
    Jerry2015閱讀 10,982評(píng)論 5 14
  • 天,藍(lán)得肆無(wú)忌憚,花,美得超凡脫俗! 銜邊公園,俯手即拍,養(yǎng)眼潤(rùn)心! ...................
    落筆軒閱讀 382評(píng)論 0 1