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