継承・実装の関係で悩んでいます。
継承・実装の関係について悩んでいます。
ここでは、アクセス制御を考えずに、インスタンスかstaticかabstract(ここではabstract final staticやabstract classのこと)の違いで、どう継承するのか考えています。
// 継承 はメソッドのオーバーライドのことを考えます。(オーバーロードは考えない)
クラスAからクラスBでオーバーライドしたメソッドは、
クラスCでさらにオーバーライドできるのでしょうか?
クラスCが クラスBのクラスAからオーバーライドしたメソッド
をクラスBのメソッドとして見たときに、オーバーライドすることは可能なのでしょうか?
クラスA
│ インスタンスフィールドA
│ staticフィールドA
│
│ クラスA() { }
│
│ インスタンスメソッドA () { }
│ staticメソッドB() { }
↓
クラスB extends クラスA
│ インスタンスフィールドA // 継承
│ インスタンスフィールドB
│ staticフィールドB
│
│ サブクラス1() { } // コンストラクタは継承しない、super()で呼び出す
│
│ インスタンスメソッドA () { } // 継承
│
│ インスタンスメソッドB () { }
│ staticメソッドB () { }
↓
クラスC extends クラスB implements インタフェースD, ...
↑ インスタンスフィールドA // クラスBのフィールドを継承
│ インスタンスフィールドB // クラスBのフィールドを継承
│ インスタンスフィールドC
│ staticフィールドC
│
│ サブクラス2() { }
│
│ インスタンスメソッドA () { } // クラスBのメソッドを継承
│ インスタンスメソッドB () { } // クラスBのメソッドを継承
│ インスタンスメソッドD () { } // インタフェースDのメソッドを実装
│ インスタンスメソッドE () { } // インタフェースDのメソッドを実装
│
│
│ インスタンスメソッドC () { }
│ staticメソッドC() { }
│
interface インタフェースD extends インタフェースE
↑
│ staticフィールドD // public static final
│
│ インスタンスメソッドD() { } // public abstract
│ インスタンスメソッドE() { } // 継承
│
interface インタフェースE
staticフィールドE // public static final
インスタンスメソッドE() { } // public abstract
補足
>>1と>>2の方、ありがとうございます。 お礼をまとめてしまって申し訳ありません。 つまりabstractは実装されている(中身のある)methodを持ちつつも、 interfaceの様に継承したClassで実装されなければいけないmethodを定義できるということですね。 大変参考になりました。