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