四种内部类的使用
内部类有四种
- 成员内部类
- 静态内部类
- 局部内部类
- 匿名内部类
成员内部类
成员内部类是定义在类中的一个特殊的类,属于类的一个成员变量,包含内部类的类叫做外部类
class Outer{ //外部类
class Inner{} //成员内部类
}
成员内部类的访问控制修饰符可以是private,public,无,protected
成员内部类不能用static修饰,那样就变成了静态内部类
成员内部类中的变量和方法都不能是静态的,因为成员内部类不是静态的,其中有静态的属性和方法就意味着不需要新建对象就可以使用,但是如果直接使用,不新建外部类的对象的话,是没有办法使用的,因为成员内部类作为一个非静态变量,是不会在类加载的时候初始化的,而是在创建对象的时候初始化,直接使用是没办法使用的
同样的,成员内部类当中是没有psvm方法的。
成员内部类可以继承其他的类,包括外部类,这样就可以实现多继承
成员内部类可以访问外部类的所有属性和方法
编译之后会生成多个class文件
访问成员内部类
//Inner1 a = new Inner1(); //错误
//Outer.Inner1 a = new Outer.Inner1(); //错误
//Outer.Inner1 a = new Outer.Inner1(); //错误
Outer out = new Outer();
Outer.Inner1 a = out.new Inner1();
Inner1 b = out.new Inner1();
一定要先创建外部类对象才能创建成员内部类
静态内部类
静态内部类就是静态的成员变量,但是有几点不同
静态内部类用static修饰
静态内部类的访问修饰符有protected、private、public、无
静态内部类可以继承其它类,包括外部类
静态内部类在类加载的时候就加载如内存,所以可以有静态属性和静态方法
静态内部类可以访问外部类的静态属性和方法
创建静态内部类
Outer.Inner inner = new Outer.Inner();
局部内部类
局部内部类是定义在方法内部的类
局部内部类不能有public、protected、private访问修饰符
局部内部类可以继承其他类,包括外部类
局部内部类不能有静态属性和静态方法
局部内部类可以使用方法的局部变量,但是一定要是final修饰的,也就是常量,因为如果是变量,那么方法出栈之后变量就会回收,这时候可能局部内部类还处于存活的状态(比如开了一个线程?),那么局部内部类就找不到这个变量了,所以需要是常量
局部内部类一般不需要直接使用,而是在方法内部就封装好了用途,只需要调用该方法
匿名内部类
匿名内部类就是没有名字的局部内部类
匿名内部类没有class、extends、implements
匿名内部类一般隐式的继承一个类
abstract class Outer{}
class Main{
public static void test(Outer){}
public static void main(String[] args){
test(new Outer{
int a;
});
}
直接用一个new建立一个Outer对象,传递给test方法。java会自动创建一个匿名内部类,并且转型为Outer类。