2013-10-02 89 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()中,爲每個jdbcTemplate檢索的記錄調用RowMapper。

+0

謝謝。這回答了我的問題。 –