有这样一种内部类,它是嵌套在方法和作用域内的,对于这个类的使用主要是应用与解决比较复杂的问题,想创建一个类来辅助我们的解决方案,到那时又不希望这个类是公共可用的,所以就产生了局部内部类,局部内部类和成员内部类一样被编译,只是它的作用域发生了改变,它只能在该方法和属性中被使用,出了该方法和属性就会失效。
匿名内部类,任意作用域中嵌入的内部类都属于局部内部类的范畴。
<局部内部类>
1 interface Destination { 2 String readLabel(); 3 } 4 5 class Test003Sub { 6 7 public Destination destination(String s) { 8 class Test003Inner1 implements Destination { 9 private String s; 10 11 private Test003Inner1(String s) { 12 this.s = s; 13 } 14 15 @Override 16 public String readLabel() { 17 return s; 18 } 19 } 20 return new Test003Inner1(s); 21 } 22 } 23 24 public class Test003 { 25 public static void main(String[] args) { 26 Test003Sub test003 = new Test003Sub(); 27 System.out.println(test003.destination("Hello World").readLabel());// Hello World 28 } 29 }
<匿名内部类>
上例也可以改成匿名内部类。在匿名类内部使用的参数推荐加final。
1 interface Destination { 2 String readLabel(); 3 } 4 5 class Test003Sub { 6 public Destination destination(final String s) { 7 return new Destination() { 8 private String sin = s; 9 10 @Override 11 public String readLabel() { 12 return sin; 13 } 14 }; 15 } 16 } 17 18 public class Test003 { 19 public static void main(String[] args) { 20 Test003Sub test003 = new Test003Sub(); 21 System.out.println(test003.destination("Hello World").readLabel());// Hello World 22 } 23 }
<任意作用域中嵌入的内部类>
内部类还可以嵌入到方法的任意作用域中。代码中内部类嵌入if内,并不是说该类创建是有条件的,它与其他类一样是一起编译过的。
1 class Test004Sub { 2 String internalTracking(boolean b) { 3 String s = ""; 4 if (b) { 5 class TrackingSlip { 6 private String s; 7 8 private TrackingSlip(String s) { 9 this.s = s; 10 } 11 12 String getSlip() { 13 return s; 14 } 15 } 16 TrackingSlip ts = new TrackingSlip("Hello World!"); 17 s = ts.getSlip(); 18 } else { 19 s = "No Data!"; 20 } 21 return s; 22 } 23 } 24 25 public class Test004 { 26 public static void main(String[] args) { 27 Test004Sub test004 = new Test004Sub(); 28 System.out.println(test004.internalTracking(true)); // Hello World! 29 System.out.println(test004.internalTracking(false)); // No Data! 30 } 31 }