Java 在方法和作用域内的内部类

通常,如果所读写 的代码包含了内部类,那么它们都是"平凡的"内部类,简单并且容易理解,然而,内部类的语法覆盖了大量其它的更加难以理解的计数,例如可以在一个方法里或者在任意的作用域里定义内部类.这么做有两个理由

1)如前所述,你实现了某类型的接口,于是可以创建并返回对其的引用

2)你要创建一个复杂的问题,想创建一个类来辅助你的解决方案,但是又不希望这个类是公共可用的.

在后面的例子中前面的代码将被修改,以用来实现:

1)一个定义在方法中的类

2)一个定义在作用域内的类,此作用域在方法的内部

3)一个实现了接口的匿名类

4)一个匿名类,它扩展了有非默认构造器的类

5)一个匿名类,它执行字段初始化

6)一个匿名类,它通过实例初始化实现构造(匿名类不可以能有过构造器)

 

//: innerclasses/Destination.java
package object;
public interface Destination {
  String readLabel();
} ///:~
//: innerclasses/Parcel5.java
// Nesting a class within a method.
package object;
public class Parcel5 {
  public Destination destination(String s) {
    class PDestination implements Destination {//在destination方法之外不可使用类,可以通过Destination使用
      private String label;                   //PDestination类的public方法
private PDestination(String whereTo) { label = whereTo; } public String readLabel() { return label; } } return new PDestination(s); } class PDestination //可以定义和PDestination重名的类,但最好不这样做  { } public static void main(String[] args) { Parcel5 p = new Parcel5(); Destination d = p.destination("Tasmania"); } } ///:~
//: innerclasses/Parcel6.java
// Nesting a class within a scope.
package object;
public class Parcel6 {
  private void internalTracking(boolean b) {
    if(b) {
      class TrackingSlip { //在if域之外类TrackingSlip不可用,可以通过internalTracking方法调用,TrackingSlip类的方法
        private String id;
        TrackingSlip(String s) {
          id = s;
        }
        String getSlip() { return id; }
      }
      TrackingSlip ts = new TrackingSlip("slip");
      String s = ts.getSlip();
    }
    // Can't use it here! Out of scope:
    //! TrackingSlip ts = new TrackingSlip("x");
  }    
  public void track() { internalTracking(true); }
  public static void main(String[] args) {
    Parcel6 p = new Parcel6();
    p.track();
  }
} ///:~

 

posted @ 2019-01-05 02:06  江期玉  阅读(1094)  评论(0编辑  收藏  举报