想要区分出内部类,那首先就需要知道什么是外部类。只有直接归属于文件第一级的类才能算作是外部类,而其他的都可以归属于内部类。注意,这里的类可以是普通类,接口、抽象类或者枚举类。
内部类又可以分为四种:非静态内部类,静态内部类,局部内部类,匿名内部类。
其中的非静态内部类和静态内部类可以看作是成员变量,所以就可以使用四种权限访问修饰符了,不像外部类,只能够使用public和friendly(默认)。
而局部内部类和匿名内部类只能看作是局部变量,所以是不可以使用权限访问修饰符的。
public class OuterClass { // 外部类。
public class InnerClass { // 非静态内部类,可以使用权限访问修饰符,因为被看作是成员变量。
// 1.可以访问外部类的任意成员变量和成员函数,不用管访问权限修饰符。
// 2.但是自己创建成员变量的时候,不可以创建带有static的成员变量。
}
static class InnerStaticClass { // 静态内部类,可以使用权限访问修饰符,因为被看作是成员变量。
// 1.在静态内部类中只能访问外部类中静态的成员函数和成员变量。
}
public void function() {
class InnerClass2 { // 局部内部类,并且不可以使用权限访问修饰符,因为被看作是局部变量。
// 1.可以访问外部类的所有成员变量和成员方法。
}
InnerClass3 ic = new InnerClass3() { // 匿名内部类,并不需要创建实际类,而是直接利用已有的类、接口、抽象类等创建对象,之后重写目标函数,这样就能得到特定的目标类对象。
@Override
public void override_function() {
}
};
}
}
局部内部类和匿名内部类的区别在于,局部内部类相当于在函数等局部位置直接创建了一个类,但是作用域只在代码块中。匿名内部类是不需要创建类的,但是可以直接获取目标类的对象,并且可以定制化目标函数。