内部类(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内部类。