java 内部类

来源:互联网 发布:为知笔记产品经理 招聘 编辑:程序博客网 时间:2024/04/26 12:15

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 构造方法

0 0