Java之内部类链接到外部类(外围类)详解(附源码)

Posted mufeng_慕枫

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java之内部类链接到外部类(外围类)详解(附源码)相关的知识,希望对你有一定的参考价值。

前言


       到目前为止,内部类似乎还只是一种名字隐藏和组织代码的模式。这些是很有用,但还不是最引人注目的,它还有其他用途。当生成一个内部类的对象时,此对象与制造它的外围对象之间就有了一种联系,所以它能访问其外围对象的所有成员,而不需要任何特殊条件。此外,内部类还拥有其外围类的所有元素的访问权。下面的例子说明了这点:

示例源码


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 stub
		items = new Object[size];
	

	public void add(Object x) 
		if (next < items.length) 
			items[next++] = x;
		
	

	private class SequenceSelector implements Selector 
		private int i = 0;

		@Override
		public boolean end() 
			// TODO Auto-generated method stub
			return i == items.length;
		

		@Override
		public Object current() 
			// TODO Auto-generated method stub
			return items[i];
		

		@Override
		public void next() 
			// TODO Auto-generated method stub
			if (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类时)。构建内部类对象时,需要一个指向其外围类对象的引用,如果编译器访问不到这个引用就会报错。不过绝大多数时候这都无需程序员操心。


以上是关于Java之内部类链接到外部类(外围类)详解(附源码)的主要内容,如果未能解决你的问题,请参考以下文章

Java之内部类的初级应用详解(附源码)

Java之内部类的继承(附源码)

Java之内部类语法详解(附源码)

Java之内部类与向上转型详解(附源码)

Java之局部内部类和匿名内部类的区别详解(附源码)

Java面向对象之内部类的详解