我正在阅读一本教科书,我想知道我们传递给函数的参数是如何既不是原始的,也不是用户定义的类实例。
SwingUtilities.invokeLater(new Runnable()
{
public void run() {
new ButtonDemo();
}
});
我了解到这是其中之一。但是在这里它似乎传递了用户定义的构造方法,例如Runnable接口()。看来他们想在以后运行该线程,但什么时候?这是否合法,我认为是,但我从来没有在我的Java类中听说过这样的事情。
答案 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.class
和Test$1.class
,如果您有更多内部类,则会有Test$2.class
,Test$3.class
等等。
答案 5 :(得分:0)
将代码作为函数参数传递
Java将在第8版中使用lambda表达式。值得查看这个:http://docs.oracle.com/javase/tutorial/java/javaOO/lambdaexpressions.html