1。防止继承
2。
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();
}
}
***public BigEgg()还算是BigEgg的构造函数吗?它已经在Yolk类里了。所以会出现那个错误
2。
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();
}
}
***public BigEgg()还算是BigEgg的构造函数吗?它已经在Yolk类里了。所以会出现那个错误
如果一个匿名内部类出现在一个方法的内部,那么它如果它要访问这个方法的参数或者方法中定义的变量,则这些参数和变量必须被修饰为final
昨天第一个问题回答的不好(错误),今天看了一下书,特地补充一下,不足之处,请指正。
匿名内部类使用在它外部定义的一个对象,并不是为了防止继承,而是由于匿名内部类没有构建器,它只能通过匿名内部类中对象的实例初始化进行构建。而对象的实例初始化应该是在编译期确定的,这样他们实例初始化的时候不能接收一个外部的在运行期才确定的数据,所以只能接收一个final类型的数据,因为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();
}
}