匿名内部类适合创建那种只需要一次使用的类,创建匿名内部类时会立即创建一个该类的实例,这个类定义立即消失,匿名内部类不能重复使用。
public interface Product {
double getPrice();
String getName();
}
class AnonymousTest{
public void test(Product product){
System.out.println("一个产品叫"+product.getName()+",价钱是"+product.getPrice());
}
public static void main(String[] args) {
AnonymousTest anonymousTest = new AnonymousTest();
//和创建一个类,并实现接口,然后再实例化一样,只不过不能复用而已
anonymousTest.test(new Product() {
@Override
public double getPrice() {
return 100.0;
}
@Override
public String getName() {
return "谜语";
}
});
}
}
通过实现接口来创建匿名内部类时,匿名内部类不能显式创建构造器,因此匿名内部类只有一个隐式的无参数构造器。
但如果通过继承父类来创建匿名内部类时,匿名内部类将会拥有和父类相似的构造器(此处是相似指的是拥有相同的形参列表)
public abstract class Device {
private String name;
public abstract double getPrice();
public Device(){};
public Device(String name){
this.name = name;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
class AnonymousInner{
public void test(Device device){
System.out.println("一个设备:"+device.getName()+"价钱"+device.getPrice());
}
public static void main(String[] args) {
AnonymousInner anonymousInner = new AnonymousInner();
//调用无参数的构造器来创建Device匿名内部类
anonymousInner.test(new Device() {
//初始化块
{
System.out.println("匿名内部类的初始化块");
}
//实现抽象方法
@Override
public double getPrice() {
return 99.9;
}
//重写父类的实例方法
public String getName(){
return "键盘";
}
});
//调用有参数的构造器来创建Device匿名实现类的对象
anonymousInner.test(new Device("鼠标") {
@Override
public double getPrice() {
return 66.6;
}
});
}
}
实现接口的匿名内部类,只能有一个无参构造器
继承父类的匿名内部类,可以拥有和父类构造器一样的形参列表
java 8以后,被匿名内部类访问过的局部变量会隐式地被final修饰,不能再更改值。
原文:https://www.cnblogs.com/woshi123/p/12462183.html