【发布时间】:2017-11-28 23:01:59
【问题描述】:
我试图使用我曾经购买的火花图表来复习一些 Java 语言。关于匿名内部类的使用,他们给出了这个例子:
Dice rollDice() {
return new Dice() {
int number = (int)( Math.random() * 6 ) + 1;
};
}
问题是,我看不出这是如何工作的,也无法让编译器接受它作为另一个类中的方法。编译器抱怨每次对 Dice 的引用“找不到符号”。
我是否没有正确理解他们的示例,或者这是完全无效的代码?提前致谢!
附言如果这是工作代码,有人可以提供一个如何使用它的示例吗?
编辑:我终于找到了一些有意义的东西 匿名内部类的语法如下所示
new SuperClassName/InterfaceName() {
// Implement or override methods in superclass or interface
// Other methods if necessary
}
上面的代码被传递给一个方法,该方法接受一个超类的实例或完全实现接口。例如,一个具有EventHandler参数的方法,我们还没有定义一个实现handle(ActionEvent e)方法的类。
enlargeButton.setOnAction(
new EventHandler<ActionEvent>() {
public void handle(ActionEvent e) {
circlePane.enlarge();
}
});
这样,它将真正匿名。我认为Java自己的教程中给出的示例非常糟糕。
【问题讨论】:
-
Java 没有标准的
Dice类,因此“找不到符号”。该示例可能包含您未向我们展示的其他部分。无论如何,这看起来不像是使用匿名内部类的首选方式,这使得这个示例更加不清楚。 -
不,该示例不包含我没有向您展示的其他部分。这就是我问这个问题的原因,我很不清楚,我想知道我是没有正确阅读它还是真的不理解这个例子的使用。我现在假设他们的例子只是垃圾。
-
如果您将它放在
class Dice{...}中,该代码将会编译。但是这个例子仍然不是很有用,因为我们只是将随机数包装在 Dice 对象中。这样的骰子不会让我们返回所有 1-6 个数字,它只能返回一个数字,这使得这个例子至少不清楚。如果您想了解匿名课程,请考虑使用官方教程,例如 docs.oracle.com/javase/tutorial/java/javaOO/… -
他们在java教程中的例子似乎完全无视“匿名”的想法。正如我所学的,之前在他们自己的教程中定义的“匿名”意味着它没有分配给变量而只是使用。然而,他们将这些对象分配给变量
frenchGreeting和englishGreeting。它有一个声明的名称,因此不是匿名的。 -
我想知道是什么让您认为““匿名”意味着它没有分配给变量”,因为这不是真的。匿名类是没有任何 特定 名称的类,因此您不能在其他地方重用它来重新实例化它(至少不是通常情况下,您可以通过反射来实现,但事实并非如此)。但我们并不真正关心该类的名称是什么,我们只关心该类的实例如何表现。例如,我们可以创建一个像
ActionListener al = new ActionListener(){ ... }这样的 ActionListener 并将其传递给许多按钮。
标签: java class inner-classes