内部类
概述
内部类( inner class) 是定义在另一个类中的类。
为什么要使用内部类?
- 内部类方法可以访问该类定义所在的作用域中的数据, 包括私有的数据。
- 内部类可以对同一个包中的其他类隐藏起来。
- 当想要定义一个回调函数且不想编写大量代码时,使用匿名(anonymous) 内部类比较 便捷
内部类可以分为四种:
- 实例内部类:直接定义在类当中的一个类,在类前面没有任何一个修饰符
- 静态内部类:在内部类前面加上一个static
- 局部内部类:定义在方法的内部类
- 匿名内部类:属于局部内部的一种特殊情况
内外部类的修饰符
-
外部类的修饰符只能有两个:public 或者是 默认修饰
-
内部类可以使用很多个修饰符
实例内部类
根据内部类定义的位置:定义在类中,和方法是同一级别
在外部类创建成员内部类的对象格式:
外部类.内部类 内部类对象名 = new 外部类().new 内部类();
Outer.Inner inner = new Outer().new Inner();
将一个类 设计为内部类的目的 ,大多数都是不想外界访问,,所以内部类的定义应该私有化,私有化之后 在提供一个可以让外界调用的方法,方法内部常见内部类对象并调用
内部类仍然是一个独立的类,在编译之后会内部类会被编译成独立的.class文件,但是前面冠以外部类的类名 和 $ 符号 。 比如,Person$Heart.class
静态内部类
-
静态内部类是 在内部类前面加上static
-
静态内部类是 不需要创建外部对象
-
在静态内部类当中, 没有外部类引用
-
静态内部类,是可以访问外部类的静态成员
-
访问静态内部类当中的静态成员:Outter.Inner.color
Outter.Inner in = new Outter.Inner();
-
静态内部类当中不仅可以定义静态成员也可以定义非静态成员
局部内部类
-
局部内部类:定义在方法中的内部类
-
不能使用一些修饰符public private…
-
局部内部类只能定义在方法当中使用
-
局部内部类当中是不能包含静态变量
-
局部内部类当中可以包含局部变量,使用的局部变量的本质是final变量
-
当堆中一个对象没有人引用 它并不是直接就销毁
匿名内部类
是内部类的简化写法。它的本质是一个 带具体实现的 父类或者父接口的 匿名的 子类对象。开发中,最常用到的内部类就是匿名内部类了。以接口举例,当你使用一个接口时,似乎得做如下几步操作,
- 定义子类
- 重写接口中的方法
- 创建子类对象
- 调用重写后的方法
前提
匿名内部类必须继承一个父类或者实现一个父接口。
new 父类名或者接口名(){
// 方法重写
@Override
public void method() {
// 执行语句
}
};