2014-09-25 76 views
0

我是一名初級開發人員,我熟悉java抽象類的理論以及它們如何具有構造函數來強制子類設置某些構造函數參數,以及抽象類本身如何不能實例化。但是,在我公司的測試框架中查看一些重構代碼時,我有些困惑。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(); 
    } 
} 

既然我們不能實例化一個抽象類,可有人請向我解釋不清楚發生什麼事,什麼被創建當我們在抽象類構造函數前面使用新的關鍵字?

+0

這是[anonymous class](http://www.docstore.mik.ua/orelly/java-ent/jnut/ch03_12.htm)。基本上是一個沒有名字的內聯類。 – clcto 2014-09-25 15:31:23

+0

[Java中如何使用匿名(內部)類?](http://stackoverflow.com/questions/355167/how-are-anonymous-inner-classes-used-in-java) – 2014-09-25 15:32:39

+0

請參閱http ://docs.oracle.com/javase/tutorial/java/javaOO/anonymousclasses.html#syntax-of-anonymous-classes – 2014-09-25 15:36:05

回答

1

試試看anonymous classes。這裏有一個匿名類聲明,它擴展了抽象類WaitForTestOutcomeThenAssert並覆蓋了checkCondition方法。

1

這不是一個抽象類

new WaitForTestOutcomeThenAssert(this.assertionTemporalTolerance) { 

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

這是一個擴展WaitForTestOutcomeThenAssert一個匿名類。換句話說,通過編寫你正在繼承「WaitForTestOutcomeThenAssert」並實例化它。

1

這是一個匿名類。這是使用摘要類或接口的快捷方式,無需顯式編寫子類。