Java入门-匿名内部类


匿名内部类适合创建只需要一次使用的类,创建匿名内部类时会立即创建一个该类的实例,这个类定义立即消失,匿名类不能重复使用。

匿名类是用来创建接口或者抽象类的实例的。

匿名内部类不能定义构造器。因为匿名内部类没有类名,所有无法定义构造器。但匿名内部类可以定义初始化块,可以通过实例初始化块来完成构造器需要完成的事情。

定义匿名内部类格式如下:

new 实现接口 | 抽象父类构造器(实参列表)
{
    匿名内部类的类体部分
}

最常用的创建匿名内部类的方式是需要创建某个接口类型的对象,如下

public interface ProductA {
    public double getPrice();
    public String getName();
}
public class AnonymousTest {
    public void test(ProductA p) {
        System.out.println("Buy a" + p.getName() + "Cost " + p.getPrice());
    }
    public static void main(String[] args) {
        AnonymousTest ta = new AnonymousTest();
        // 调用 test() 方法时,需要传入一个 Product 参数
        // 此处传入其匿名实现类的实例
        ta.test(new ProductA() {
            @Override
            public double getPrice() {
                return 567.8;
            }

            @Override
            public String getName() {
                return "APG Card";
            }
        });
    }
}

通过继承抽象父类来创建匿名内部类时,匿名内部类将拥有和父类相同形参列表的构造器。看下面一段代码

public abstract class Device {
    private String name;
    public abstract double getPrice();
    public Device() {};
    public Device(String name) {
        this.name = name;
    }
    public String getName() {
        return this.name;
    }
    public void setName(String name) {
        this.name = name;
    }
}
public class AnonymousInner {
    public void test(Device d) {
        System.out.println("Buy a" + d.getName()+ "Cost" + d.getPrice());
    }
    public static void main(String[] args) {
        AnonymousInner ai = new AnonymousInner();
        // 调用有参数的构造器创建 Device 匿名实现类的对象
        ai.test(new Device("电子显示器") {
            @Override
            public double getPrice() {
                return 67.8;
            }
        });

        // 调用无参数的构造器创建 Device 匿名实现类的对象
        Device d = new Device() {
            // 初始化块
            {
                System.out.println("匿名内部类的初始化块");
            }
            // 实现抽象方法
            @Override
            public double getPrice() {
                return 56.2;
            }
            // 重写父类的实例方法
            public String getName() {
                return "keyboard";
            }
        };
        ai.test(d);
    }
}

文章作者: Tianny
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 Tianny !
评论
 上一篇
Java入门-异常 Java入门-异常
异常层次 Error:Java 运行时系统的内部错误和资源耗尽错误。应用程序不应该抛出这种类型的对象。如果出现了这样的内部错误,除了通告给用户,并尽力使程序安全地终止之外,再也无能为力了。 Exception RuntimeExcepti
2020-04-02
下一篇 
Java入门-内部类 Java入门-内部类
非静态内部类public class Cow { private double weight; public Cow() { } public Cow(double weight) { t
2020-04-02
  目录