Thursday, April 23, 2009

匿名类

在类中还可以再定义类,称之为内嵌类或嵌套类。

非静态的内嵌类可以分为3种:成员内嵌类、区域内嵌类、匿名内嵌类。

内嵌类的主要目的,就是对外部隐藏类的存在性。

成员内嵌类和区域内嵌类

使用内嵌类的好处:

1, 内嵌类可以直接存取其所在类中的私用成员;

2, 当某个Slave类完全只服务于一个Master类时,可以将之设置为内嵌类,这样使用Master类的人就不用知道Slave的存在。

3, 像在“静态工厂”模式中,对调用静态方法的对象隐藏返回对象的实现细节或产生方式。

public class PointDemo {

private class Point{

private int x,y;

public Point(){

}

public void setPoint(int x,int y){

this.x=x;

this.y=y;

}

public int getX(){return x;}

public int getY(){return y;}

}

private Point[] points;

public PointDemo(int length){

points=new Point[length];

for(int i=0;i<points.length;i++){

points[i]=new Point();

points[i].setPoint(i*5, i*5);

}

}

public void showPoints(){

for(int i=0;i<points.length;i++){

System.out.printf("Point[%d]: x=%d,y=%d%n",i,points[i].getX(),points[i].getY());

}

}

}

程序中假设Point类只服务于PointDemo ,外界不必知道Point类的存在,只要知道如何实现PointDemo的实例就可以了。

public class PointShow {

public static void main(String[] args) {

PointDemo demo=new PointDemo(5);

demo.showPoints();

}

}

在文件管理方面,成员内嵌类在编译完成之后,所产生的文件名称为“外部类名称$内嵌类名称.class”所以编译后会产生两个文件:PointDemo.class PointDemo$Point.class

区域内嵌类的使用与成员内嵌类类似。区域内嵌类定义于一个方法中,类的可视范围与生成的对象仅限于给方法中。

内部类还可以被声明为static,不过由于是ststic,它不能存取外部类的方法,而必须通过外部类所生成的对象来进行调用。被声明为static的内部类,事实上也可以看作是另一种名称空间的管理方式

匿名内嵌类:

内嵌匿名类可以不声明类名称,而使用new直接产生一个对象,它们可以是继承某个类或实现某个接口,

package InnerClass;

public class AnonymousClassDemo {

public static void main(String[] args) {

Object obj=

new Object(){

public String toString(){

return "匿名类对象";

}

};

System.out.println(obj);

}

}

注意,如果要在内嵌匿名类中使用外部的区域变量,变量在声明时必须为final

原因:区域变量并不是真正被拿来在内嵌匿名类中使用,区域变量被匿名类复制作为数据成员来使用。由于真正在匿名类中的区域变量是复制品,即使在内嵌匿名类中对区域变量做了修改,也不会影响区域变量。事实上也通不过编译器的检查。

在文件管理方面,内嵌匿名类在编译完成之后会产生“外部类名称$编号.class”,编号为:123……n,每个编号n的文件对应于第n个匿名类

No comments:

Post a Comment