首页 > 代码库 > Java内部类

Java内部类

Java内部类

可以将一个类的定义放在另一个类的定义内部,这就是内部类。

内部类是一种非常有用的特性,因为它允许你把一些逻辑相关的类组织在一起,并控制位于内部类的可视性。内部类与组合是完全不同的概念。

import java.util.*;

public class Parcel2{
	class Contents{
		private int i=11;
		public int value(){
			return i;
		}
	}

	class Destination{
		private String label;
		Destination(String whereTo){
			label=whereTo;
		}
		String readLabel(){
			return label;
		}
	}

	public Destination to(String dest){
		return new Destination(dest);
	}

	public Contents contents(){
		return new Contents();
	}

	public void ship(String dest){
		Contents c=contents();
		Destination d=to(dest);
		System.out.println(d.readLabel());
	}

	public static void main(String[] args){
		Parcel2 p=new Parcel2();
		p.ship("HongKong");
		Parcel2 q=new Parcel2();
		Parcel2.Contents c=q.contents();
		Parcel2.Destination d=q.to("Beijing");
	}
}

当生成一个内部类的对象时,此对象与制造它的外围对象之间就有了一种联系,所以它能访问其外围对象的所有成员,而不需要任何特殊条件。此外,内部类还拥有外部类的所有元素的访问权。

import java.util.*;

interface Selector{
	boolean end();
	Object current();
	void next();
}

public class Sequence{
	private Object[] items;
	private int next=0;
	public Sequence(int size){
		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;
		public boolean end(){
			return i==items.length;
		}
		public Object current(){
			return items[i];
		}
		public void next(){
			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();
		}
		System.out.println();
	}
}

最初看到SequenceSelector,可能觉得它只不过是一个内部类罢了。但请仔细观察它,注意方法end(),current(),next(),都用到了objects,这是一个引用,它并不是SequenceSelector的一部分,而是外围类中的一个private字段。然而内部类可以访问外部类的方法和字段,就像自己拥有它们似的,这带来了很大方便。

所以内部类自动拥有对其外围类所有成员的访问权。这是如何做到的呢?当某个外围类的对象创建一个内部类对象时,此内部类对象必定会秘密地捕获一个指向那个外围类对象的引用。然后,你在访问此外围类的成员时,就是用那个引用来选择外围类的成员。因此内部类对象只能在与其外围类对象相关联的情况下才能被创建(内部类为非static时)。


嵌套类

如果不需要内部类对象与外围类对象之间有联系,那么可以将内部类声明为static,这通常称为嵌套类。嵌套类意味着:

1)要创建嵌套类的对象,并不需要创建外围类的对象;

2)不能从嵌套类的对象中访问非静态的外围类的对象;

嵌套类与普通内部类还有一个区别:普通内部类的字段与方法,只能放在类的外部层次上,所以普通内部类不能有static数据和static字段,也不能包含嵌套类;但是嵌套类可以包含所有这些东西。


为什么需要内部类?

每个内部类都能独立的继承自一个接口的实现,所以无论外围类是否已经继承了某个接口的实现,对于内部类都没有影响。

内部类使得多重继承的解决方案变得完整。接口解决了部分问题,而内部类有效的实现了“多重继承”,也就是说内部类允许继承多个非接口类型。


Java内部类