Java学習 継承について

Javaの継承について、勉強になったこと・忘れかけていたことをがあったのでまとめます。

[継承の基本]

・B extends Aはインスタンス化時にBインスタンスの中にAのコードをコピーしているわけではなく、Bインスタンス・Aインスタンスをそれぞれ生成して、それをBインスタンスとして扱っている。
・privateな変数は継承されない(サブクラスから不可視)。
・コンストラクタは継承されない。
・コンストラクタはスーパークラスから実行される。
・B extends A、C extends Bで、BがAのメソッドをオーバーライドしている時、CはBのオーバーライドしたメソッドを使うことになる。CはA、B、Cのメソッドが使えるクラスとなる。

[勉強になったこと]

継承をした状態でのthisのスコープの範囲が勉強になった。

サブクラスBのnumにsetNumに渡された値が渡されるわけではない。

勉強前は継承をするとBとAのインスタンスがくっつくくらいの認識でした。

経験的にAのnumに値が入らないのはわかったのですが、thisでBのnumに入るんじゃない?と質問され、

「そういわれるとそうかもしれない・・・this.の範囲ってどこ??」と自信を失いました。

ここで反論するには、
①AのインスタンスとBのインスタンスはあくまで別で作られていて、BはAのコードを持っていない。よってAのthis.numはあくまでAの方のthis.numしか指さない。
②スーパークラスの変数にアクセスするsuper.XXがある。よって仮にA側がprivateでなくpublicなどだとしたらsuper.XXでアクセスするはず。this.はあくまで自身のインスタンスのメンバ変数を指すthis.です。

また、コンストラクタはスーパークラスの物から(正確にはサブクラスのコンストラクタの先頭行で呼び出されたsuper();などから)呼び出されます。

これにはスーパークラスの初期化が完了する前に、スーパークラスにアクセスできてしまうと、スーパークラスの変数を変更→初期化のような事が起きてしまうからです。

とても勉強になり深まりました。

改めてJavaをもっと極めていきたいと思います。


この記事が気に入ったらサポートをしてみませんか?