在Java中,在类内部可以定义成员变量与方法,还可以在类的内部定义类.这种在类的内部定义的类称为内部类.而内部类所在的类称为外部类.内部类的特点为:同样需要编译,故
有一个独立的.class文件,同样可以产生对象.
.java的文件不一定全是文件名和类名一致,只有public(公共类)型的类名才要求.java文件名和类名一致.同时,.java文件中只有一个public型的类,但可以有多个类(因为允许为内部类和其他类),因此,一个.java文件可以有多个.class文件.
内部类总的来说可以分为2种(按位置不同),即成员内部类和局部内部类.然后成员内部类的一个特例 是静态内部类,局部内部类的一个特例是匿名内部类.下面详细区分这几种内部类.
成员内部类是定义在某个类的内部,作为类成员.他在编译时生成的.class文件的 格式为: 外部类名$成员内部类名.class.在创建成员内部类的对象前,需要先实例化一个外部类的对象.成员内部类可以调用外部类的所有成员.
静态内部类是定义在某个类的内部,使用关键字static,作为类的静态成员.他在编译时生成的.class文件的格式为: 外部类名$静态内部名.class,在没有创建外部类对象的i时候,可以直接创建静态内部类的对象,同时,静态内部类可以引用外部类的静态成员变量或静态方法,但是不能引用外部的普通成员.
局部内部类是定义在某的方法内部的类.只能在方法内中使用,一旦方法执行完毕,局部内部类就会从内存中是释放.他在编译时生成的.class文件的格式为: 外部类名$1内部类名.class,直接在方法内部创建局部内部类的对象.
匿名内部类也是特殊的局部内部类,这种类没有类名字,匿名内部类的定义和对象的创建合并在一起,就想产生对象似的.他在编译时生成的.class文件的格式为: 外部类名$1.class.
下面举个例子来说明以上几种的用法:
public class OuterClass {
//成员内部类
public class InnerClass{
}
//静态内部类--成员内部类特例
public static class StaticInnerClass{
}
public void test(){
//局部内部类
class InnerClass{
public void world(){
}
}
InnerClass inn = new InnerClass();
inn.world();
//再定义一个局部内部类
class Inner1Class{
public void holle(){
}
}
Inner1Class inn1=new Inner1Class();
inn1.holle();
}
public void test1(){
//匿名内部类
new Object(){
public void hello(){
System.out.println("Hello World!");
}
}.hello();
}
}
public class TestMain {
public static void main(String[] args) {
//外部类对象
OuterClass out = new OuterClass(); //实例化一个外部类对象
//成员内部类
OuterClass.InnerClass in = out.new InnerClass(); //实例化成员内部类对象
//静态内部类
OuterClass.StaticInnerClass staticIn = new OuterClass.StaticInnerClass(); //实例化静态内部类对象
//局部内部类
out.test(); //由于局部内部类只需直接在声明完后就直接就在该方法内实例化对象,故可以直接调用
//匿名内部类
out.test1();
}
}