内部类(inner class)是定义在另一个类中的类。在实际工作中内部类使用得非常广泛,特别是匿名内部类。
(1)内部类方法可以访问该类定义所在的作用域中数据,包括私有的数据。如下:
package innerClass;
public class InnerClassTest01 {
// 类的私有数据
private String name = "InnerClassTest01";
public static void main(String[] args) {
// 创建实例
InnerClassTest01 t = new InnerClassTest01();
// 创建内部类实例
Inner01 inner01 = t.new Inner01();
inner01.show();
}
class Inner01 {
private int age = 20;
public void show() {
// name=InnerClassTest01 age=20
System.out.println("name=" + name + " age=" + age);
}
}
}(2)内部类可以对同一个包中的其他类隐藏起来。如上的Inner01内部类对于非innerClass包来说是不可见的。如:
package innerClass;
public class InnerClassTest01 {
...
class Inner01 {
...
}
}
package test;
public class Test {
public static void main(String[] args) {
// 下面的语法是错误的
// Inner01 inner = new Inner01();
}
}(3)当要定义一个回调函数且不想编写大量代码时,使用匿名内部类比较便捷。如下面通过线程的方式打印0~9数字:
public class InnerClassTest02 {
public static void main(String[] args) {
// 匿名内部类
new Thread(new Runnable() {
private int i = 0;
@Override
public void run() {
while ( i < 10 ) {
System.out.println( "i = " + (i++) );
}
}
}).start();
}
}其中直接实现Runnable接口,通过匿名内部类的方式来实现的。
(1)OutterClass.this语法
在内部类中可以使用上面这种语法访问外围类的数据。如下:
package innerClass;
public class InnerClassTest03 {
private String name = "hello world";
public static void main(String[] args) {
InnerClassTest03 test = new InnerClassTest03();
// 创建内部类
Inner inner = test.new Inner();
inner.show();
test.t();
}
public void t() {
// 创建内部类
Inner inner = new Inner();
inner.show();
}
class Inner {
public void show() {
System.out.println("name = " + InnerClassTest03.this.name);
}
}
}其中InnerClassTest03.this.name使用了OutterClass.this的方式访问外围类name属性。
(2)outerObject.new语法
使用该语法来创建内部类,如下:
class Inner {
public void show() {
System.out.println("name = " + InnerClassTest03.this.name);
}
}(3)OutterClass.InnerClass
其他类可以使用该方式访问指定类的内部类。如下:
package innerClass;
public class InnerClassTest04 {
public static void main(String[] args) {
InnerClassTest03.Inner inner = (new InnerClassTest03()).new Inner();
inner.show();
}
}这里在InnerClassTest04类中通过此种语法访问了InnerClassTest03类的Inner内部类。