Java抽象类构造函数和新关键字

时间:2014-09-25 15:28:22

标签: java oop constructor abstract

我是初级开发人员,我熟悉java抽象类背后的理论,以及他们如何使用构造函数来强制子类设置某些构造函数参数,以及抽象类本身如何无法实例化。但是,当我在公司的测试框架中查看一些重构代码时,我有些困惑。

这个抽象类

public abstract class WaitForTestOutcomeThenAssert {

   private long maxWait;

   public WaitForTestOutcomeThenAssert(long maxWait) {
      this.maxWait = maxWait;
   }

   public void waitForConditionThenAssert() {
    ...
    ...
   }

   protected abstract boolean checkCondition();
}

在此类中被引用:

public class DbWrapper extends AbstractDB {

    @Override
    public void assertColumnValueNotNull(final String schema, final String table, final String columnName, final String whereClause) {

        new WaitForTestOutcomeThenAssert(this.assertionTemporalTolerance) {

             @Override
             public boolean checkCondition() {
                 return getColumnValue(schema, table, columnName, whereClause) != null;
             }
       }.waitForConditionThenAssert();
   }
}

由于我们无法实例化一个抽象类,有人可以向我解释一下当我们在抽象类构造函数前面使用 new 关键字时会发生什么以及创建什么?

3 个答案:

答案 0 :(得分:1)

这不是一个抽象类

  new WaitForTestOutcomeThenAssert(this.assertionTemporalTolerance) {

         @Override
         public boolean checkCondition() {
             return getColumnValue(schema, table, columnName, whereClause) != null;
         }
   }

这是一个扩展WaitForTestOutcomeThenAssert的匿名类。换句话说,通过写你是子类化" WaitForTestOutcomeThenAssert"并实例化它。

答案 1 :(得分:1)

尝试查看anonymous classes。这里有一个匿名类声明,它扩展了抽象类WaitForTestOutcomeThenAssert并覆盖了checkCondition方法。

答案 2 :(得分:1)

这是一个 Anonymous 类。它是使用 Abstract 类或接口的快捷方式,无需显式编写子类。