如何调用匿名内部类

时间:2013-10-02 05:49:45

标签: java inner-classes

我有以下代码:

        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);  
    }  

从我的main,我调用getEmployeeById方法,该方法又调用jdbcTemplate.queryForObject。在这个方法中,第二个参数是实现RowMapper的匿名类,它有方法mapRow。如何调用mapRow方法。

3 个答案:

答案 0 :(得分:0)

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

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

答案 1 :(得分:0)

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

答案 2 :(得分: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。