Think In Java 中的问题,求助大神

2016-04-10 21:19:03 +08:00
 captainXxX

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.这句话怎么理解?

2611 次点击
所在节点    Java
13 条回复
SoloCompany
2016-04-10 23:00:54 +08:00
你这代码肯定是弄错了, Destination 不是内部类,不能加前缀
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 个地方才是他建议的写法
a0000
2016-04-11 08:31:42 +08:00
我去,怎么格式都没了。。。
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;
}

}
linux40
2016-04-11 08:50:23 +08:00
因为其他地方没有外部类的 this 引用
a0000
2016-04-11 08:58:36 +08:00
zgc2537
2016-04-11 09:54:57 +08:00
其实它说的有点绕了。就是在外部类的非静态方法中,你可以直接用内部类的类名进行定义,而在外部类的静态方法中,你得使用外部类作为前缀,才能访问到内部类。其实对于 Thinking in Java 这本书,在这个地方,它不应该这样去补充,这应该由读者自己去总结:静态方法不能直接访问非静态元素(属性,方法,内部类)。
zgc2537
2016-04-11 09:59:30 +08:00
上面有句话有点小问题(就是在外部类的非静态方法中,你可以直接用内部类的类名进行定义,而在外部类的静态方法中,你得使用外部类作为前缀,才能访问到内部类。)-》改为:就是在外部类的非静态方法中,你可以直接用内部类的类名进行定义,而在外部类的静态方法中,你得使用外部类作为前缀,才能访问到“静态”内部类。

也就是,如果是外部类的静态方法访问静态内部类,你仍然不需要用外部类作为前缀访问到静态内部类。
captainXxX
2016-04-11 10:58:33 +08:00
@SoloCompany 是内部类,最上面还有一行。
SoloCompany
2016-04-11 11:15:21 +08:00
@captainXxX 不是,这代码连编译都无法通过,最上面那行是封闭的类定义,下面所有定义都是 out of any class scope
SoloCompany
2016-04-11 11:18:16 +08:00
@captainXxX 好吧,我眼神不好,大括号数漏了一个。在外部类里面引用内部类,的确可以不需要 qulified 前缀,加了的话会更明确一点
captainXxX
2016-04-11 13:32:30 +08:00
@zgc2537 普通内部类依附于外部类对象,静态内部类依附于外部类,这么理解对么。。
zgc2537
2016-04-11 14:45:51 +08:00
@captainXxX 也可以这么去理解。把内部类当做和属性和方法一样地去访问和使用就好了,这样理解会更容易一些。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/269999

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX