最近在仔细看这本书
“如果想从外部类的非静态方法之外的的任意位置创建某个内部类的对象,那么必须像在 main()方法那样,具体指明这个对象的类型: OuterClassName.InnerClassName ”
这句话是翻译错误了吗,还是我理解有误。非静态方法之外的任意位置是指“静态方法内”吗?如果是静态方法内我试了不用加 OutClassName 这个前缀。非静态方法明显也不用,这是怎么回事?
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 后面更新了所以不用了吗?
各位看看,谢谢大家
1
fantastM 2016-12-17 20:56:39 +08:00 1
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 |
2
twm 2016-12-17 20:58:21 +08:00
你可以不加,但是不能更改对应值。
|
3
Lonely 2016-12-17 21:01:40 +08:00
可以不写 final ,但是这种情况下你不能更改值,不然就会报错,你可以试下
|