内部类
一个类或者接口定义在另外一个类或者接口的内部
public class OutClass{//外部类
class Inner{}//内部类
interface In{}//内部接口
}
- 内部类之外的类成为外部类
- 内部类的名称必须区别于它所在的外部类,和其他类之间没有要求
- 内部类的全名叫做(外部类名称$内部类名称)
- 内部类可以访问其外部类的所有变量和方法,外部类不能直接访问内部类的实现细节
- 内部类比外部类多了private\protected\static三个修饰符,这三个修饰符不能修饰外部类
内部类的作用
- 内部类提供了更好的封装性
- 内部类可以直接访问外部类的私有成员
- 外部类不能直接访问内部类的成员
- 匿名内部类适合用于创建一次性使用的类
如果内部类离开了外部类则没有任何意义
内部类分类
内部类一般包含:成员内部类、局部内部类、匿名内部类和静态内部类。
非静态内部类
特点:
- 内部类和其他类一样,他只是定义在外部类中的另一个完整的类结构,可以继承自己想要的父类,实现自己想要实现的父类接口,和外部类的父类和父接口无关,可以在非静态内部类中声明属性、方法、构造器等结构,但是不允许声明静态成员,但是可以继承父类的静态成员,而且可以声明静态常量。可以使用abstract修饰,因此可以被其他类继承。可以使用final修饰,表示不能被继承。
- 和外部类不同的是它允许四种修饰权限符:public、protected、缺省、private。(外部类只允许public或者缺省的)
- 还可以在非静态内部类中使用外部类的所有成员,不论是否属于私有。
- 在外部类的静态成员中不可以使用非静态内部类
- 在外部类的外面通过外部类的对象才能创建非静态内部类的对象。
public class Outer{
protected class Inner{}//静态内部类是protected static class Inner{}
}
静态内部类
特点:
- 只可以在静态内部类中使用外部类的静态成员(静态内部类中不能使用外部类的对象就可以创建静态内部类的对象)
- 在外部类的外面不需要通过外部类的对象就可以创建静态内部类的对象
- 如果在内部类中有变量与外部类的静态成员变量同名,可以使用(外部类名称.)进行区别
局部内部类
- 局部内部类前面不能有权限修饰符
- 局部内部列如同局部变量一样,具有自己的作用域
- 局部内部类中还可以使用所在方法的局部常量,即用final声明的局部变量
局部内部类需要先定义后使用,不能先使用后定义
匿名内部类
匿名内部类就是内部类的简写格式,匿名内部类的前提是必须继承后者实现一个外部类或者接口
- 匿名内部类由于没有名字,所以它没有构造函数
- 如果这个匿名内部类继承了一个只含有带参构造器的父类,创建它时必须带上这些参数
- 不能定义静态成员