嵌套类(nested class)是java类的嵌套形式,一个类可以在另一个类中定义,例如:
class OuterClass{
...
class NestedClass{
...
}
}
嵌套类与外部类的成员是同等地位的,所以嵌套类就有4种级别的访问权限(与变量一样),而外部类只有public与friendly两种访问权限。使用嵌套类可以提高代码的可读性和可维护性,增强封装性,并增加类之间的逻辑关系。
嵌套类有静态的和非静态的两种,后者又叫内部类。内部类里又有两种特别形式,一种在方法体内定义的,称为局部内部类,一种是在方法体内定义的没有类名的内部类,称为匿名内部类。
下面就四种嵌套类举例:
1,静态嵌套类:静态嵌套类在外部类定义成员的地方定义,静态嵌套类可以定义自己的静态成员,只能访问外部类的静态成员,外部类要访问静态嵌套类只能通过类名。
class OuterClass{
...
//定义静态嵌套类
static class StaticNestedClass{
...
}
public static void main(String[] args){
//创建静态嵌套类的语法
OuterClass.StaticNestedClass = new OuterClass.StaticNestedClass();
}
}
2,内部类:内部类是非静态的嵌套类,不能定义自己的静态成员,内部类对象可以直接访问外部类的成员变量和方法。
class OuterClass{
...
//定义内部类,即非静态嵌套类
static class InnerClass{
...
}
public static void main(String[] args){
//创建内部类的语法:先创建外部类对象,在通过该对象创建内部类对象
OuterClass outerClass = new OuterClass();
outerClass.IneerClass = outerClass.new InnerClass();
}
}
3,局部内部类:不在外部类定义成员的地方定义,而是在某个方法体中定义(属于内部类的一种)。局部内部类不能再myMethod()方法外访问,所以更加隐蔽。
class OuterClass{
...
void myMethod(){ //包含局内内部类的方法
//定义局部内部类
static class InnerClass{
...
}
//创建局部内部类
InnerClass innerClass = new InnerClass();
}
}
4,匿名内部类(内部类的一种):匿名内部类比局部内部类更加隐蔽,它连名字都没有。匿名内部类可以用来继承一个类或者实现一个接口,但不能同时实现这两种功能。
class OuterClass{
...
//定义匿名内部类
public Abc abc(){ //类定义开始
return new Abc(){
private int x = 1;
public int add(){
return ++x;
}; //类定义结束
}
}
}
匿名内部类简单点理解:就是通过在定义的时候直接实例化去除了定义的名称。
本文是我在学习了《Java技术及其应用》之后,自己结合书本写下来的心得体会,如果有错的地方,请多多交流。
参考资料:《Java技术及其应用》 清华大学出版社 2009年第一版