package chapter10;
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(); Parcel2.Contents c = q.contents(); Parcel2.Destination d = q.to("Borneo"); }
} 如果想从外部类的非静态方法之外的任意位置创建某个内部类的对象,那么必须像在 main()方法中那样,具体致命这个对象的类型: OuterClassName.InnerClassName.这句话怎么理解?
![]() | 1 SoloCompany 2016-04-10 23:00:54 +08:00 via iPad 你这代码肯定是弄错了, Destination 不是内部类,不能加前缀 |
![]() | 2 a0000 2016-04-11 08:31:10 +08:00 外部类 1 <pre> public class Outer { // 内部类 public class Inner { } // <b>1 、外部类的非静态方法之外(成员变量)</b> Inner inner = new Inner(); // <b>2 、外部类的非静态方法之外(静态变量)</b> static Inner inner2 = new Outer().new Inner(); // <b>3 、外部类的静态方法</b> public static Inner staticMethod() { Inner inner = new Outer().new Inner(); return inner; } // 外部类的非静态方法 public Inner nonStaticMethod() { Inner inner = new Inner(); return inner; } } </pre> 外部类 2 <pre> import com.a0000.Outer.Inner; public class Outer2 { // <b>5 、建议这样写,这样写层次很明显( Inner 是 Outer 的内部类)</b> public Outer.Inner inner = new Outer().new Inner(); // <b>4 、导入了 Inner 包就可以这样写了,但是不能很直观的看出来 Inner 是 Outer 的内部类</b> public Inner inner2 = Outer.staticMethod(); } </pre> 他那个写的不对,前 3 个地方是 **(内部类所在的外部类)的非静态方法之外的位置创建内部类的对象** 第 4 个地方是 **其他外部类的非静态方法之外的位置创建内部类的对象** 第 5 个地方才是他建议的写法 |
![]() | 3 a0000 2016-04-11 08:31:42 +08:00 我去,怎么格式都没了。。。 |
![]() | 4 a0000 2016-04-11 08:32:14 +08:00 public class Outer { // 内部类 public class Inner { } // <b>1 、外部类的非静态方法之外(成员变量)</b> Inner inner = new Inner(); // <b>2 、外部类的非静态方法之外(静态变量)</b> static Inner inner2 = new Outer().new Inner(); // <b>3 、外部类的静态方法</b> public static Inner staticMethod() { Inner inner = new Outer().new Inner(); return inner; } // 外部类的非静态方法 public Inner nonStaticMethod() { Inner inner = new Inner(); return inner; } } |
![]() | 5 linux40 2016-04-11 08:50:23 +08:00 via Android 因为其他地方没有外部类的 this 引用 |
![]() | 6 a0000 2016-04-11 08:58:36 +08:00 |
![]() | 7 zgc2537 2016-04-11 09:54:57 +08:00 其实它说的有点绕了。就是在外部类的非静态方法中,你可以直接用内部类的类名进行定义,而在外部类的静态方法中,你得使用外部类作为前缀,才能访问到内部类。其实对于 Thinking in Java 这本书,在这个地方,它不应该这样去补充,这应该由读者自己去总结:静态方法不能直接访问非静态元素(属性,方法,内部类)。 |
![]() | 8 zgc2537 2016-04-11 09:59:30 +08:00 上面有句话有点小问题(就是在外部类的非静态方法中,你可以直接用内部类的类名进行定义,而在外部类的静态方法中,你得使用外部类作为前缀,才能访问到内部类。)-》改为:就是在外部类的非静态方法中,你可以直接用内部类的类名进行定义,而在外部类的静态方法中,你得使用外部类作为前缀,才能访问到“静态”内部类。 也就是,如果是外部类的静态方法访问静态内部类,你仍然不需要用外部类作为前缀访问到静态内部类。 |
9 captainXxX OP @SoloCompany 是内部类,最上面还有一行。 |
![]() | 10 SoloCompany 2016-04-11 11:15:21 +08:00 @captainXxX 不是,这代码连编译都无法通过,最上面那行是封闭的类定义,下面所有定义都是 out of any class scope |
![]() | 11 SoloCompany 2016-04-11 11:18:16 +08:00 @captainXxX 好吧,我眼神不好,大括号数漏了一个。在外部类里面引用内部类,的确可以不需要 qulified 前缀,加了的话会更明确一点 |
12 captainXxX OP @zgc2537 普通内部类依附于外部类对象,静态内部类依附于外部类,这么理解对么。。 |
![]() | 13 zgc2537 2016-04-11 14:45:51 +08:00 @captainXxX 也可以这么去理解。把内部类当做和属性和方法一样地去访问和使用就好了,这样理解会更容易一些。 |