1、首先匿名内部类要继承自抽象基类或者实现基类接口
like this
abstract class Seed{ int cnt; public Seed(int x){ cnt=x; } abstract void showInfo(); } class Apple{ int num=300; public Seed getSeed(final int x){ return new Seed(x){ public void showInfo(){ System.out.println("The apple's seeds are "+num); } }; }
2、在类的内部不能对父类字段进行初始化。除非使用初始化块,也不能对外部类的子段进行更改
这样是不行的。//!凝视部分是不对的
abstract class Seed{ int cnt; public Seed(int x){ cnt=x; } abstract void showInfo(); } class Apple{ int num=300; public Seed getSeed(final int x){ return new Seed(x){ //!num=200; //!cnt=100; public void showInfo(){ System.out.println("The apple's seeds are "+num); } }; }原因:
所谓匿名内部类与实名类本质上是同样的,而在类的内部对子段初始化的位置仅仅能是声明的位置或者在构造函数的内部,而对字段值的更改仅仅能在该类方法的内部。在其他位置对字段值的更改是无效的,由于此时的更改和操作没有机会运行,所以编译器会报错。
而在初始化块中对字段的操作和更改是能够的。
这样也是不行的
public class Wrapping{ public int a; public int b; //!a=100; }