内部类
内部类(inner class),顾名思义就是定义在另一个类中的类。如下所示:
public class OuterClass { public class InnerClass { } }
相对于的,包含了其他类的类,我们称为外部类或外围类(OuterClass)。
为什么需要使用内部类?它主要有如下一些作用和特性:
-
内部类和包含它的外围类的方法在同一个层次,因此也可以称为成员内部类,它可以使用 pubic、protected、private 修饰符。
-
成员内部类中不能存在任何 static 的变量和方法,但可以定义常量。
-
内部类的方法可以访问该类定义所在的作用域中的数据,包括私有数据。
-
内部类对同一个包中的其他类不可见。
-
当要定义一个回调函数而不想编写大量代码时,可以使用匿名内部类(anonymous inner class)。
内部类之所以可以访问包含它的外围类的属性和方法,实际上是因为每一个内部类对象都持有一个指向包含它的外围类对象的引用。这个外围类的引用是在内部类的构造器中设置。编译器修改了所有内部类的构造器,添加了一个外围类引用的参数,和之前对类实例方法调用时的 this 隐藏参数类似。
在内部类中使用外围类引用的正规语法:OuterClass.this
表示外围类引用;如果未使用此前缀时,默认访问内部类定义的属性和方法,内部类不存在相同的属性和方法时则访问外围类的属性和方法。如下代码所示:
public class OuterClass { private Integer index; private String name; public void setIndex(Integer index) { this.index = index; } public void setName(String name) { this.name = name; } public void printName() { System.out.println(name); } public class InnerClass { private String name; public void setName(String name) { this.name = name; } public void printName() { System.out.println(name); System.out.println("我的外围类Name=" + OuterClass.this.name); System.out.println("我的外围类Index=" + index); } } public static void main(String[] args) { OuterClass oc = new OuterClass(); oc.setIndex(1); oc.setName("我是外围类"); oc.printName(); OuterClass.InnerClass ic = oc.new InnerClass(); ic.setName("我是内部类"); ic.printName(); } }
内部类的创建
定义了内部类后,我们怎么来创建一个内部类的实例?通常有两种方式:
-
在包含它的作用域范围内,直接使用
new
操作符来构造一个实例,和普通类的构造方式一样。 -
在包含它的作用域范围外,使用
外围类对象.new 变量名 内部类类名()
语法来创建;在作用域范围外,我们这样来引用内部类:Out