李林超博客
首页
归档
留言
友链
动态
关于
归档
留言
友链
动态
关于
首页
Java
正文
链接到外部类
Leefs
2019-10-31 PM
2927℃
2条
# 链接到外部类 ### 前言 刚在前面讲过创建内部类,现在我们跟着《Java编程思想》往后走,进行下一节。 ### 一、内部类的用途 当你生成一个内部类的对象时,此对象与制造它的外围类的对象(enclosing object)之间就有了一种联系,所以它能访问其外围对象的所有成员,而不需要任何特殊条件。此外,内部类还拥有其外围类的所有元素的访问权。 ### 二、代码举例 > 代码 ```java //选择器 interface Selector { boolean end(); Object current(); void next(); } public class Sequence { private Object[] items; private int next = 0; //外部类的Sequence方法,用来对数组进行实例化操作 public Sequence(int size) { items = new Object[size]; } //在数组中添加数据 public void add(Object x) { if(next < items.length) items[next++] = x; } /** * 内部类SequenceSelector提供了某种访问容器中对象的机制。 * 内部类访问items,这个私有的外围类成员 * */ private class SequenceSelector implements Selector{ private int i = 0; //作为结束符,用来判断是i的值和外部类订一份方法items的长度是否相等,如果相等就返回true @Override public boolean end() { return i == items.length; } //返回数组中items在i角标位置所存储的数据 @Override public Object current() { return items[i]; } //对i进行++操作,让角标每次往后移动0一位 @Override public void next() { if(i < items.length) i++; } } //selector:外部类的一个方法,返回一个指向内部类对象的引用 public Selector selector(){ return new SequenceSelector(); } public static void main(String[] args) { Sequence sequence = new Sequence(10); for(int i = 0; i < 10; i++) sequence.add(Integer.toString(i)); //下面的程序则是某种实现访问容器中元素的机制 Selector selector = sequence.selector(); while(!selector.end()) { System.out.print(selector.current()+" "); selector.next(); } } } ``` > 运行结果 ```java 0 1 2 3 4 5 6 7 8 9 ``` > 代码分析 + 1.`Selector`接口相当于一个选择器,里面有`end()`、`current()`、`next()`等抽象方法。 + 2.外部类`Sequence`中私有化一个Object类型的数组 + 3.外部类的`Sequence`方法,用来对数组进行实例化操作 + 4.外部类的add()方法,用来在数组中添加数据 + 5.内部类`SequenceSelector`提供了某种访问容器中对象的机制 + 6.内部类访问`items`,这个私有的外围类成员 + 7.内部类中的方法end(),作为结束符,用来判断是i的值和外部类订一份方法items的长度是否相等,如果相等就返回true + 8.current()返回数组中items在i角标位置所存储的数据 + 9.next()对i进行++操作,让角标每次往后移动0一位 + 10.selector:外部类的一个方法,返回一个指向内部类对象的引用 上方代码用来说明链接到外部类当生成一个内部类的对象时,此对象与制造它的外围类对象(enclosing object)之间就有了一种联系,所以它能访问其外围类的所有成员,而不需要任何特殊条件。而且容器中添加元素,和从容器中取出数据是相互独立的两类工作,互不影响。 ### 总结 `Sequence` 类只是一个固定大小的 Object 数组,以类的形式包装了起来。你可以调用 `add()`,在序列的尾端增加一个新的 Object(只要还有空间)。要获取 `Sequence` 中的每 一个对象,可以使用 `Selector` 接口,方法 `end()`允许你检查序列是否到末尾了,`current()` 查看当前对象,`next()` 移到序列中的下一个对象。因为 `Selector` 是一个接口,所以别的 类可以按它们自己的方式来实现这个接口,并且许多方法能以此接口为参数,来生成通用 的代码。 这里,`SequenceSelector`是提供 `Selector` 功能的 `private` 类。可以看到,在 main()中创建了一 个 `Sequence`,并向其中添加了一些 String 对象。然后通过调用 `selector()`获取一个 `Selector`,并用它在 `Sequence` 中移动和选择每一个元素。 最初看到 `SequenceSelector`,可能会觉得它只不过是另一个内部类罢了。但请仔细观察它。注意 方法 `end()`,`current()`,和 `next()`都用到了 objects,这是一个引用,它并不是 `SequenceSelector` 的一部分,而是外围类的一个 private 成员。所以内部类可以访问其外围类的方法和属性, 就像自己拥有它们似的。这带来了很大的方便,就如前面的例子所示。 **内部类的对象只能在与其外围类的对象相关联的情况下才能被创建。构建内部类对象时,需要一个指向其外围类对象的引用,如果编译器访问不到这个引用就会报错。**
标签:
Java
,
Java编程思想
,
JavaSE
非特殊说明,本博所有文章均为博主原创。
如若转载,请注明出处:
https://lilinchao.com/archives/118.html
上一篇
使用IDEA创建Filter
下一篇
使用.this与.new
取消回复
评论啦~
提交评论
已有 2 条评论
岳茂林
自从用了idea
我变懒了
回复
2019-11-01 15:22
Leefs
博主
@岳茂林
重新回到原始状态
回复
2019-11-01 22:54
栏目分类
随笔
2
Java
326
大数据
229
工具
31
其它
25
GO
47
标签云
Spark SQL
设计模式
随笔
HDFS
Eclipse
数据结构
持有对象
JVM
Yarn
递归
并发线程
微服务
栈
Python
Spark Streaming
Map
JavaWeb
Kibana
数据结构和算法
Spring
正则表达式
SpringBoot
Jquery
Spark RDD
BurpSuite
高并发
Elastisearch
Git
锁
JavaScript
友情链接
申请
范明明
庄严博客
Mx
陶小桃Blog
虫洞
自从用了idea
我变懒了
重新回到原始状态