将代码作为函数参数传递

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

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

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

这实际上是传递一个实现Runnable接口的匿名内部类的实例。 在Java教程中阅读它们。

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

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

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

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

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; } 

这些被称为回调。

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

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

阅读有关匿名类的信息 。 这被视为单独的类。 如果您编译代码并说文件名是Test.java 。 通过编译将有两个类文件Test.classTest$1.class ,如果你有更多内部类,你将有Test$2.classTest$3.class等等。

将代码作为函数参数传递

Java将在第8版中使用lambda表达式。值得一试的是: http : //docs.oracle.com/javase/tutorial/java/javaOO/lambdaexpressions.html