天天看點

java匿名内部類

     匿名類是不能有名稱的類,是以沒辦法引用它們。必須在建立時,作為new語句的一部分來聲明它們。這就要采用另一種形式的new語句,如下所示: new <類或接口> <類的主體> 這種形式的new語句聲明一個新的匿名類,它對一個給定的類進行擴充,或者實作一個給定的接口。它還建立那個類的一個新執行個體,并把它作為語句的結果而傳回。要擴充的類和要實作的接口是new語句的操作數,後跟匿名類的主體。如果匿名類對另一個類進行擴充,它的主體可以通路類的成員、覆寫它的方法等等,這和其他任何标準的類都是一樣的。如果匿名類實作了一個接口,它的主體必須實作接口的方法。

java 代碼

  1. interface pr
  2. {   
  3. void print1();
  4. }   
  5. public class noNameClass    
  6. public pr dest()
  7.     return new pr(){
  8.      public void print1()
  9.      {   
  10.       System.out.println("Hello world!!");
  11.      }   
  12.     };   
  13. public static void main(String args[])
  14.     noNameClass c=new     noNameClass();
  15.     pr hw=c.dest();   
  16.     hw.print1();   

pr也可以是一個類但是你外部調用的方法必須在你的這個類或接口中聲明外部不能調用匿名類内部的方法

Java中内部匿名類用的最多的地方也許就是在Frame中加入Listner了吧。

如下:

  1. import java.awt.*;
  2. import java.awt.event.*;
  3. public class QFrame extends Frame {
  4.     public QFrame() {
  5.            this.setTitle(\"my application\");
  6.            addWindowListener(new WindowAdapter() {
  7.                    public void windowClosing(WindowEvent e) {
  8.                    dispose();   
  9.                    System.exit(0);
  10.             });     
  11.           this.setBounds(10,10,200,200);
  12. }   

内部匿名類,就是建立一個内部的類,但沒有給你命名,也就是沒有引用執行個體的變量。

new WindowAdapter() {

      public void windowClosing(WindowEvent e) {

             dispose();

             System.exit(0);

     }

    new 是建立一個 WindowAdapter對象 ,後面一個 {} 表示這個括号中的操作作用于這個預設的對名象,而上面的Java程式中後面是一個函數體。

這個用法的作用是:建立一個對象的執行個體,并且 override 它的一個函數。打開 WindowAdapter 的代碼可以發現。它是一個抽象類。它是對 WindowListener 接口的一個實作。Frame.addWindowListner(); 的參數是一個 WindowListner ,而實作上是傳一個從WindowAdapter 派生出的一個匿名類。

1.怎樣判斷一個匿名類的存在啊?看不見名字,感覺隻是父類new出一個對象而已,沒有匿名類的名字。

先看段僞代碼

abstract class Father(){

....

}

public class Test{

   Father f1 = new Father(){ .... }  //這裡就是有個匿名内部類

一般來說,new 一個對象時小括号後應該是分号,也就是new出對象該語句就結束了。

但是出現匿名内部類就不一樣,小括号後跟的是大括号,大括号中是該new 出對象的具體的實作方法。

因為我們知道,一個抽象類是不能直接new 的,必須先有實作類了我們才能new出它的實作類。

上面的僞代碼就是表示new 的是Father的實作類,這個實作類是個匿名内部類。

其實拆分上面的匿名内部類可為

class SonOne extends Father{

  ...       //這裡的代碼和上面匿名内部類,大括号中的代碼是一樣的

   Father f1 = new SonOne() ;

2.匿名内部類的注意事項

   注意匿名類的聲明是在編譯時進行的,執行個體化在運作時進行。這意味着for循環中的一個new語句會建立相同匿名類的幾個執行個體,而不是建立幾個不同匿名類的一個執行個體。

在使用匿名内部類時,要記住以下幾個原則:

 ·匿名内部類不能有構造方法。  

 ·匿名内部類不能定義任何靜态成員、方法和類。  

 ·匿名内部類不能是public,protected,private,static。  

 ·隻能建立匿名内部類的一個執行個體。

  ·一個匿名内部類一定是在new的後面,用其隐含實作一個接口或實作一個類。  

 ·因匿名内部類為局部内部類,是以局部内部類的所有限制都對其生效。

  ·内部類隻能通路外部類的靜态變量或靜态方法。

匿名類和内部類中的中的this :

有時候,我們會用到一些内部類和匿名類。當在匿名類中用this時,這個this則指的是匿名類或内部類本身。這時如果我們要使用外部類的方法和變量的話,則應該加上外部類的類名

3.匿名内部類的作用

    Java的内部類和C++中的嵌套類有本質的不同:C++的嵌套類沒有指向包裝類的句柄。僅僅表達一個封裝的概念;但是Java的内部類不同,它可以通路包裝類的成員(這表示它擁有指向包裝類的句柄)。

     匿名内部類是内部類的一種簡化寫法:return new Wrapper {

                                        ...

                                     };

     等價于:Wrapped extends Wrapper {

          ...

          }

          return new Wrapped();

  難道匿名内部類就隻這一點作用嗎?

  考慮一下這樣的case:

  interface ICount {

    int count();

  }

  class Parent {

    int i = 0;

    int count() {

      return i++;

    }

       有一個類Child,它既想繼承Parent的count()方法,又想實作ICount接口中的count方法,這個時候怎麼辦呢?内部類就可以大顯身手了:

  class Child extends Parent {

    ICount getCount() {

      return new ICount {

        int i = 0;

        int count() {

         return (i *= 2);

        }

      }

作者:郭耀華

出處:http://www.guoyaohua.com

微信:guoyaohua167

郵箱:[email protected]

本文版權歸作者和部落格園所有,歡迎轉載,轉載請标明出處。

【如果你覺得本文還不錯,對你的學習帶來了些許幫助,請幫忙點選右下角的推薦】

java匿名内部類