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。

4

3 回答 3

0

您的代码和示例之间的主要区别在于示例返回一个可以操作的对象。

在您的代码中,如果您调用go()内部代码,则将调用该foof()方法,因为不会从任何地方调用该方法。

于 2013-10-02T05:56:07.207 回答
0

内部类的对象被传递给doStuff()该方法,然后该方法将其逻辑应用于该对象,并且它可以调用或不调用foof()方法,它选择实现者。匿名内部类不会限制将其对象作为变量传递。

于 2013-10-02T05:56:34.867 回答
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。

于 2013-10-02T08:17:28.167 回答