Java 基于接口的匿名类定义。。。大概

Java 基于接口的匿名类定义。。。大概,java,Java,我在《SpringInAction》一书中看到了这个Java片段,但我不熟悉语言结构 new RowMapper() { public Object mapRow() throws SQLException, DataAccessException { Motorist motorist = new Motorist(); motorist.setId(rs.getInt(1)); motorist.setEmail(rs.getString(2)); mot

我在《SpringInAction》一书中看到了这个Java片段,但我不熟悉语言结构

new RowMapper() {
  public Object mapRow() throws SQLException, DataAccessException {
    Motorist motorist = new Motorist();
    motorist.setId(rs.getInt(1));
    motorist.setEmail(rs.getString(2));
    motorist.setPassword(rs.getString(3));
    motorist.setFirstName(rs.getString(4));
    motorist.setLastName(rs.getString(5));
    return motorist;
  }
}
根据,RowMapper是一个接口。在我看来,它就像一个基于RowMapper接口的匿名类定义。
new
关键字有点让人困惑,让我想知道这是否也创建了匿名类的一个实例。我想是的,因为如果类没有名称,那么在定义它的行之后,您将如何创建实例

谁能证实我的猜测:

  • 这是一个基于RowMapper接口的匿名类定义,并且
  • 它创建该类的单个实例

    • 你的猜测完全正确。匿名类定义可以基于非最终类或接口,并且必须实现所有抽象(或接口)方法。声明匿名类的唯一可用语法是
      new
      ,它还具有仅实例化匿名类的一个实例的效果(不过,在程序过程中,如果多次执行此代码,则可以创建同一匿名类的多个实例)

      这是一个基于RowMapper接口的匿名类定义

      事实就是这样

      它创建该类的单个实例?


      是的。这是正确的。

      仅根据上面的代码,在不了解RowMapper的情况下,您可以假设基于RowMapper的新匿名类(可能是接口或类)已实例化。

      该代码以匿名方式实现接口

      语法类似于:

      Runnable runnable = new Runnable() {
          public void run() {
          }
      };
      

      注意声明末尾的分号。这里的runnable对象虽然包含对runnable接口的引用,但实际上包含了实现的对象。这就是你的梦想

      接口告诉构建的类实例应该有什么方法,或者如果你是标签接口,那么应该与它关联什么样的行为

      匿名类基本上是在实例化类实例时使用自定义代码对其进行扩展的类。所以,如果您正在实例化一个接口,那么您必须编写该接口所描述的所有方法,只要您至少做了这么多,编译器就会很高兴。这里就是这么做的

      这是基于RowMapper接口的匿名类定义吗? 对。如您所见,
      mapRow()
      函数已经编写完成。若您调试了可以看到的代码,那个么它不是接口实例的类,而是扩展接口的类。在抽象类或只是类的情况下,它将是相同的扩展。所以,如果类是final,则不能为其编写匿名类

      它是否创建该类的单个实例?
      好吧,它扩展了它并做了一个实例。它将是单个实例,对它的任何后续调用都将导致不同的类。如果调试代码,您甚至可以看到与之动态关联的不同类名。

      声明匿名类,并在下面的示例中创建两个实例

      public class Multithread {
          void test(){
          new Runnable() {
              @Override
              public void run() {
      
                  System.out.println("1");
              }
           }.run();
           new Runnable() {
               @Override
               public void run() {
      
                   System.out.println("11");
               }
            }.run();}
      
      
      
          public static void main(String[] args) {
              new Multithread().test();
            }
      
      
      
      }
      

      “根据Spring文档,RowMapper是一个接口。”@aioobe感谢您的提示,我只想说的是,这种语言结构并不局限于接口。我的回答似乎有点不清楚。看起来很危险。我想知道如果你第二次给出不同的类定义会发生什么。