在java开发中或是看一些书籍中,经常会涉及到一些概念什么内部类、静态内部类、匿名内部类、成员类等等,往往分不清楚什么情况下是静态内部类还是匿名内部类。接下来就好好梳理下。
首先要先了解下什么是内部类,因为之后要讲到的类都属于内部类。所谓内部类就是在一个类中定义的类,就是内部类。
如何创建一个内部类:
1、像普通类定义一下在类的作用域下或是在类的某个方法中定义一个类
2、实现一个接口或抽象类
3、继承一个普通的类
要注意与创建一个普通类的区别。通过调用class.getName方法可以看到其名称都是包名+外部类名称+$+内部类名称,如com.OutClass$InnerClass。而普通类的名称是包名+外部类如com.OutClass
内部类特点:
内部类可以可以访问外部类的所有域,包括私有域(私有变量、私有方法等)。这是如何做到的呢?,查看内部类编译后的代码
class OutClass{
OutClass$InnerClass(OutClass,InnerClass);//包可见构造器
private OutClass$InnerClass(OutClass);//私有构造器,传入外部类
final OutClass this$0; //this$0存储外部类实例
}
那又是如何访问外部类的私有变量的呢?看代码
class OutClass{
private int a = 10;
}
编译后
class OutClass{
static int access$0(OutClass);//提供了静态方法
}
在内部类中打印a
System.out.println(a);
就等于是调用
System.out.println(access$0(this$0));
匿名类、成员类,局部类,静态内部类
他们都是内部类,Class提供了方法来判断
clazz.isAnnotation();//是否是匿名类
clazz.isMemberClass();//是否是成员类
clazz.isLocalClass();//是否是局部类
匿名类, 及没有名字的类,他的名称不同于其他内部类
com.OutClass$InnerClass,而是以数字代替com.OutClass$1、com.OutClass$2
哪些是匿名类呢,实现一个接口、继承一个抽象类或普通类
成员类,属于类的一个成员,可以是类或接口,如:
局部类,在某个方法中定义的类,他的所用域只限于这个方法。
静态内部类,及给内部类加上static修饰符后就是静态内部类(只有成员类可以加上static修饰符)
静态内部类并没有外部类的引用,因此不能访问外部类的非静态变量,但是可以访问外部类的静态变量,即使他是私有的。
参考:
http://www.cnblogs.com/jiangao/archive/2012/02/23/2364119.html