java 匿名内部类

2年前 (2022) 程序员胖胖胖虎阿
320 0 0

1. 匿名内部类介绍

使用 Java 编程时,常常需要创建不会被再次使用的对象。在这种情况下,非常适合使用一种特殊
的内部类:匿名内部类。这种类没有名称,是在同一条语句中声明和创建的。
要使用匿名内部类,可将引用对象的代码替换为关键字 new、对构造函数的调用以及用大括号
({和})括起的类定义。
既然是匿名类,所以你无法在别的地方实例化和使用这个类。
匿名内部类也可用于接口(interface)的实现

特点

匿名对象:没有名字的对象。
new ClassName().run();

非匿名对象:含有名字的对象。
ClassName c=new ClassName();
c.run();

2. 匿名内部类语法

例如一般的写法:

ThreadClass task = new ThreadClass();
Thread runner = new Thread(task);
runner.start();

转化成:

Thread runner = new Thread(new Runnable() {
    public void run() {
        // thread does its work here
    }
});
runner.start();

即,这相当于将 Thread(task)的参数task替换成下面的代码实现:

new Runnable() {
    public void run() {
        // thread does its work here
    }
}

2.1 匿名内部类的另一种写法

new 类名或者接口名() {
    重写方法;
}

var t = new Thread() {
    public void run() {
        这是被重写的方法;
    }
}

3. 我的代码实现

class GoogleInc {
    void google1() {
        System.out.println("Google 1 Inc class, google 1");
    }

    void google2() {
        System.out.println("Google 2 Inc class, google 2");
    }
}


class AnonymousClass {
    AnonymousClass(GoogleInc golc) {
        golc.google1();
        golc.google2();
    }
}


public class AnonymousInnerClass {
    public static void main(String[] args) {
        AnonymousClass gc = new AnonymousClass(new GoogleInc() {
            // Overloaded function [google1()]
            void google1() {
                System.out.println("Anonymous inner class, google 1");
            }

            void doAnotherAnything() {
                System.out.println("Do another anything");
            }
        });
    }
}

4. 使用匿名内部类实现接口

HardwareInc这是一个接口,这个接口同时还继承了另外一个接口,继承另外一个接口只是将另外一个接口的抽象方法添加到这个接口中,并没有其他的特别之处,这样这个接口中的抽象方法总数为这个接口的抽象方法数加另一个接口的抽象方法数

public interface HardwareInc {
    public void designPhone();
    public void designComputer();
    public void designWatch();
}

class HuaweiInc {
    // Use anonymous inner classes to implement interfaces HardwareInc
    HuaweiInc(HardwareInc hwi) {
        hwi.designPhone();
        hwi.designComputer();
        hwi.designWatch();
        hwi.elec();
        hwi.software();
    }
}

// Use anonymous inner classes to implement interfaces HardwareInc
HuaweiInc HwInc = new HuaweiInc(new HardwareInc() {
    @Override
    public void designPhone() {
        System.out.println("Huawei design Huawei mate40");
    }

    @Override
    public void designComputer() {
        System.out.println("Huawei design Huawei matebook");
    }

    @Override
    public void designWatch() {
        System.out.println("Huawei design watchGT");
    }

    @Override
    public void elec() {
        System.out.println("Huawei have elec developer");
    }

    @Override
    public void software() {
        System.out.println("Huawei have software developer");
    }
});

版权声明:程序员胖胖胖虎阿 发表于 2022年9月14日 下午5:48。
转载请注明:java 匿名内部类 | 胖虎的工具箱-编程导航

相关文章

暂无评论

暂无评论...