内部类
在Java当中的一个类中在声明一个类就叫内部类
class Outter{
成员变量;
class Inner{
}
成员方法;
}
内部类分类
- (普通)成员内部类:与成员level一样,内部类中不能存在static关键字,不能够声明静态的方法、属性、静态代码块
- 静态(成员)内部类:使用static修饰的的成员内部类
- (普通)局部内部类:局部范围内有效的内部类
- 匿名(局部)内部类:没有名字的局部内部类
成员内部类
- 定义:与成员变量一样,可以声明类名,在成员内部类中可以声明属性和方法
- 作用:
- 成员内部类可以无限制访问外部类的变量和方法(包括private修饰)
- 内部类可以有多个
- 成员内部类与外部类如果存在同名的成员变量或方法,优先是内部的
- 如果访问外部类的需要Outter.this.(变量或方法名)
成员内部类与外部类的访问
- 成员内部类访问外部类无限制
- 外部类访问内部类的成员不是无限制,需要建一个内部类的对象,通过对象来访问
成员内部类的初始化
不在类里面操作,如果是其他类要访问时,要访问内部类,首先实现外部类的实例化之后再实例化内部类
- 在外部类对象初始化基础之上初始化内部类
Outter.Inner inner = outter.new Inner();
- 通过外部类的成员方法获得成员内部类的对象
静态内部类
静态内部类:使用static修饰的成员内部类
class Outter{
成员变量;
class static Inner{
}
成员方法;
}
外部类不是静态也可以声明静态内部类
静态内部类要类比静态成员变量
静态内部类可以通过外部类直接调用(new Outter.Inner();)
静态内部类内部可以直接访问外部类中所有的静态变量和方法
局部内部类
局部内部类:定义在代码块、方法体等的类
局部内部类要类比局部成员变量
不能够有public、protected、private以及static修饰
class Outter{
public void func(){
class Inner{
}
}
}
局部内部类只是在一个方法或区域里起作用
匿名内部类
匿名内部类:没有名字的局部内部类
必须要继承一个父类或者实现一个接口
new 父类构造方法(){
//重写一个函数
修饰符 返回参数类型 方法名(参数列表){
}
}
匿名内部类与局部内部类的区别:局部的位置不同
匿名内部类当中不能够有静态属性和静态方法
匿名内部类不需要新建一个类,而是通过匿名的形式实现方法的重写
匿名内部类尤其对Android开发,例如:监听、鼠标事件、键盘、触屏输入
内部类的总结
- 每个内部类都可以独立的继承或实现一个接口,而外部类也可以继承一个直接父类(多继承)
- 通过外部类可以实现外界的隐藏(封装)
- 内部类可以无限的使用外部类的成员变量(包括私有),不用生成外部类的对象
- 匿名内部类可以简化代码的编写,方便编写时间驱动的程序
- 成员内部类和静态内部类可以对比成员变量和静态变量,局部内部类和匿名内部类可以对比局部变量