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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/433368.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

linux 中 timeval结构体

网上很多人写到&#xff0c;timeval结构解释错误 ******************************************************************* 问题如下&#xff1a; 在debian linux的man页中对gettimeofday函数的说明中&#xff0c;有这样一个说明&#xff1a; DESCRIPTION The functions get…

[置顶] C语言中各种数据类型的长度 sizeof char, short, int, long, long long

这些数据类型的sizeof具体长度依赖于编译器和操作系统&#xff08;32-bit or 64-bit&#xff09; 1: 首先&#xff0c;参见c99标准 标准中没有定义这些数据类型的长度&#xff0c;而是定义了这些数据类型能表达的大小范围的最小极限。 C99链接&#xff1a; http://www.open-std…

关机时无人照管更新正在运行_了解iOS13.1后,在决定更新

苹果提前发布了首个重要更新的iOS 13.1&#xff0c;补充了多个 iOS 13 首发时缺失的重要新功能&#xff0c;可以说 iOS 13.1 才是【真正】的 iOS 13 系统。苹果发布iOS13.1,都更新了哪些内容&#xff1f;iOS13.1修复问题和改进问题&#xff1a;?信息中拟我表情可能无法正确跟踪…

java enum in class_Java 8需要一个转换,而Java 7没有 – enum.getClass/getDeclaringClass

我意识到Java 8仍然在测试版&#xff0c;但是这一点让我很奇怪&#xff1a;public class Fields> {public Fields(Set columns) {// A sample column used to find the universe of the enum of Columns.C sampleCol columns.iterator().next();// Java 8 needs a cast her…

linux C 中的volatile使用

一个定义为volatile的变量是说这变量可能会被意想不到地改变&#xff0c;这样&#xff0c;编译器就不会去假设这个变量的值了。精确地说就是&#xff0c;优化器在用到这个变量时必须每次都小心地重新读取这个变量的值&#xff0c;而不是使用保存在寄存器里的备份。下面是volati…

山西计算机网络技术专升本分数线_2020山西成考专升本招生补录第一批公告!附补录院校专业缺额表!...

☞回复【成绩】查询2020年成人高考成绩☞回复【录取】查询20成考录取结果☞回复【补录】查询最新院校缺额信息☞加入学历备考交流群 550985358 专升本第一阶段补录通知与院校缺额信息 达线未被录取&#xff1f;还有机会2020山西成考专升本招生征集志愿第一阶段公告发布12月9日1…

yii mysql 主从_mysql主从同步实践YII

1、两台服务器互联master、slave 2、master配置&#xff1a; server-id 1 master端ID号 log-bin/data/logbin/mysql-bin 日志路径及文件名 #binlog-do-db cacti 同步cacti&#xff0c;此处关闭的话&#xff0c;就是除不允许的&#xff0c;其它的库均同步。 binlog-ignore-db …

网页编码就是那点事

编码一直是让新手头疼的问题&#xff0c;特别是 GBK、GB2312、UTF-8 这三个比较常见的网页编码的区别&#xff0c;更是让许多新手晕头转向&#xff0c;怎么解释也解释不清楚。但是编码又是那么重要&#xff0c;特别在网页这一块。如果你打出来的不是乱码&#xff0c;而网页中出…

python最大正方形的面积_LeetCode 221. 最大正方形 | Python

221. 最大正方形题目在一个由 0 和 1 组成的二维矩阵内&#xff0c;找到只包含 1 的最大正方形&#xff0c;并返回其面积。示例:输入:1 0 1 0 01 0 1 1 11 1 1 1 11 0 0 1 0输出: 4解题思路思路&#xff1a;动态规划本篇幅使用动态规划的原理来解决该问题。我们用 dp(i, j) 表示…

查询学生选修课程管理系统java_JAVA数据库课程设计学生选课管理系统的

