局部内部类是定义在方法块内部的类,这个类只能在定义他的方法中可见。局部内部类还有以下特性:
(1)在局部内部类前不能用修饰符public、private和protected进行修饰。
public void t() { // 错误 private class Inner { ... } // 错误 public class Inner { ... } // 错误 protected class Inner { ... } }
(2)可以定义与外部类同名的变量。如果内部类没有与外部类同名的变量,在内部类中可以直接访问外部类的实例变量。如果内部类中有与外部类同名的变量,直接用变量名访问的是内部类的变量,用this.变量名访问的是内部类变量。用外部类名.this.内部类变量名访问的是外部类变量。
public class InnerClassTest06 { private String name = "Outter Name"; public static void main(String[] args) { InnerClassTest06 test = new InnerClassTest06(); test.t(); } public void t() { final int age = 20; class Inner { private String name = "Inner Name"; public void show() { System.out.println("age = " + age); System.out.println("name = " + name); System.out.println("name = " + InnerClassTest06.this.name); } } new Inner().show(); } }
输出结果:
age = 20
name = Inner Name
name = Outter Name
(3)不可以定义静态变量和方法;
public void t() { class Inner { // 错误 public static name = "NAME"; } }
(4)可以访问外部类的局部变量(即方法内的变量),但是变量必须是final的。如下,在t()方法内部定义了一个final int age变量,然后在局部内部类中输出。
public class InnerClassTest06 { public static void main(String[] args) { InnerClassTest06 test = new InnerClassTest06(); test.t(); } public void t() { final int age = 20; class Inner { public void show() { System.out.println("age = " + age); } } new Inner().show(); } }
输出结果:
age = 20
(5)可以访问外部类的所有成员。如下在外围类定义了private、public、protected和友好型修饰符变量,然后使用局部内部类将这些变量的值输出。
public class InnerClassTest06 { public int age = 23; private String name = "Outter Name"; protected String pro = "pro Test"; String sex = "男"; public static void main(String[] args) { InnerClassTest06 test = new InnerClassTest06(); test.t(); } public void t() { class Inner { public void show() { System.out.println("age = " + age); System.out.println("name = " + name); System.out.println("pro = " + pro); System.out.println("sex = " + sex); } } new Inner().show(); } }
输出结果如下:
age = 23
name = Outter Name
pro = pro Test
sex = 男