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のスコープの範囲が勉強になった。
![](https://assets.st-note.com/img/1643233980667-ETJxpSjIui.png)
勉強前は継承をすると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をもっと極めていきたいと思います。
この記事が気に入ったらサポートをしてみませんか?