java的内部类(一)


总结与Thinking in Java,所以权当做我的读书笔记吧。

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

2.内部类的作用:(1)隐藏代码(2)可以和外部进行无缝通信(3)是代码清晰和优雅。

3.内部类的创建:(1)在外部类的静态方法里(书上说的是“非静态方法之外”),需要:外类的名字.内类的名字(2)外类其他情况中,可以和其他实例化类方法语法一样。

4.内部类有访问外部类的所有权限。不管是字段还是方法,就像自己的一样可以调用。此用处很多,在此举一个例子(是书上的源码,自己觉得很不错):

    

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++;
		}
	}
	private Selectors getIncance(){
		return new SequenceSelector();
	}
	public static void main(String[] args){
		Sequence s = new Sequence(10);
		Selector se = s.getIncance();
		for(int i = 0;i < 10;i++)
			s.add(Integer.toString(i));
		while(!se.end()){
			System.out.println("this is :" + se.current());
			se.next();
		}
	}
}

这是“迭代器模式”的例子。

  现在解释为什么可以随意访问外部类的所有。在外部类建立一个内部类时,内部类会自动捕获一个指向外部类的应用,这是编译器的事,不用我们管的。

5.如果在内部类中需要外部类的引用时,用类名.this;如果在外部类中没有4例子中那种的有getIncance()方法返回内部类时,这时创建内部类时用外部类对象.new 内部类的名字。4中说明了内部类之所以可以随意使用外部类的原因,所以内部类对象的创建是需要外部对象的。但是如果内部类是static(嵌套类)时就另当别论了。

6.我对内部类用的不多,所以这条也是很好奇。内部类可以是实现了外部类之外的接口的类。补充其他知识:(1)接口的所有成员自动设置为public。来个我自己写的栗子:

interface People
{
	void say(String word);
	void eat(String food);
}
class Thing
{
	 class LiLi implements People
	{
		public void say(String word){
			System.out.println("say:" + word);
		}
		public void  eat(String food){
			System.out.println("eat:" + food);
		}
	}
}
public class World
{
	public static void main(String[] args){
		Thing t = new Thing();
		People l = t.new LiLi();
		l.eat("提子");
	} 
}
       Thing里面的内部类除了是private类型的,World都可以访问到。还要说的是实现People接口的类LiLi里的方法只能是public的,因为上面已经说了接口的成员默认是public,而实现它的方法的权限智能比他高不能比它低。so。。。你懂得。

      如果LiLi肯为private,外面的一切都无法访问到LiLi里的东东了。

7.另补充一个概念知识,因我记性不好,别人还总问:从实现某个接口的对象得到对此接口的引用,和向上转型为这个对象的基类,效果是一样的。-------向上转型睡觉

你可能感兴趣的:(java,内部类)