首页 > 其他 > 详细

匿名内部类

时间:2020-03-11 14:33:47      阅读:69      评论:0      收藏:0      [点我收藏+]

匿名内部类

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

使用匿名内部类

  • 匿名内部类必须继承一个父类,或者实现一个接口,但最多只继承一个父类或者实现一个接口。
  • 匿名内部类不能是抽象类,因为系统在创建匿名内部类时,会立即创建该类的实例。
  • 匿名内部类不能定义构造器。由于匿名内部类没有类名,所以无法定义构造器,但可以定义初始化块,通过初始化块来完成构造器需要完成的事情

实现一个接口的:

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

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!