Java内部类(3):局部内部类

有这样一种内部类,它是嵌套在方法和作用域内的对于这个类的使用主要是应用与解决比较复杂的问题,想创建一个类来辅助我们的解决方案,到那时又不希望这个类是公共可用的,所以就产生了局部内部类,局部内部类和成员内部类一样被编译,只是它的作用域发生了改变,它只能在该方法和属性中被使用,出了该方法和属性就会失效。

匿名内部类,任意作用域中嵌入的内部类都属于局部内部类的范畴。

<局部内部类>

 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 }

 

posted @ 2018-01-19 17:10  Storm_L  阅读(257)  评论(0编辑  收藏  举报