1.内部类拥有外围类的所有元素的访问权
package aaaa;
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 obj){
if(next<items.length)
items[next++] = obj;
}
public class SequnceSelector implements Selector{
int i=0;
@Override
public boolean end() {
return i == items.length;
}
@Override
public Object current() {
return items[i];
}
@Override
public void next() {
if(i<items.length)
i++;
}
}
public Selector selector(){
return new SequnceSelector();
}
public static void main(String[] args) {
Sequence ss = new Sequence(10);
for(int i=0;i<10;i++){
ss.add(i);
}
Selector selector = ss.selector();
while(!selector.end()){
System.out.print(selector.current());
selector.next();
}
}
}
结果:0123456789
2.想要创建内部类的对象,只能使用外部类对象创建,不能直接new
//Selector selector = ss.selector();
Selector selector = ss.new SequnceSelector();
上面代码中selector为内部类的对象,ss为外部类对象。
内部类、接口的实例化方法详见 http://blog.sina.com.cn/s/blog_ac843e3301015nsb.html
3.局部内部类建立在一个方法中或者某个域中,不能有访问说明符
4.匿名类
如果定义了匿名类,并且希望他使用一个在其外部定义的对象,那么这个参数的引用是final的,
可以利用实现抽象类的方法创建匿名类,这样可以自己定义构造方法,但构造方法中需要的参数不一定是final的,因为此参数不一定会用到
5.匿名类可以扩展类、实现类,只能实现一个接口
6.闭包&回调
我的理解:闭包:内部类对象可以控制所有外部元素。回调:外部类对象获得内部类对象,只能调用外部public的方法。
7.继承内部类
class WithInner {
class Inner{}
}
public class InheritInner extends WithInner.Inner{
//不能用默认的构造方法,因为想要创建内部类对象,需要外部类对象
InheritInner(WithInner wi){
wi.super();
}
public static void main(String[] args) {
// TODO Auto-generated method stub
WithInner wi = new WithInner();
InheritInner ii = new InheritInner(wi);
}
}
8."覆盖"内部类
把内部类看成是外部类的一个方法,如果继承了外部类之后“重写内部类”,并没有什么卵用。代码如下
class Egg{
private Yolk y;
protected class Yolk{
public Yolk() {System.out.println("Egg.Yolk 构造方法");}
}
public Egg(){
System.out.println("New Egg()");
y=new Yolk();
}
}
public class BigEgg extends Egg{
public class Yolk{
public Yolk() {System.out.println("BigEgg.Yolk 构造方法");}
}
public static void main(String[] args) {
// TODO Auto-generated method stub
BigEgg bigegg = new BigEgg();
bigegg.new Yolk();
}
}
输出:
New Egg()
Egg.Yolk 构造方法
BigEgg.Yolk 构造方法