在Java中传递一个接口能不能实例化一个接口?
Can you instantiate an interface when passing an interface in Java?
例如,如果我有一个接口:
interface Executable {
void execute();
}
您将无法显式实例化它。如果您尝试创建接口可执行文件的新实例,则会出现编译错误,显示 'cannot instantiate the type 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!");
}
});
}
}
这怎么可能?您不是因为 new
关键字而创建接口 Executable
的新实例吗?有什么我不明白的吗?非常感谢简要说明和一些示例!
接口是 class 提供需要实现的方法模板。您不能按原样实例化接口,因为如果没有其方法实现,它什么也做不了。
如果您实例化一个实现接口的对象,则会提供方法的实现,并且其工作原理与使用相同方法的实现实例化接口几乎相同。在您的情况下,它称为 Anonymous Class ,它仅提供要使用的方法的必要实现。有接口:
interface Executable {
void execute();
}
实例化为:
Executable executable = new Executable() {
@Override
public void execute() {
System.out.println("Executed!");
}
}
这里您提供方法 execute()
一个实现。由于该接口只有一个方法并且充当功能接口,因此您可以使用 lambda 表达式对其进行简化,因为 Java 8:
Executable executable = () -> System.out.println("Executed!");
你不是因为 new 关键字而创建了一个新的 interface Executable 实例吗?
答案:您不是在实例化接口。实际上,您是在实例化一个实现了 Exceutable
的匿名内部 class .
示例是如何在 java
中创建线程
Thread t= new Thread(new Runnable() {
@Override
public void run() {
System.out.println("Hello World!");
}
});
在 Thread 构造函数中,我们传递了一个实现接口 Runnable
的匿名内部 class
例如,如果我有一个接口:
interface Executable {
void execute();
}
您将无法显式实例化它。如果您尝试创建接口可执行文件的新实例,则会出现编译错误,显示 'cannot instantiate the type 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!");
}
});
}
}
这怎么可能?您不是因为 new
关键字而创建接口 Executable
的新实例吗?有什么我不明白的吗?非常感谢简要说明和一些示例!
接口是 class 提供需要实现的方法模板。您不能按原样实例化接口,因为如果没有其方法实现,它什么也做不了。
如果您实例化一个实现接口的对象,则会提供方法的实现,并且其工作原理与使用相同方法的实现实例化接口几乎相同。在您的情况下,它称为 Anonymous Class ,它仅提供要使用的方法的必要实现。有接口:
interface Executable {
void execute();
}
实例化为:
Executable executable = new Executable() {
@Override
public void execute() {
System.out.println("Executed!");
}
}
这里您提供方法 execute()
一个实现。由于该接口只有一个方法并且充当功能接口,因此您可以使用 lambda 表达式对其进行简化,因为 Java 8:
Executable executable = () -> System.out.println("Executed!");
你不是因为 new 关键字而创建了一个新的 interface Executable 实例吗?
答案:您不是在实例化接口。实际上,您是在实例化一个实现了 Exceutable
的匿名内部 class .
示例是如何在 java
中创建线程Thread t= new Thread(new Runnable() {
@Override
public void run() {
System.out.println("Hello World!");
}
});
在 Thread 构造函数中,我们传递了一个实现接口 Runnable