0

所以我已经编程了几年了,所以我并不是真正的新手——但我刚刚开始学习 Java(从 C++ 开始)。在学习一个库并查看它的示例(如果你必须知道的话,jMonkeyEngine3)时,我遇到了我似乎无法找到任何文档的外国语法。

这是代码(所有这些都在一个类的范围内):

/** Custom Keybinding: Map named actions to inputs. */
private void initKeys() {
  // You can map one or several inputs to one named action
  inputManager.addMapping("Pause",  new KeyTrigger(KeyInput.KEY_P));
  inputManager.addMapping("Left",   new KeyTrigger(KeyInput.KEY_J));
  inputManager.addMapping("Right",  new KeyTrigger(KeyInput.KEY_K));
  inputManager.addMapping("Rotate", new KeyTrigger(KeyInput.KEY_SPACE),
                                    new MouseButtonTrigger(MouseInput.BUTTON_LEFT));
  // Add the names to the action listener.
  inputManager.addListener(actionListener, new String[]{"Pause"});
  inputManager.addListener(analogListener, new String[]{"Left", "Right", "Rotate"});

}

private ActionListener actionListener = new ActionListener() {
  public void onAction(String name, boolean keyPressed, float tpf) {
    if (name.equals("Pause") && !keyPressed) {
      isRunning = !isRunning;
    }
  }
};

我猜测定义部分 (15) 使用类中的默认构造函数创建了一个具有名为 actionListener 的私有作用域的 ActionListener 对象 - 然后覆盖/实现本身的 onAction 方法。然后在它的实现(11)中它只是引用这个创建的对象?那会是正确的吗?

非常感谢您的澄清。

4

1 回答 1

2

我猜定义部分 (15) 创建了一个 ActionListener 的对象

这种语法就是所谓的匿名内部类。在 JDK 8 出现之前,它与 Java 中的闭包或 lambda 表达式一样接近。您基本上是在动态创建一个新类。这实际上就像你说的一样:

private ActionListener actionListener = new MyActionListener();

class MyActionListener implements ActionListener {
    public void onAction(String name, boolean keyPressed, float tpf) {
        if (name.equals("Pause") && !keyPressed) {
            isRunning = !isRunning;
        }
    }
}

另一种方式只是使用更少的行。

具有私有范围

对象并不完全是私有的。私有只是保存对对象的引用的字段的可见性。物体本身可以像任何物体一样被传递到任何地方。

名为 actionListener

这是包含对创建的 ActionListener 的引用的字段的名称。

在类中使用默认构造函数

实际上,ActionListener 是一个接口,因此没有构造函数。即使是匿名内部类在技术上也没有默认构造函数。相反,它有一个“匿名构造函数”

于 2013-02-14T06:26:19.143 回答