将代码作为函数参数传递

时间:2013-12-20 20:56:57

标签: java swing

我正在阅读一本教科书,我想知道我们传递给函数的参数是如何既不是原始的,也不是用户定义的类实例。

SwingUtilities.invokeLater(new Runnable() 
{
    public void run() {
        new ButtonDemo();
    }
});

我了解到这是其中之一。但是在这里它似乎传递了用户定义的构造方法,例如Runnable接口()。看来他们想在以后运行该线程,但什么时候?这是否合法,我认为是,但我从来没有在我的Java类中听说过这样的事情。

6 个答案:

答案 0 :(得分:6)

这实际上是传递一个实现Runnable接口的匿名内部类的实例。在the Java tutorial中了解它们。

答案 1 :(得分:5)

  

我想知道我们传递给函数的参数如何既不是原始的,也不是用户定义的类实例。

它是用户定义的类的实例。唯一的区别是这个类没有名称 *

它是一个类的真实实例 - 它可以完成命名类可以执行的大多数操作。除其他外,它可以提供其基类或接口的方法的实现,这是用于将“一段可执行代码”传递给方法的。

* 至少,不是用户可见的:Java编译器会为每个匿名类分配一个内部名称,该名称通常包含一个美元符号。

答案 2 :(得分:3)

SwingUtilities中的代码就是这样的

private Runnable runnable;

private void invoke(){//called at some point from inside the runnable
     runable.run();
}
public void invokeLater(Runnable runnable){
     this.runnable=runnable;
}

这些被称为回调。

答案 3 :(得分:1)

这称为匿名类,您可以在其中为一次使用定义一个类,但不为其提供名称。

要更好地理解它们,请参阅本教程:http://docs.oracle.com/javase/tutorial/java/javaOO/anonymousclasses.html

答案 4 :(得分:0)

了解Anonymous Classes。这被视为单独的类。如果您编译代码并说文件名是Test.java。通过编译,将有两个类文件Test.classTest$1.class,如果您有更多内部类,则会有Test$2.classTest$3.class等等。

答案 5 :(得分:0)

  

将代码作为函数参数传递

Java将在第8版中使用lambda表达式。值得查看这个:http://docs.oracle.com/javase/tutorial/java/javaOO/lambdaexpressions.html