Java编程思想:为什么要使用内部类
public class Test { public static void main(String[] args) { Callbacks.test(); } } /* 为什么需要内部类: 1.可以认为内部类提供了某种进入外围类的窗口 2.每个内部类都能独立的继承一个接口的实现,所以无论外围类是否已经继承了某个 接口的实现,对于内部类都是没有影响的 3.可以解决多重继承的问题 内部类一些其他的优点: 1.内部类可以有多个实例,每个实例都有自己的状态信息,并且与其他外围类对象的信息相互独立 2.在单个外围类中,可以让多个内部类以不同的方式实现同一个接口,或继承同一个类。 3.创建内部类对象的时刻并不依赖外部类对象的创建(这个有问题吧?) 4.内部类没有令人疑惑的“is-a”关系,它就是一个独立的实体 */ interface A { } interface B { } class X implements A,B{} class Y implements A{ B makeB(){return new B(){}; }; } class D {} abstract class E {} class Z extends D{ E makeE(){ return new E(){}; } } /* 需求: 人们认为Java应该包含某种类似指针的机制,以允许回调。通过回调,对象能够携带 一些信息,这些信息允许它在稍后的某个时刻调用初始的对象。(将函数指针传给这 个对象,然后由这个对象通过函数指针调用初始对象的方法。) 案例分析: 我感觉这个案例好复杂啊,莫名奇妙的类关系。Callee翻译为被召集者,Caller翻译为 召集者。召集者手中持有一个实现了Increment的对象,用来记录自己召集的人被召集了 多少次,这就想每个包工头手上有一个人,它分配活给这个工人,同时还要记录下这个工 人干了多少次活。对于callee1,它直接实现了Increment接口,从单一职能的设计原 则上来讲,这种设计分工并不明确。对于callee2,由于系统强迫它继承了MyIncrement (这其中涉及到方法名冲突方面的问题,我还没看到这部分,理论上,我觉得也可以去实现 一下Increment接口,做实验也确实可以),而且MyIncrement有个方法,系统要求必须 在数据增加时调用,这时候我们就使用回调了 */ interface Incrementable { void increment(); } /* 一种非常简陋的方案 */ class Callee1 implements Incrementable { private int i = 0; @Override public void increment() { i++; System.out.println(i); } } /* 利用内部类实现的一种方案 */ class MyIncrement { public void increment() { System.out.println("Other operation..."); } static void f(MyIncrement mi){mi.increment();} } class Callee2 extends MyIncrement{ private int i = 0; public void increment() { super.increment(); i++; System.out.println(i); } private class Closure implements Incrementable { @Override public void increment() { Callee2.this.increment(); } } Incrementable getCallbackReference() { return new Closure(); } } /* 需求部分 */ class Caller{ private Incrementable callbackReference; public Caller(Incrementable callbackReference) { this.callbackReference = callbackReference; } void go() { callbackReference.increment(); } } class Callbacks { public static void test() { Callee1 c1=new Callee1(); Callee2 c2=new Callee2(); MyIncrement.f(c2); Caller caller1 = new Caller(c1); Caller caller2 = new Caller(c2.getCallbackReference()); caller1.go(); caller1.go(); caller2.go(); caller2.go(); } }
Java编程思想:为什么要使用内部类的更多相关文章
- Java编程思想学习(八) 内部类
可以将一个类的定义放在另一个类的定义内部,这就是内部类. 内部类的定义是简单的,但是它的语法确实很是复杂,让人不是很好理解.下面就内部类做一个小结. 一.内部类的分类 总的来讲内部类分为普通内部类,匿 ...
- Java编程思想重点笔记(Java开发必看)
Java编程思想重点笔记(Java开发必看) Java编程思想,Java学习必读经典,不管是初学者还是大牛都值得一读,这里总结书中的重点知识,这些知识不仅经常出现在各大知名公司的笔试面试过程中,而 ...
- Java编程思想读书笔记之内部类
现在是够懒得了,放假的时候就想把这篇笔记写出来,一直拖到现在,最近在读<Java编程思想>,我想会做不止这一篇笔记,因为之前面试的时候总会问道一些内部类的问题,那这本书的笔记就从内部类开始 ...
- java编程思想
Java编程思想,Java学习必读经典,不管是初学者还是大牛都值得一读,这里总结书中的重点知识,这些知识不仅经常出现在各大知名公司的笔试面试过程中,而且在大型项目开发中也是常用的知识,既有简单的概念理 ...
- Java编程思想 (1~10)
[注:此博客旨在从<Java编程思想>这本书的目录结构上来检验自己的Java基础知识,只为笔记之用] 第一章 对象导论 1.万物皆对象2.程序就是对象的集合3.每个对象都是由其它对象所构成 ...
- Java 编程思想 Chapter_14 类型信息
本章内容绕不开一个名词:RTTI(Run-time Type Identification) 运行时期的类型识别 知乎上有人推断作者是从C++中引入这个概念的,反正也无所谓,理解并能串联本章知识才是最 ...
- Java编程思想(前十章)
Java编程思想 有C++编程基础的条件下, 前10章可以快速过一下,都是基本语法,不需要花太多时间. 着重中后段的一些章节,类型信息.泛型.容器.IO.并发等. 中文翻译版 阅读地址 对于一个架构师 ...
- 《Java编程思想第四版完整中文高清版.pdf》-笔记
D.2.1 安插自己的测试代码 插入下述“显式”计时代码,对程序进行评测: long start = System.currentTimeMillis(); // 要计时的运算代码放在这儿 long ...
- 《Java编程思想第四版》附录 B 对比 C++和 Java
<Java编程思想第四版完整中文高清版.pdf>-笔记 附录 B 对比 C++和 Java “作为一名 C++程序员,我们早已掌握了面向对象程序设计的基本概念,而且 Java 的语法无疑是 ...
- Java编程思想中关于闭包的一个例子
Java编程思想中的一个例子,不是很理解使用闭包的必要性,如果不使用闭包,是不是有些任务就不能完成?继续探索. package InnerClass; interface Incrementable ...
随机推荐
- CSS技巧分享:如何用css制作横排二级下拉菜单
原文:CSS技巧分享:如何用css制作横排二级下拉菜单 导航菜单是每个网站所必备的功能,也是每个学习制作网站的朋友所必须接触的,如何用css样式制作一个简单漂亮的二级下拉菜单呢,下来小编就一步一步教大 ...
- Elasticsearch ML
Elastic公司在收购了Prelert半年之后,终于在Elasticsearch 5中推出了Machine Learning功能.Prelert本身就擅长做时序性数据的异常检测,从这点上讲也比较契合 ...
- 【算法随记三】小半径中值模糊的急速实现(16MB图7.5ms实现) + Photoshop中蒙尘和划痕算法解读。
在本人的博客里,分享了有关中值模糊的O(1)算法,详见:任意半径中值滤波(扩展至百分比滤波器)O(1)时间复杂度算法的原理.实现及效果 ,这里的算法的执行时间和参数是无关的.整体来说,虽然速度也很快, ...
- C语言实现常用数据结构——队列
#include<stdio.h> #include<stdlib.h> #define MAX_SIZE 10 /* 用一个动态数组来实现队列 */ typedef stru ...
- shell日期整理
date 当前日期+时间 # 日期格式化:date+"" - date +"%Y%m%d" 不带横杠分隔符的日期20160107 date +"%Y% ...
- Centos 7 防火墙 firewalld 简单使用说明
1.firewalld简介 firewalld是centos7的一大特性,最大的好处有两个:支持动态更新,不用重启服务:第二个就是加入了防火墙的“zone”概念 2.firewalld命令行界面管 ...
- 基于 HTML5 Canvas 的元素周期表展示
前言 之前在网上看到别人写的有关元素周期表的文章,深深的勾起了一波回忆,记忆里初中时期背的“氢氦锂铍硼,碳氮氧氟氖,钠镁铝硅磷,硫氯氩钾钙”.“养(氧)龟(硅)铝铁盖(钙),哪(钠)家(钾)没(镁)青 ...
- Scala 学习之路(九)—— 继承和特质
一.继承 1.1 Scala中的继承结构 Scala中继承关系如下图: Any是整个继承关系的根节点: AnyRef包含Scala Classes和Java Classes,等价于Java中的java ...
- Scala 学习之路(二)—— 基本数据类型和运算符
一.数据类型 1.1 类型支持 Scala 拥有下表所示的数据类型,其中Byte.Short.Int.Long和Char类型统称为整数类型,整数类型加上Float和Double统称为数值类型.Scal ...
- Storm 学习之路(二)—— Storm核心概念详解
一.Storm核心概念 1.1 Topologies(拓扑) 一个完整的Storm流处理程序被称为Storm topology(拓扑).它是一个是由Spouts 和Bolts通过Stream连接起来的 ...