大家好!java编程思想上看到一实例,有些不解,还希望大家解答下!
匿名内部类使用外部定义的对象,编译器要求其参数是final的。而该实例中的x却没有声明为final,但是正常运行。何解?
package innerclasses;class Wrapping
{
private String i;
public Wrapping(String x)//为什么参数不加final
{
i=x;
}
@Override
public String toString()
{
return ""+i;
}
}
public class Parcel
{
public Wrapping wrapping(String x)
{
return new Wrapping(x)
{};
}
public static void main(String[] str)
{
Parcel p = new Parcel();
Wrapping w = p.wrapping("15");
System.out.println(w.toString());
}
}
匿名内部类使用外部定义的对象,编译器要求其参数是final的。而该实例中的x却没有声明为final,但是正常运行。何解?
package innerclasses;class Wrapping
{
private String i;
public Wrapping(String x)//为什么参数不加final
{
i=x;
}
@Override
public String toString()
{
return ""+i;
}
}
public class Parcel
{
public Wrapping wrapping(String x)
{
return new Wrapping(x)
{};
}
public static void main(String[] str)
{
Parcel p = new Parcel();
Wrapping w = p.wrapping("15");
System.out.println(w.toString());
}
}
{
class InnerClass//内部类
{
}
}
public static void main(String[] args) {
// 匿名 Runnable 类中使用了变量 n,于是
// 编译器要求 n 的定义是 final 的。
final int n = 10;
new Runnable() { public void run() {
System.out.println("This is " + n);
}
}.run();
}
}
{
private String i;
public Wrapping(String x){//为什么参数不加final
i=x;
}
@Override
public String toString(){
return ""+i;
}
}public class Test {
public Wrapping wrapping(final String x){
return new Wrapping(x){
String name=x; //匿名内部类使用外部定义的String对象x
};
}
}实际上,应该是匿名内部类使用包含在这个内部类的方法中的局部变量的时候,需要变量声明为final。这些局部变量可以是方法的参数。
{
return ""+i;
}
}
public class Parcel
{
public Wrapping wrapping(String x)
{
return new Wrapping(x) //为什么参数不加final
{};
}
我仔细看了下ThinkinginJava 个人见解:x 对象被传递给匿名类的基类的构造器,并没有直接在匿名类内部直接使用。 相见:Thinkinginjava 第三版 P213 例子:AnonymousConstructor.java