小男孩‘自慰网亚洲一区二区,亚洲一级在线播放毛片,亚洲中文字幕av每天更新,黄aⅴ永久免费无码,91成人午夜在线精品,色网站免费在线观看,亚洲欧洲wwwww在线观看

分享

關于JAVA匿名內(nèi)部類,回調(diào),事件模式

 bluecrystal 2006-02-13

關于JAVA匿名內(nèi)部類,回調(diào),事件模式的一點討論 VS dotNET事件模式

關于JAVA匿名內(nèi)部類的一點討論.
基本理論:
-----------------------------------------------------
關于JAVA內(nèi)部類:一個內(nèi)部類的定義是定義在另一個類內(nèi)部的類。

  存在它的原因是:

  1.一個內(nèi)部類的對象能夠訪問創(chuàng)建它的對象的實現(xiàn),包括私有數(shù)據(jù)。即內(nèi)部類實例對包含它的哪個類的實例來說,是特權的。

  2.對于同一個包中的其他類來說,內(nèi)部類能夠隱藏起來,換句話說,內(nèi)部類不管方法的可見性如何,那怕是public,除了包容類,其他類都無法使用它。

  3.匿名內(nèi)部類可以很方便的定義回調(diào)。

  4.使用內(nèi)部類可以非常方便的編寫事件驅動程序。


其實它真正的目的僅僅為了定義回調(diào)--進一步就是事件驅動。

接口和回調(diào):編程一個常用的模式是回調(diào)模式,在這種模式中你可以指定當一個特定時間發(fā)生時回調(diào)對象上的方法。
--------------------------------------------------
 注意事項:
 
 匿名類和內(nèi)部類中的中的this :
 有時候,我們會用到一些內(nèi)部類和匿名類。當在匿名類中用this時,這個this則指的是匿名類或內(nèi)部類本身。
 這時如果我們要使用外部類的方法和變量的話,則應該加上外部類的類名。如下面這個例子:

 

public class A {
  
int i = 1;

  public A() {
    Thread thread 
= new Thread() {
      public 
void run() {
        
for(;;) {
          A.
this.run();
          
try {
            sleep(
1000);
          } 
catch(InterruptedException ie) {
          }
        }
      }
    };
    thread.start();
  }  

  public 
void run() {
    System.out.println(
"i = " + i);
    i
++;
  }

  public static 
void main(String[] args) throws Exception {
    
new A();
  }

}


 

    在上面這個例子中, thread 是一個匿名類對象,在它的定義中,它的 run 函數(shù)里用到了外部類的 run 函數(shù)。
    這時由于函數(shù)同名,直接調(diào)用就不行了。這時有兩種辦法,一種就是把外部的 run 函數(shù)換一個名字,但這種辦法對于一個開發(fā)到中途的應用來說是不可取的
    。那么就可以用這個例子中的辦法用外部類的類名加上 this 引用來說明要調(diào)用的是外部類的方法 run。
    --------------------------------------------------
   
   
    對于這個例子:

this.test(new Inner(){
             public 
void method1(){
                 System.out.print(
"1111");
           }
            
             public 
void method2(){
                 System.out.print(
"22222");
           }
});

這個時候調(diào)用test()方法,那Inner類的method1和method2是什么時候被調(diào)用的?難道也是this對象向他們發(fā)消息(比如傳入一個參數(shù))嗎?還是直接顯式的調(diào)用??
 
