2013-10-02 3 views
0

Я имею следующий код:как сделать вызов на анонимный внутренний класс

 class MyWonderfulClass { 
    void go() { 
     Bar b = new Bar(); 
      b.doStuff(new Foo() { 
       public void foof() { 
       System.out.println("foofy"); 
       } // end foof method 
     }); // end inner class def, arg, and b.doStuff stmt. 
    } // end go() 
    } // end class 

    interface Foo { 
    void foof(); 
    } 
    class Bar { 
    void doStuff(Foo f) { } 
    } 

В строке 4, анонимный класс передается в качестве аргумента. Я хотел знать, как вызывается метод foof() этого класса.

На самом деле возникает мой вопрос из того, потому что я не понимаю, следующий код:

public Employee getEmployeeById(longid){ 
      return jdbcTemplate.queryForObject(SELECT_QUERY, 
      new RowMapper<Employee>(){ 
        public Employee mapRow(ResultSetrs, 
        int rowNum)throwsSQLException{ 
          Employee employee=newEmployee(); 
          employee.setId(rs.getLong("id")); 
          employee.setFirstName(rs.getString("firstname")); 

          employee.setLastName(rs.getString("lastname")); 
          employee.setSalary(rs.getBigDecimal("salary")); 
          return employee; 
        } 
      }, 
      id); 
    } 

Из моей основной, я называю метод getEmployeeById, который, в свою очередь, вызывает jdbcTemplate.queryForObject. В этом методе второй аргумент представляет собой анонимный класс, реализующий RowMapper, который имеет метод mapRow. Как вызывается метод mapRow.

+0

Метод, по которому вы передаете экземпляр, вызывает метод таким же образом, как и любой другой экземпляр экземпляра. – Sinkingpoint

ответ

0

Основное отличие между вашим кодом и образцом заключается в том, что образец возвращает объект, на который можно воздействовать.

В вашем коде, если вы позвоните go(), ваш внутренний код будет вызываться как метод foof() не вызывается нигде.

0

Объект внутреннего класса передается doStuff(), а затем этот метод применяет свою логику к этому объекту и может вызывать или не вызывать метод foof(), его выбор разработчика. Анонимный внутренний класс не ограничивает передачу своего объекта в качестве переменной.

0

в вашем примере, foof() не называется магически. он должен быть вызван в логике doStuff().

DoStuff() может выглядеть так:

class Bar { 
    void doStuff(Foo f) { 
     System.out.println("I am doing some stuff"); 
     f.foof(); 
     System.out.println("finish doing some stuff"); 
    } 
} 

В приведенном выше случае, DoStuff() напечатает строку «Я делаю некоторые вещи», и делать все, что сказано делать (что реализация Foo, которая передается в), и распечатать строку «закончить».

Желаю, чтобы изображение было ясно с приведенным выше примером.

Конечно, это может быть сложнее, чем приведенный выше пример. Например, в jdbcTemplate.queryForObject() RowMapper вызывается для каждой записи, которую извлекает jdbcTemplate.

+0

Спасибо. Это отвечает на мой вопрос. –

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