是,Java將讓你繼承一個非final
具體類只是爲了混疊原始類的目的。
public class Foo { /* implementation */ }
public class Bar extends Foo {}
這將是最小的實現,假設只有在Foo
一個默認的構造函數。
public class Foo {
public Foo(String baz) { /* constructor implementation */ }
}
public class Bar extends Foo {
public Bar(String baz) { super(baz); }
}
所有非private
在Foo
方法將會被繼承下來:如果有帶參數的構造函數Foo
,那麼你必須爲你打算調用來創建你Bar
情況下每一個構造,如提供一個構造函數Bar
由Bar
。
它可能不起作用的唯一地方是如果您打算使用Bar
代替Foo
作爲泛型類型參數。
例如,如果您有List<Bar>
替換List<Foo>
,那麼你的List
不再持有任何Foo
情況下,或可能延長Foo
任何其他類的實例。
此外,因爲Java的泛型是不變的,一個List<Bar>
是不的List<Foo>
一個亞型,即使Bar
是Foo
。有關詳細情況,請參閱Is List a subclass of List? Why aren't Java's generics implicitly polymorphic?。此外,如果您使用List<? extends Foo>
以便您可以使用List<Foo>
或List<Bar>
,但您將無法add
null
以外的其他任何東西。
您聲明您不會在泛型中使用它,但如果您的需求被擴展,則值得記住。
總而言之,Java編譯器會讓你這樣做,但是有限的上升空間 - 使用Bar
而不是Foo
作爲別名 - 並且是一個潛在的缺點,我沒有理由使用這個別名過程。
我相信你需要關注構造函數,但是沒有義務覆蓋父類的任何方法,除非父類是抽象的。 – KevinO
你會使用'Foo'還是'Bar'作爲泛型類型參數,例如: '列表'? –
rgettman
@rgettman nope只是一個漸進重構的別名 – mfrankli