在JDK8 以前的版本中使用匿名内部类时,在匿名内部类中使用局部变量时,局部变量必须被final修饰,否则会报错。在JDK8 以后及JDK8 在匿名内部类中使用局部变量时,不必添加final修饰,程序自动为这个变量添加了final
interface Product{
public double getMoney();
public String getName();
}
public class Cow {
private static Integer weight;
public Cow(Integer weight){
this.weight = weight;
}
public Cow(){}
static class CowLeg{
private String color;
public CowLeg(String color){
this.color = color;
}
public CowLeg(){}
public void info(){
System.out.println("weight:"+weight+" "+ "color:"+color);
}
}
class CowLeg2{
}
public void test(){
CowLeg cowLeg = new CowLeg("黑");
cowLeg.info();
new CowLeg2();
}
public void test1(Product p){
System.out.println("买了"+p.getName()+",花了"+p.getMoney());
}
public static void main(String[] args){
Cow cow = new Cow(13);
cow.test();
final int a = 0;
CowLeg cowLeg = new CowLeg("黑");
cowLeg.info();
new Cow().test1(new Product(){
@Override
public double getMoney() {
// TODO Auto-generated method stub
System.out.println(a);
return 12.3;
}
@Override
public String getName() {
// TODO Auto-generated method stub
return "水果";
}
});
}
}
在这段程序中,Product本来是一个接口,接口中定义这两个抽象方法,在实现接口,创建对象使用匿名内部类,在匿名内部类中使用局部内部类 a,因为JDK是8之前的版本,所以要在前面加上修饰final