JavaSilverの取得のためにJavaの基礎で理解が浅い部分をまとめてみています。
継承
継承の概念自体は理解しているつもりです。
継承というより機能を拡張すると表現したほうが個人的には理解しやすいかと思います。
スーパークラスの方が抽象度が高くて機能が少なくて、より具体的な機能が追加されてスーパークラス+α(拡張)になったのがサブクラスというイメージです。
・スーパークラス
class SuperA {}
・スーパークラスを継承したサブクラス
class SubA extends SuperA {}
できないこと
- extendsのあとに複数のスーパークラスは指定できない。
class SubA extends SuperA, SuperB {}
-
スーパークラスで定義したprivateなメンバはサブクラスで使用できない。
スーパークラスで定義したメンバはサブクラスで使用できるがprivateなメンバは同一クラスのからしか使用できないため、サブクラスでも使用できない。
-
メソッドをオーバーライドする場合のアクセス修飾子はスーパークラスで指定している以上の公開範囲でないといけない。
例えばスーパークラスでpublicを指定しているメソッドをオーバーライドする場合はpublicを指定しないといけない。(公開範囲は狭められない。)
・アクセス修飾子の公開範囲
広い | ─ | ─ | 狭い |
---|---|---|---|
public | protected | デフォルト | private |
どのクラスからでもアクセス可 | サブクラス or 同一パッケージ | 同一パッケージ | 同一クラスのみ |
- final修飾子のついているメンバはオーバーライドできない。
参照型の型変換
スーパークラスとサブクラスでの型変換については以下の2種類があります。
※ついでにインターフェースについても。。。
暗黙型変換
サブクラス→スーパークラス
実装クラス→インターフェースキャストによる型変換
サブクラス←スーパークラス
実装クラス←インターフェース
つまり変換後に使用できる機能が減らなければ暗黙型変換ができるというイメージですかね?
その他
-
オーバーライド時に呼び出されるメンバ
サブクラスのオブジェクトをスーパークラス型の変数に代入した場合、インスタンスメソッド以外はスーパークラスのメンバが呼び出される。