李林超博客
首页
归档
留言
友链
动态
关于
归档
留言
友链
动态
关于
首页
Java
正文
链接到外部类
Leefs
2019-10-31 PM
3014℃
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://www.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
标签云
MySQL
Spark
Azkaban
Hadoop
SQL练习题
队列
工具
Golang
Spark SQL
Netty
JavaScript
数据结构
持有对象
排序
Nacos
Flume
散列
正则表达式
RSA加解密
Quartz
BurpSuite
DataX
Shiro
设计模式
VUE
JavaWEB项目搭建
Beego
容器深入研究
MyBatis
FastDFS
友情链接
申请
范明明
庄严博客
Mx
陶小桃Blog
虫洞
自从用了idea
我变懒了
重新回到原始状态