关于 Thinking In Java 中的一个问题

2016-12-17 20:33:13 +08:00
 pumpkin

最近在仔细看这本书

  1. 中文版第四版 191 页,讲的内部类,有这么一句话

“如果想从外部类的非静态方法之外的的任意位置创建某个内部类的对象,那么必须像在 main()方法那样,具体指明这个对象的类型: OuterClassName.InnerClassName ”

这句话是翻译错误了吗,还是我理解有误。非静态方法之外的任意位置是指“静态方法内”吗?如果是静态方法内我试了不用加 OutClassName 这个前缀。非静态方法明显也不用,这是怎么回事?

  1. 第 198 页
public class Parcel9{
	public Destination destination(final String dest){
		return new Destination(){
			private String bebel = dest;
			public String readLabel(){
				return label;
			}
		};
	}

	public static void main(String[] args){
		Parcel9 p = new Parcel9();
		Destination d = p.destination("Tasmania");
	}
}

“如果定义一个匿名内部类,并且希望它使用一个在其外部定义的对象, 那么编译器器参数引用是 final 的”

199 页

“下面是带实例初始化的 “ Parcel ”。注意 destination() 的参数必须是 final 的,因为它们是在匿名内部类使用 ”

public class Parcel10{
	public Destination destination(final String dest, final float price){
		return new Destination(){
			private int cost;
			{
				cost = Math.round(price);
				if(cost > 100){
					System.out.println("Over budget");
				}
			}
			private String label  = dest;
			public String readLabel(){
				return label;
			}
		};
	}
	public static void main(String[] args){
		Parcel10 p = new Parcel10();
		Destination d = p.destination("Tasmania", 101.395F);
	}
}
 

这上面的 final 我试了都可以不用加,是 Java 后面更新了所以不用了吗?

各位看看,谢谢大家

1727 次点击
所在节点    问与答
3 条回复
fantastM
2016-12-17 20:56:39 +08:00
Java 编程思想是基于 JDK5 版本的。
2. 新版 JDK 中(似乎 7 还是不支持的),传入匿名内部类的参数,若无 final 的话,编译器会为你加一个。你可以试一下,传入匿名内部类一个无 final 修饰的参数,然后在内部类中修改它会出现什么情况。
int i = 1;
Runnable r = () -> i=2;
1. 这屌翻译的意思就是。
class Out {
class Inner {
}
}
然后调用是这样子:
Out out = new Out();
Out.Inner inner = out.new Inner();
就是这个 Out.Inner
twm
2016-12-17 20:58:21 +08:00
你可以不加,但是不能更改对应值。
Lonely
2016-12-17 21:01:40 +08:00
可以不写 final ,但是这种情况下你不能更改值,不然就会报错,你可以试下

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

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

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

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

© 2021 V2EX