外语句法 - 需要帮助理解

时间:2013-02-14 06:09:37

标签: java syntax programming-languages

所以我几年来一直在编程,所以我不是很新 - 但我刚开始学习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)中,它只是引用这个创建的对象?这是对的吗?

非常感谢你的澄清。

1 个答案:

答案 0 :(得分:2)

  

我猜测定义部分(15)创建了一个ActionListener

的对象

这种语法就是所谓的anonymous inner class。它与Java中的闭包或lambda表达式一样接近,直到JDK 8出现。你基本上是在动态创建一个新类。它实际上就像你说的那样:

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

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

  

私有范围

对象是私有的并不完全是这样。 Private只是保存对象引用的字段的可见性。对象本身可以随处移动,就像任何对象一样。

  

命名为actionListener

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

  

使用类

中的默认构造函数

实际上,ActionListener是一个接口,因此没有构造函数。甚至匿名内部类在技术上也没有默认构造函数。相反,它有一个"anonymous constructor"