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

歡迎訪問 生活随笔!

生活随笔

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

java

java内部类外部类_Java内部类:如何在内部类中返回外部类对象

發布時間:2023/12/10 java 37 豆豆
生活随笔 收集整理的這篇文章主要介紹了 java内部类外部类_Java内部类:如何在内部类中返回外部类对象 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

Nasted Class 的介紹,請詳見參考

今天討論的不是不是內部類的概念,而是具體使用的一個場景-如何在內部類中返回外部對象

(孤豬:我在程序里也碰到過一次這樣的狀況,非靜態內部類可以直接調用外部類實例的成員變量,但如何引用外部類的實例本身卻成了一個問題,下面的這個方法正好解決了這個問題。見下面那句紅色的代碼。)

看一段代碼

import java.util.LinkedList;

import java.util.List;

public class OuterClass

{

private List listeners = new LinkedList();

public void addListeners(IListener listener)

{

this.listeners.add(listener);

}

private OuterClass outer = this;? (1)

private class InnterClass

{

public void publish()

{

//將事件發布出去 (2)

for(int i=0;i < listeners.size();i++)

{

IListener listener = (IListener) listeners.get(i);

listener.receiveEvent(outer);

}

}

}

public void execute()

{

InnterClass in = new InnterClass(); (3)

in.publish();

}

}

public interface IListener

{

public void receiveEvent(OuterClass obj);

}

你可能覺得這個例子很別扭,在哪里讓你覺得難受呢?其實問題的關鍵就在于接口IListener的定義,這里需要給receiveEvent方法傳遞的參數是外部對象!(別激動,下面我會說明需要傳遞的一個場景)

場景

在一個GUI系統中,我們要在畫板WorkSpace(WorkSpace實現了IListener接口)上產生一顆樹,但樹中的每個節點的產生(繪圖)是我們不知道的算法,系統只為我們提供了一些繪圖的接口,并返回元素的句柄!看來我們需要"包裝"一下這個繪圖的句柄Brush(其實我把它叫做筆刷,因為它只知道如何"刷"出圖像來,就這點本事!)并對外提供節點Node這樣一個通用的類。

此時Node與Brush的關系就很微妙了,不過我們可以拋開這些外表,看到Node與Brush其實就是外部類與內部類的關系!-第一步完成了:確定了兩者的關系

然而,事情沒有這么簡單,Node類必須處理一些事件,而這些事件理所當然只有Brush能夠看懂,而Node根本不知道這樣的事件處理過程,現在有兩個辦法:辦法一,讓Node實現Brush所有的事件;辦法二,把Brush返回回去,讓它來處理自己的事件,看來辦法二是個好主意,因為我可以不關心事件的種類!-第二步完成了:確定了事件處理的責任

還沒完呢,你肯定不希望畫板WorkSpace面對的是繪圖的句柄Brush這樣的對象,相反你只希望WokSpace只知道Node的存在!IListener接口中receiveEvent方法的參數定義為OuterClass 就由此而來!-第三步完成:接口的定義

public interface IListener

{

public void receiveEvent(OuterClass obj);

}

既然說清楚了這個問題(應該比較清楚了吧?)那改如何實現這樣一個蹩腳而有無可奈何的設計呢?讓我們回憶一下內部類,內部類擁有訪問外部類的方法與屬性的權限

private OuterClass outer = this;? - 這個對外部類的引用就是為內部類的訪問準備的

private class InnterClass

{

public void publish()

{

//將事件發布出去

for(int i=0;i < listeners.size();i++)

{

IListener listener = (IListener) listeners.get(i);

listener.receiveEvent(outer);? - 這里不可以返回this,因為this代表的是內部類自己

}

}

參考

Java Nested class document.title="Java Nested class - "+document.title?? http://blog.csdn.net/Killvin/archive/2006/01/10/574983.aspx

總結

以上是生活随笔為你收集整理的java内部类外部类_Java内部类:如何在内部类中返回外部类对象的全部內容,希望文章能夠幫你解決所遇到的問題。

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