2013-02-14 3 views
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) он просто ссылается на этот созданный объект? Правильно ли это?

Большое спасибо за разъяснение.

+0

Обычно принято включать код в свой вопрос, а не ссылку на внешний ресурс. Он держит все в одном месте и легче для всех. Я потянул его за вас. Добро пожаловать в переполнение стека! –

+0

О, мне очень жаль. Я буду помнить это в следующий раз! –

ответ

2

Я предполагаю, что определяющая часть (15) создает объект ActionListener

Этого синтаксис то, что известно как anonymous inner class. Это так близко, что вы можете перейти к закрытию или выражению лямбда в Java, пока не появится 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; 
     } 
    } 
} 

Другой способ просто использует меньше линий.

с частной сферы

Это не точно, что объект является частной собственностью. Частный - это только видимость поля, содержащего ссылку на объект. Сам объект может быть передан где угодно, как и любой объект.

имени ActionListener

Это имя поля, которое содержит ссылку на созданный ActionListener.

используя конструктор по умолчанию в классе

На самом деле, ActionListener является интерфейсом и, следовательно, не имеет конструкторов. Даже анонимный внутренний класс технически не имеет конструктора по умолчанию. Вместо этого у него есть "anonymous constructor".

Смежные вопросы