在Java中传递接口时可以实例化接口吗?

时间:2018-07-26 17:38:55

标签: java interface instantiation

例如,如果我有一个界面:

interface Executable {
    void execute();
}

您将无法显式实例化它。如果尝试创建接口Executable的新实例,则会出现编译错误,提示“无法实例化Executable类型”。

但是,当尝试将接口传递给方法时,我意识到您可以这样做:

class Runner {
    public void run(Executable e) {
        System.out.println("Executing block of code...");
        e.execute();
    }
}

public class App {
    public static void main(String[] args) {
        Runner r = new Runner();

        // When passing the Executable type, am I instantiating it?
        r.run(new Executable() {
            public void execute() {
                System.out.println("Executed!");
            }
        });

    }
}

这怎么可能?您是否由于Executable关键字而创建了接口new的新实例?有什么我不懂的吗?一个简短的解释和一些例子,不胜感激!

2 个答案:

答案 0 :(得分:3)

接口是一个类,提供需要实现的方法模板。您无法按原样实例化接口,因为如果没有其方法的实现,它将无法执行任何操作。

如果实例化实现接口的对象,则将提供方法的实现,并且其工作原理与使用相同方法的实现实例化接口的操作几乎相同。在您的情况下,它称为Anonymous Class,它仅提供要使用的方法的必要实现。具有界面:

interface Executable {
    void execute();
}

实例是:

Executable executable = new Executable() {
    @Override
    public void execute() {
        System.out.println("Executed!");
    }
}

在这里,您提供方法execute()的实现。由于该接口只有一种方法并且可以用作功能接口,因此从Java 8开始,您可以使用lambda表达式对其进行简化:

Executable executable = () ->  System.out.println("Executed!");

答案 1 :(得分:1)

由于新关键字,您不是在创建接口Executable的新实例吗? 答案:您没有实例化接口。实际上,您正在实例化实现Exceutable的匿名内部类。

一个示例将是如何在Java中创建线程

Thread t= new Thread(new Runnable() {

            @Override
            public void run() {
                System.out.println("Hello World!");

            }
        });

在Thread构造函数中,我们传递了一个实现接口Runnable

的匿名内部类。