【问题标题】:Java abstract class constructor and new keywordJava抽象类构造函数和new关键字
【发布时间】:2014-09-25 15:28:22
【问题描述】:

我是一名初级开发人员,我熟悉 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 关键字时会发生什么以及创建了什么?

【问题讨论】:

标签: java oop constructor abstract


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    这不是抽象类

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

    这是一个扩展 WaitForTestOutcomeThenAssert 的匿名类。换句话说,通过编写您正在继承“WaitForTestOutcomeThenAssert”并实例化它。

    【讨论】:

      【解决方案3】:

      这是一个匿名类。这是使用 Abstract 类或 Interface 的捷径,无需显式编写子类。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2015-03-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-12-04
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多