例如,如果我有一个界面:
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
的新实例?有什么我不懂的吗?一个简短的解释和一些例子,不胜感激!
答案 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