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; }
时间: 2024-08-25 13:42:30