在类中还可以再定义类,称之为内嵌类或嵌套类。
非静态的内嵌类可以分为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”,编号为:1、2、3……n,每个编号n的文件对应于第n个匿名类
No comments:
Post a Comment