通常情况下,把不同的类组织在不同的包下,对于一个包下的类来说,它们父子关系。但是,还有一种类,它被定义在一个类的内部,被称为内部类。Java中的内部类分为以下几种:
1、成员内部类
语法格式:
[修饰符] class 外部类{
[修饰符] class 内部类{ }
}
成员内部类特点:
成员内部类可以无条件访问外部类的所有成员属性和成员方法(private和static);
如果要访问外部类的同名成员,访问方式有两种:一是外部类.this.成员变量,二是外部类.this.成员方法;
在外部类中要访问内部类的成员,必须先创建一个成员内部类的对象,再通过指向这个对象的引用来访问;
内部类的对象实例不能单独存在,必须依附于一个外部类的对象实例;
内部类可以拥有四种权限修饰符和final修饰符;
成员内部类不能存在static的变量和方法,可以定义常量;
成员内部类编译后也会生成一个.class文件,文件名是外部类名$内部类名.class。
实例化方式:Outer outer = new Outer();
Outer.Inner inner = outer.new Inner();
2、局部内部类
语法格式:
[修饰符] class 外部类{
[修饰符] 返回值类型 方法名([形参列表]){
[final/abstract] class 内部类{
}
}
}
局部内部类特点:
局部内部类就像方法里面的一个局部变量一样,不能有public,protected,private和static;
局部内部类只能访问局部final变量;
局部内部类在定义域内多次使用,但是只能在声明它的那个方法里使用;
局部内部类编译后会生成一个.class文件,文件名是外部类名.编号局部内部名。
3、匿名内部类
语法格式:
new 父类名或者接口名(){
// 方法重写
@Override
public void method() {
// 执行语句
}
};
匿名内部类特点:
一般使用匿名内部类的方法来编写四件监代码;
匿名内部类不能有访问修饰符和static;
匿名内部类是唯一一种没有构造器的类;
匿名内部类只能在定义处使用一次。
4、静态内部类
语法格式:
[修饰符] class 外部类{
[其他修饰符] static class 内部类{ }
}
静态内部类特点:
不需要依赖于外部类,不能使用外部类的非static成员变量(方法);
静态内部类可以使用四种权限修饰符和final修饰符。
实例化方式:StaticOuter.StaticInner staticInner = new StaticOuter.StaticInner();