日期:2014-05-20  浏览次数:20804 次

Java编程思想-内部类问题
Java编程思想创建内部类(P191)里面有这样一句话,“如果想从外部类的非静态方法之外的任意位置创建某个内部类的对象,那么必须想在main()方法中那样,具体地指明这个对象的类型:OutClassName.InnerClassName”。这句话该怎么理解?
是该理解为:在外部类中,静态方法中创建内部类的对象要指明类型OutClassName.InnerClassName,非静态方法中创建内部类的对象指明类型InnerClassName吗?但是示例代码中静态方法main()中创建内部类对象c和d时去掉OuterClassName也可以编译运行,求解释!
Java code

//: innerclasses/Parcel2.java
// Returning a reference to an inner class.

public class Parcel2 {
  class Contents {
    private int i = 11;
    public int value() { return i; }
  }
  class Destination {
    private String label;
    Destination(String whereTo) {
      label = whereTo;
    }
    String readLabel() { return label; }
  }
  public Destination to(String s) {
    return new Destination(s);
  }
  public Contents contents() {
    return new Contents();
  }
  public void ship(String dest) {
    Contents c = contents();
    Destination d = to(dest);
    System.out.println(d.readLabel());
  }
  public static void main(String[] args) {
    Parcel2 p = new Parcel2();
    p.ship("Tasmania");
    Parcel2 q = new Parcel2();
    // Defining references to inner classes:
    Parcel2.Contents c = q.contents();
    Parcel2.Destination d = q.to("Borneo");
  }
  
} /* Output:
Tasmania
*///:~




Java code

//: innerclasses/Parcel2.java
// Returning a reference to an inner class.

public class Parcel2 {
  class Contents {
    private int i = 11;
    public int value() { return i; }
  }
  class Destination {
    private String label;
    Destination(String whereTo) {
      label = whereTo;
    }
    String readLabel() { return label; }
  }
  public Destination to(String s) {
    return new Destination(s);
  }
  public Contents contents() {
    return new Contents();
  }
  public void ship(String dest) {
    Contents c = contents();
    Destination d = to(dest);
    System.out.println(d.readLabel());
  }
  public static void main(String[] args) {
    Parcel2 p = new Parcel2();
    p.ship("Tasmania");
    Parcel2 q = new Parcel2();
    // Defining references to inner classes:
    Contents c = q.contents();
    Destination d = q.to("Borneo");
  }
  
} /* Output:
Tasmania
*///:~




------解决方案--------------------
首先使用内部类的好处是可以方便内部类共享外部类的信息。写的时候OutClassName.InnerClassName和直接写InnerClassName都可以的,但是你仔细看import语句,就知道区别了:前者只需要导入OutClassName就行,而后者的话是import xxx.OutClassName.InnerClassName。
不管怎样,要实例化内部类对象,必须首先实例化外部类对象x,然后以x.new InnerClass()的方式创建。