当前位置: 技术问答>java相关
[ 求助 ] 两个小问题,请大虾指教~
来源: 互联网 发布时间:2015-11-08
本文导语: 问题一: 《Thinking in java》中说“若试图定义一个匿名内不类,并想使用在匿名内部类外部定义的一个对象,则编译器要求外部对象为final属性” 我弄不明白为什么外不对象必须为final属性? +++++++++++++++++++++++++++++++...
问题一:
《Thinking in java》中说“若试图定义一个匿名内不类,并想使用在匿名内部类外部定义的一个对象,则编译器要求外部对象为final属性”
我弄不明白为什么外不对象必须为final属性?
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
问题二:
class Egg {
protected class Yolk {
public Yolk() {
System.out.println("Egg.Yolk()");
}
}
private Yolk y;
public Egg() {
System.out.println("New Egg()");
y = new Yolk();
}
}
public class BigEgg extends Egg {
public class Yolk {
public Yolk() {
System.out.println("BigEgg.Yolk()");
}
// !private Yolk yy;
// !public BigEgg() {
// !System.out.println("New BigEgg()");
// !yy = new Yolk();
// !}
}
public static void main(String[] args) {
new BigEgg();
}
} ///:~
以上被注释的五行为BigEgg类的构造器,但为什么不能出现在这里,提示错误如下:
E:MyDocumentMyJavatestBigEgg.java:20: 无效的方法声明;需要有返回类型
public BigEgg() {
^
1 个错误
Process completed.
请问是什么原因?
《Thinking in java》中说“若试图定义一个匿名内不类,并想使用在匿名内部类外部定义的一个对象,则编译器要求外部对象为final属性”
我弄不明白为什么外不对象必须为final属性?
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
问题二:
class Egg {
protected class Yolk {
public Yolk() {
System.out.println("Egg.Yolk()");
}
}
private Yolk y;
public Egg() {
System.out.println("New Egg()");
y = new Yolk();
}
}
public class BigEgg extends Egg {
public class Yolk {
public Yolk() {
System.out.println("BigEgg.Yolk()");
}
// !private Yolk yy;
// !public BigEgg() {
// !System.out.println("New BigEgg()");
// !yy = new Yolk();
// !}
}
public static void main(String[] args) {
new BigEgg();
}
} ///:~
以上被注释的五行为BigEgg类的构造器,但为什么不能出现在这里,提示错误如下:
E:MyDocumentMyJavatestBigEgg.java:20: 无效的方法声明;需要有返回类型
public BigEgg() {
^
1 个错误
Process completed.
请问是什么原因?
|
To cbu(阿牛): 我总算你弄明白了匿名内部类为什么只能用final.是变量的作用域的问题,因为匿名内部类是出现在一个方法的内部的,如果它要访问这个方法的参数或者方法中定义的变量,则这些参数和变量必须被修饰为final。因为虽然匿名内部类在方法的内部,但实际编译的时候,内部类编译成Outer.Inner,这说明内部类所处的位置和外部类中的方法处在同一个等级上,外部类中的方法中的变量或参数只是方法的局部变量,这些变量或参数的作用域只在这个方法内部有效。因为编译的时候内部类和方法在同一级别上,所以方法中的变量或参数只有为final,内部类才可以引用。你看看下面的例子:
public class Outer{
private int m = (int)(Math.random()*100);
public static void main(String args[]){
Outer that = new Outer();
that.go((int)(Math.random()*100),(int)(Math.random()*100));
}
public void go(int x,final int y){
int a = x+y;
final int b = x-y;
class Inner{
public void method(){
System.out.println("m is " + m);
// System.out.println("x is " + x);//非法
System.out.println("y is " + y);
// System.out.println("a is " + a);//非法
System.out.println("b is " + b);
}
}
Inner that = new Inner();
that.method();
}
}
public class Outer{
private int m = (int)(Math.random()*100);
public static void main(String args[]){
Outer that = new Outer();
that.go((int)(Math.random()*100),(int)(Math.random()*100));
}
public void go(int x,final int y){
int a = x+y;
final int b = x-y;
class Inner{
public void method(){
System.out.println("m is " + m);
// System.out.println("x is " + x);//非法
System.out.println("y is " + y);
// System.out.println("a is " + a);//非法
System.out.println("b is " + b);
}
}
Inner that = new Inner();
that.method();
}
}
|
这条规则的翻译有问题,我想该是《java变成死相》的翻译出了问题
如果一个匿名内部类出现在一个方法的内部,那么它如果它要访问这个方法的参数或者方法中定义的变量,则这些参数和变量必须被修饰为final
如果一个匿名内部类出现在一个方法的内部,那么它如果它要访问这个方法的参数或者方法中定义的变量,则这些参数和变量必须被修饰为final
|
final是防止被其他类继承.看类的需要,如果觉的自类的功能已经很强大了那么当然就希望继续对它进行扩展重写