對于Inner類,除了this這個類,就是this.test(...那句中的this,它能夠調(diào)用Inner類的方法,其他地方都不行,然而,這也需要你在類中有個地方保存有對這個內(nèi)部類實例的引用才可以。再說明一次,內(nèi)部類是用來在某個時刻調(diào)用外面的方法而存在的--這就是回調(diào)。

為了說明內(nèi)部類實例的方法只能在包容類的實例中調(diào)用,其他地方無法調(diào)用,給個例子如下:

JAVA2實用教程源碼:

 

 /** 一個應用程序,用來演示內(nèi)部類的使用 */

/** 類Outer */
class Outer{ 
private static 
int size;

/** 內(nèi)部類Inner的聲明 */
public class Inner{ 
private 
int size;

/** 方法doStuff() */
public 
void doStuff(int size){ 
size
++//存取局部變量
this.size++;  //存取其內(nèi)部類的成員變量
Outer.this.size++//存取其外部類的成員變量
System.out.println(size+" "+this.size+" "+Outer.this.size);
}
}
//內(nèi)部類Inner結束

/** 類Outer中定義的實例方法testInner()方法 */
public 
void testInner(){
Inner i
=new Inner();
i.doStuff(
5); 


/** main()方法 */
public static 
void main(String[] a){ 
Outer o
=new Outer();
o.testInner();
}
}
//類Outer結束

 

------------------------------------------------
那么,如何使用內(nèi)部類,匿名類實現(xiàn)事件處理呢?

JAVA---事件適配器


 1.事件適配器--EventAdapter

  下例中采用了鼠標適配器:
  

import java.awt.*;
  import java.awt.event.
*;
  public class MouseClickHandler extends MouseAdaper{
    public 
void mouseClicked(MouseEvent e) //只實現(xiàn)需要的方法
       { ……}
  } 

 

  java.awt.event包中定義的事件適配器類包括以下幾個:
  1.ComponentAdapter( 組件適配器)
  2.ContainerAdapter( 容器適配器)
  3.FocusAdapter( 焦點適配器)
  4.KeyAdapter( 鍵盤適配器)
  5.MouseAdapter( 鼠標適配器)
  6.MouseMotionAdapter( 鼠標運動適配器)
  7.WindowAdapter( 窗口適配器)

 2. 用內(nèi)部類實現(xiàn)事件處理

  內(nèi)部類(inner class)是被定義于另一個類中的類,使用內(nèi)部類的主要原因是由于:
  ◇ 一個內(nèi)部類的對象可訪問外部類的成員方法和變量,包括私有的成員。
  ◇ 實現(xiàn)事件監(jiān)聽器時,采用內(nèi)部類、匿名類編程非常容易實現(xiàn)其功能。
  ◇ 編寫事件驅動程序,內(nèi)部類很方便?! ?BR>  因此內(nèi)部類所能夠應用的地方往往是在AWT的事件處理機制中。

例5.11
   

import java.awt.* ;
   import java.awt.event.
*;
     public class InnerClass{
       private Frame f;
       private TextField tf;
       public InnerClass(){
       f
=new Frame("Inner classes example");
       tf
=new TextField(30);
     }

     public voidi launchFrame(){
       Label label
=new Label("Click and drag the mouse");
       f.add(label,BorderLayout.NORTH);
       f.add(tf,BorderLayout.SOUTH);
       f.addMouseMotionListener(
new MyMouseMotionListener());/*參數(shù)為內(nèi)部類對象*/
       f.setSize(
300,200);
       f.setVisible(
true); 
     }

     class MyMouseMotionListener extends MouseMotionAdapter{ 
/*內(nèi)部類開始*/
       public 
void mouseDragged(MouseEvent e) {
         String s
="Mouse dragging: x="+e.getX()+"Y="+e.getY();
         tf.setText(s); }
       } ;

       public static 
void main(String args[]) {
         InnerClass obj
=new InnerClass();
         obj.launchFrame();
       }
     }
//內(nèi)部類結束
    }


 

 3.匿名類(Anonymous Class)

  當一個內(nèi)部類的類聲名只是在創(chuàng)建此類對象時用了一次,而且要產(chǎn)生的新類需繼承于一個已有的父類或實現(xiàn)一個接口,才能考慮用匿名類,由于匿名類本身無名,因此它也就不存在構造方法,它需要顯示地調(diào)用一個無參的父
類的構造方法,并且重寫父類的方法。所謂的匿名就是該類連名字都沒有,只是顯示地調(diào)用一個無參的父類的構造方法。

例5.12
   

import java.awt.* ;
   import java.awt.event.
*;
    public class AnonymousClass{
     private Frame f;
     private TextField tf;
     public AnonymousClass(){
      f
=new Frame("Inner classes example");
      tf
=new TextField(30);
    }
    public 
void launchFrame(){
      Label label
=new Label("Click and drag the mouse");
      f.add(label,BorderLayout.NORTH);
      f.add(tf,BorderLayout.SOUTH);
      f.addMouseMotionListener(
new MouseMotionAdapter(){ //匿名類開始
       public void mouseDragged(MouseEvent e){
        String s
="Mouse dragging: x="+e.getX()+"Y="+e.getY();
        tf.setText(s); }
      } ); 
//匿名類結束 
      f.setSize(300,200);
      f.setVisible(
true);
      }
       public static 
void main(String args[]) {
        AnonymousClass obj
=new AnonymousClass();
        obj.launchFrame();
        }
      }

 

  其實仔細分析,例5.11和5.12實現(xiàn)的都是完全一樣的功能,只不過采取的方式不同。5.11中的事件處理類是一個內(nèi)部類,而5.12的事件處理類是匿名類,可以說從類的關系來說是越來越不清楚,但
是程序也越來越簡練。熟悉這兩種方式也十分有助于編寫圖形界面的程序。

親自在IDE中實踐一下,會理解的更深切一點。

然而,在.NET中實現(xiàn)事件模式,就要簡單的多,這樣的文章很多,不過也不妨繼續(xù)討論討論。

posted on 2004-09-11 13:45 海天一鷗 閱讀(3738) 評論(9)  編輯 收藏 收藏至365Key 所屬分類: JAVA技術

評論

# re: 關于JAVA匿名內(nèi)部類,回調(diào),事件模式的一點討論 VS dotNET事件模式 2004-09-15 11:32 海天一鷗

http://www.cnblogs.com/sgsoft/articles/43287.aspx

參照該文代碼,可以看看.NET是如何實現(xiàn)事件驅動的,簡單的讓人害怕!
  回復   

# re: 關于JAVA匿名內(nèi)部類,回調(diào),事件模式的一點討論 VS dotNET事件模式 2004-12-17 10:59 弓長三壽

不錯不錯,內(nèi)容寫得比較明白,有條理!
希望多看到這樣高水平的文章!  回復   

# re: 關于JAVA匿名內(nèi)部類,回調(diào),事件模式的一點討論 VS dotNET事件模式 2004-12-28 11:13 金卯刀

沒找到我要的東西,哥們能幫忙嗎?
我要事件在生活中的實例,還有和另一門語言的比較?!  回復   

# re: 關于JAVA匿名內(nèi)部類,回調(diào),事件模式的一點討論 VS dotNET事件模式 2004-12-28 11:15 就是暈~!

沒人給回,我暈,什么論壇啊???
狂暈,我頂!  回復   

# re: 關于JAVA匿名內(nèi)部類,回調(diào),事件模式的一點討論 VS dotNET事件模式 2004-12-28 13:14 海天一鷗

你把需求寫一個發(fā)郵件給我不就可以呢?!
文章只能拋磚引玉。  回復   

# 關于內(nèi)部類的一篇文章..得好好看看。暈[TrackBack] 2005-02-23 17:57 小力力力

Ping Back來自:blog.csdn.net
小力力力引用了該文章,地址:http://blog.csdn.net/faintbear/archive/2005/02/23/299076.aspx  回復   

# re: 關于JAVA匿名內(nèi)部類,回調(diào),事件模式的一點討論 VS dotNET事件模式 2005-09-28 11:08 hyx

多謝指教。是一篇好文章。  回復   

# re: 關于JAVA匿名內(nèi)部類,回調(diào),事件模式的一點討論 VS dotNET事件模式 2005-10-11 11:46 kennwang

非常好 感謝  回復   

# re: 關于JAVA匿名內(nèi)部類,回調(diào),事件模式的一點討論 VS dotNET事件模式 2005-10-21 09:15 chabulier

不錯,簡單明了,道出真諦.  回復  

    本站是提供個人知識管理的網(wǎng)絡存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式、誘導購買等信息,謹防詐騙。如發(fā)現(xiàn)有害或侵權內(nèi)容,請點擊一鍵舉報。
    轉藏 分享 獻花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多