内部类
- 当一个事物的内部还有一个部分需要一个完整的结构进行描述,而这个内部的完整的结构只为外部事物提供服务,那么整个内部的完整结构最好使用内部类
- Java中允许将类A定义在类B的内部,类A称为内部类,类B称为外部类
- Inner Class的名字不能与包含它的外部类类名相同
- 分类: 成员内部类:static成员内部类和非static成员内部类
局部内部类:方法内、代码块内、构造器内…、匿名内部类 - 成员内部类和局部内部类在编译后都会生成字节码文件:
成员内部类: 外部类&内部类名.class
局部内部类: 外部类&数字 内部类名.class
class OuterClass {
static class StaticNestedClass {}
class InnerClass {}
public OuterClass() {
class LocalClass {}
}
public void method() {
class LocalClass {}
}
{
class LocalClass {}
}
}
- 作为外部类的成员
> 调用外部类的结构
> 可以被static修饰
> 可以被四种不同的权限修饰 - 作为类
> 可以有属性、方法、构造器、内部类…
> 可以使用final修饰 --> 不能被继承
> 可以使用abstract修饰 --> 不能被实例化 - 如何实例化成员内部类的对象
public class InnerClassTest {
public static void main(String[] args) {
OuterClass.StaticNestedClass staticNestClass = new OuterClass.StaticNestedClass();
OuterClass outerClass = new OuterClass();
OuterClass.InnerClass innerClass = outerClass.new InnerClass();
}
}
class OuterClass {
static class StaticNestedClass {}
class InnerClass {}
}
- 如何在成员内部类中区分调用外部类的结构
class OuterClass {
class InnerClass {
public void methodInInnerClass() {
OuterClass.this.methodInOuterClass();
}
}
public void methodInOuterClass() {
}
}
class OuterClass {
String name = "OuterClass";
class InnerClass {
String name = "InnerClass";
public void display(String name) {
System.out.println(name);
System.out.println(this.name);
System.out.println(OuterClass.this.name);
}
}
}
- 开发中局部内部类的使用
public class InnnerClassTest1 {
public Comparable getComparable() {
class myComparable implements Comparable {
@Override
public int compareTo(Object o) {
return 0;
}
}
return new myComparable();
return new Comparable() {
@Override
public int compareTo(Object o) {
return 0;
}
};
}
}
- 在局部内部类的方 法中(show()),如果调用外部类中方法(method())的局部变量(num),则此局部变量需要声明为final类型
---- 外部类的字节码文件 -> 实际传递副本出来给内部类的字节码文件用
(需要声明为final,只能用不能改)
JDK7: 需要显示设置final
JDK8:可以省略final
class OuterClass {
public void method() {
int num = 10;
class InnerClass {
public void show() {
System.out.println(num);
}
}
}
}