《JAVA数据库课程设计学生选课管理系统的》由会员分享&#xff0c;可在线阅读&#xff0c;更多相关《JAVA数据库课程设计学生选课管理系统的(59页珍藏版)》请在人人文库网上搜索。1、一、课程设计目的通过这次的设计&#xff0c;主要是做出一个小型的管理系统&#xff0c;来加强…

Linux C 中字符串化操作符#

1 #include <stdio.h>2 3 #define dprint( expr ) printf( "%s %d \n", #expr , expr)4 5 int main(void)6 {7 int x 100;8 int y 2;9 10 dprint(x/y); 11 dprint( xy ); 12 dprint( xy2 ); 13 return 0; 14 } 打印信息&…

Poj1207 The 3n + 1 problem(水题(数据)+陷阱)

一、Description Problems in Computer Science are often classified as belonging to a certain class of problems (e.g., NP, Unsolvable, Recursive). In this problem you will be analyzing a property of an algorithm whose classification is not known for all poss…

python高级玩法_python pandas to_excel 高级玩法

DataFrame.to_excel(self, excel_writer, sheet_name‘Sheet1‘, na_rep‘‘,float_formatNone, columnsNone, headerTrue, indexTrue,index_labelNone, startrow0, startcol0, engineNone,merge_cellsTrue, encodingNone, inf_rep‘inf‘, verboseTrue,freeze_panesNone):1、f…

jquery对象和dom对象

我们都知道可以通过$(selector)的形式对所有页面的对象进行获取&#xff0c;但是获取到的对象和DOM对象有什么区别呢&#xff0c;下面探讨一下 1.DOM对象 var div1document.getElementById(div1); div1.innerHTMLtest; 这样表示获取一个dom对象&#xff0c;这个对象可以使用所有…

u-boot的Makefile分析

U&#xff0d;BOOT是一个LINUX下的工程&#xff0c;在编译之前必须已经安装对应体系结构的交叉编译环境&#xff0c;这里只针对ARM&#xff0c;编译器系列软件为arm-linux-*。 U&#xff0d;BOOT的下载地址&#xff1a; http://sourceforge.net/projects/u-boot 我下载的是1.1.…

Python学习入门基础教程(learning Python)--6.4 Python的list与函数

list是python下的一种数据类型&#xff0c;他和其他类型如整形、浮点型、字符串等数据类型一样也可作为函数的型参和实参来使用&#xff01; 1.list作为参数 list数据类型可以作为函数的参数传递给函数取做相应的处理&#xff0c;下例是统计“www.jeapedu.com”这个字符串里的非…

python 读取outlook_如何用 Python 读取 Outlook 中的电子邮件

从事电子邮件营销&#xff0c; 准入(opt-in)邮箱列表是必不可少的。你可能已经有了准入列表&#xff0c;同时还使用电子邮件客户端软件。如果你能从电子邮件客户端中导出准入列表&#xff0c;那这份列表想必是极好的。我使用一些代码来将 outlook 配置中的所有邮件写入一个临时…

Java代码服务器上下载图片_Java如何从服务器中下载图片

import java.io.IOException;import java.io.InputStream;import java.io.OutputStream;import java.net.URL;import java.net.URLConnection;import org.apache.commons.io.IOUtils;/*** 从服务器中下载图片** param fileName 图片地址* param response* return*/RequestMappi…

U-BOOT之一:BootLoader 的概念与功能

U-BOOT之一&#xff1a;BootLoader 的概念与功能 ——转自《U-BOOT移植S3C2440完全手册》 1.1嵌入式Linux 软件结构与分布 一般情况下嵌入式Linux 系统中的软件主要分为以下几部分&#xff1a; 1) 引导加载程序&#xff1a;其中包括内部ROM 中的固化启动代码和BootLoader 两部分…

设计模式之建造者模式(Builder)

建造者模式原理&#xff1a;建造模式主要是用于产生对象的各个组成部分&#xff0c;而抽象工厂模式则用于产生一系列对象&#xff0c;建造者模式而且要求这些对象的组成部分有序。 代码如下&#xff1a; #include <iostream> using namespace std;class Builder { public…