大阪市中央区 システムソフトウェア開発会社

営業時間:平日09:15〜18:15
MENU

Javaマスターへの道 資格勉強編 Part23

株式会社クローバーフィールドの経営理念
著者:miyauchiatsushi
公開日:2023/09/09
最終更新日:2023/09/09
カテゴリー:技術情報
タグ:

今日は昨日の続きをやっていきますのでまだ見ていない方はこちらから

昨日のプログラムを一部修正したものを使用していこうと思います。

修正箇所の説明をしていきます。
1、前回のプログラムではコンストラクタでidとnameを初期化していましたが、
あのままではSubクラスのコンストラクタでは初期化できないため、
明示的にsuper(id, name)と指定して初期化を出来るようにしています。

2,アクセス修飾子にprivateを指定して外部クラスからは直接操作できないようにしました。
これはカプセル化と言われていて、以前のブログでも少し紹介していますのでよければこちらから

修正箇所は以上ですので、ここから本題に入っていこうと思います。

今回のテーマは2つあります。
1つ目はSubクラスの変数追加部分です。
Sub型のインスタンスをSuper型に詰めている変数aと
Super型のインスタンスをSub型に詰めている変数bがありますね。
コードを見るとわかるので結論からお話しますが、
変数aは宣言できますが、変数bはコンパイルエラーとなります。
これは型変換ができないのでエラーになるのですが、少し違和感がありますよね。
例えばint型の変数にlong型のデータの変数を入れるなどの型変換はサイズが大きいほうから小さいほうに
するのでデータが一部損失するため明示的にキャストを書きコンパイルエラーを避けます。
ですが今回の場合はその逆がコンパイルエラーになってしまいます。
なので継承時のクラスのキャストは特殊であることを覚えておきましょう。

2つ目はchangeInfo()メソッドで一度初期化したものを変更する機能を持っています。
このメソッドを挟むことで初期化時に間違えてしまっても、
修正することができるので大変役に立ちそうです。
機能としてはありがたいのですが、データの変更を容易にしてしまうメソッドなどは
あまり推奨はされません。
本来はコンストラクタでのみデータは初期化されるためデータ隠蔽が実現できているのです。
数千行のコードがあった場合に途中のどこかでデータが変更されでもしたら大変ですよね。
そのようなことを防ぐためにもデータを変更するようなメソッドは書くべきではないでしょう。

今日はここまでです。
次回もお楽しみに!

    上に戻る