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