1.内部类成员可以直接访问外部类的私有数据,而外部类不能访问内部类的实现细节
2.在非静态内部类里可以直接访问外部类的private成员,这是因为非静态内部类对象里保存了一份它寄存的外部类对象的引用。
3.非静态内部类对象必须寄存在外部类对象中,有内部类对象就一定有外部类对象,而有外部类对象则不一定有内部类对象
4.JAVA中不允许在非静态内部类中定义静态成员,但在静态内部类中可以定义静态成员和非静态成员
5.静态内部类不能访问外部类的实例成员,只能访问外部类的类成员(同样用static修饰的)
6.回调就是某个方法一旦获得内部类对象的引用后,就可以在合适的时候反过来调用外部类实例的方法
回调程序:
interface Teachable
{
void work();
}
public class Programmer
{
private String name;
public Programmer(){}
public Programmer(String name){
this.name=name;
}
public void setName(String name){
this.name=name;
}
public String getName(){
return name;
}
public void work(){
System.out.println(name+"敲键盘")
}
}
public class TeachableProgrammer extends Programmer
{
public TeachableProgrammer(){}
public TeachableProgrammer(String name){
super(name);
}
public void teach(){
System.out.println(getName()+"教书");
}
private class Closure implements Teachable
{
public void work(){
teach();
}
}
//返回一个非静态内部类引用,允许外部类通过该非静态内部类引用来回调外部类的方法
public Teachable getCallbackReference(){
return new Closure();
}
}
public class TestTP
{
public static void main(String[] args)
{
TeachableProgrammer tp=new TeachableProgrammer("吴倩");
tp.work();
tp.getCallbackReference().work();
}
}
测试程序产生一个TeachableProgrammer的对象tp,在TeachableProgrammer类中有一个产生内部类对象的方法getCallbackReference(),tp通过调用该方法产生一个内部类对象,并通过该内部类对象调用内部类方法work(),在work()中再调用外部类方法teach(),实现了回调
通过这样就可以输出既“敲键盘”,又“教书”