Java中的新功能,请耐心等待我:)
我正在使用JFrame,使用EventQueue.invokeLater处理事件。
以下是代码段
public class Library extends JFrame {
static Library frame;
private JPanel contentPane;
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
public void run() {
try {
frame= new Library();
frame.setVisible(true);
} catch (Exception e) {
e.printStackTrace();
}
}
});
}
我的问题是,当匿名类实现Runnable时,它的外观如何。当我创建匿名类的新对象时,我认为它看起来像下面。
public class Anonymous implements Runnable {
Anonymous(){
Thread newThread = new Thread(this);
newThread.run(); //from here my above it enters into above implementation of run method and executes the code within it. Is it correct ?
}
public static void main(String[] args){
Runnable Object = new Anonymous();
}
}
当我们以上述方式实现Runnable时,它的工作方式是什么?如果没有人可以帮我理解这个?
由于
答案 0 :(得分:0)
如果实现接口,则必须提供该接口的所有方法。这有时称为合同编程。
如果Anonymous实现了Runnable,它必须有一个run()方法。然后创建一个Anonymous实例并调用它。
Anonymous annon = new Anonymous();
EventQueue.invokeLater(annon);
https://docs.oracle.com/javase/tutorial/essential/concurrency/runthread.html
答案 1 :(得分:0)
Runnable只是一个界面,它的实现与其他任何一样。它被广泛使用的事实并没有使它在实现方面具有特殊性(不要将它与线程或它通常在旁边显示的任何东西相关联)。
有许多方法可以为接口提供实现,其中最常见的是:
1 - 定义类和实现接口
请注意,您的声明无效,因为它未提供run
方法的实现。
class Anonymous implements Runnable {
public void run() {
try {
frame= new Library();
frame.setVisible(true);
} catch (Exception e) {
e.printStackTrace();
}
}
}
您可以使用以下内容:
EventQueue.invokeLater(new Anonymous());
2 - 内部课程,就像您的第一个示例一样。这是Java编译为接口实现的完整类
3 - Lambdas :这些将起作用因为Runnable
是一个功能界面:
EventQueue.invokeLater(() -> {
try {
frame= new Library();
frame.setVisible(true);
} catch (Exception e) {
e.printStackTrace();
}
});
4 - 方法参考:假设一个静态方法Library.makeFrameVisible
:
private static void makeFrameVisible() {
try {
frame= new Library();
frame.setVisible(true);
} catch (Exception e) {
e.printStackTrace();
}
}
您可以使用方法参考来调用它:
EventQueue.invokeLater(Library::makeFrameVisible);
以上所有都是制作Runnable
界面的可行方法,您将看到多种形式的可运行实例,包括上面的那些......