Java之内部类链接到外部类(外围类)详解(附源码)
来源:互联网 发布:ug编程时不允许空标记 编辑:程序博客网 时间:2024/06/05 02:14
前言
到目前为止,内部类似乎还只是一种名字隐藏和组织代码的模式。这些是很有用,但还不是最引人注目的,它还有其他用途。当生成一个内部类的对象时,此对象与制造它的外围对象之间就有了一种联系,所以它能访问其外围对象的所有成员,而不需要任何特殊条件。此外,内部类还拥有其外围类的所有元素的访问权。下面的例子说明了这点:
示例源码
package com.mufeng.thetenthchapter;interface Selector {boolean end();Object current();void next();}public class Sequence {private Object[] items;private int next = 0;public Sequence(int size) {// TODO Auto-generated constructor stubitems = new Object[size];}public void add(Object x) {if (next < items.length) {items[next++] = x;}}private class SequenceSelector implements Selector {private int i = 0;@Overridepublic boolean end() {// TODO Auto-generated method stubreturn i == items.length;}@Overridepublic Object current() {// TODO Auto-generated method stubreturn items[i];}@Overridepublic void next() {// TODO Auto-generated method stubif (i < items.length) {i++;}}}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();}}}
输出结果
0 1 2 3 4 5 6 7 8 9
源码解析
Sequence类只是一个固定大小的Object的数组,以类的形式包装了起来。可以调用add()在序列末尾增加新的Object(只要还有空间)。要获取Sequence中的每一个对象,可以使用Selector接口。Selector允许你检查序列是否到末尾了(end()),访问当前对象(current()),以及移到序列中的下一个对象(next())。因为Selector是一个接口,所以别的类可以按它们自己的方式来实现这个接口,并且别的方法能以此接口为参数,来生成更加通用的代码。
这里,SequenceSelector是提供Selector功能的private类。可以看到,在main()方法中创建了一个Sequence,并向其中添加了一些String对象,然后通过调用selector()获取一个Selector,并用它在Sequence中移动和选择每一个元素。
最初看到SequenceSelector,可能会觉得它只不过是另一个内部类罢了。但请仔细观察它,注意方法end()、current()和next()都用到了items,这是一个引用,它并不是SequenceSelector的一部分,而是外围类中的一个private字段。然而内部类可以访问其外围类的方法和字段,就像自己拥有它们似的,这带来了很大的方便,就如前面的例子所示。
所有内部类自动拥有对其外围类所有成员的访问权。这是如何做到的呢?当某个外围类的对象创建了一个内部类对象时,此内部类对象必定会秘密地捕获一个指向那个外围类对象的引用。然后,在你访问此外围类的成员时,就是用那个引用来选择外围类的成员。幸运的是,编译器会帮你处理所有的细节,但你现在可以看到:内部类的对象只能在与其外围类的对象相关联的情况下才能被创建(就像你应该看到的,在内部类是非static类时)。构建内部类对象时,需要一个指向其外围类对象的引用,如果编译器访问不到这个引用就会报错。不过绝大多数时候这都无需程序员操心。
3 0
- Java之内部类链接到外部类(外围类)详解(附源码)
- Java之内部类语法详解(附源码)
- Java之内部类的初级应用详解(附源码)
- Java之内部类与向上转型详解(附源码)
- Java之内部类可以被覆盖吗详解(附源码)
- Java之内部类的继承(附源码)
- java内部类读书笔记-链接到外部类
- JAVA中的内部类链接到外部类
- 内部类之链接到外部类
- Java之局部内部类和匿名内部类的区别详解(附源码)
- Java之内部类详解
- java炒冷饭系列09 内部类的创建和链接到外部类
- 内部类的使用2--链接到外部类
- C++之内部类与外部类(嵌套类)及友元
- 链接到外部类
- java基础之内部类和外部类的关系和运用
- java内部类----安全问题-----访问外围类的私有变量
- JAVA基础之内部类详解
- poj 1511 Invitation Cards(spfa + 邻接表 + 反向思维t)
- MVC过滤器-AOP思想初探
- Android中的ExpandableListView介绍
- C/C++头文件大全
- 百练 4130 Saving Tang Monk [BFS+优先队列+状态压缩]
- Java之内部类链接到外部类(外围类)详解(附源码)
- ap = a (mod p)
- 【9701】求余运算
- 按照圆周顺时针布局多个view
- GIT使用
- opencv之边缘检测
- CI框架中浏览量(点击次数)
- Power of Two
- HDU Problem - 5363 Key Set 【快速幂】