お疲れ様です!!
続いて菅原先生が教えてくださったのは「型変換」についてです!!
継承関係があるクラス同士でオブジェクトの型変換ができる条件や注意点について学びました!!
それにしても、昨日のモヤモヤを朝にスッキリさせたからめっちゃ良い気分です!!
というわけで、まずは概要から。
【参照型の型変換について】
型変換では、自動で型変換できる場合と、キャストを使って型変換をする場合がある。
継承関係にあるクラス同士の型変換だったら、
スーパークラス = サブクラス(サブクラスのメソッドをスーパークラスに変換)
は、自動で行われ、
サブクラス = スーパークラス(スーパークラスのメソッドをサブクラスに変換)
は、キャストを使って型変換をする。
Student stu1 = new Student(~){
Person psn = stu1;
⇓
Studentクラスstu1をPersonクラスのオブジェクトpsnに代入。
Personクラスの中身には、Studentクラスの中身も入っているので、
確実に、メソッドを呼び出せるため、自動で行われる。
なお、Personクラスのpsnは、Personクラス内のメソッドのみアクセス
できる。
Student stu2 = (Student)psn;
⇓
PersonクラスのpsnをStudentクラスの新しいオブジェクトstu2に型変換するには、
キャスト(Student)を使わないとエラーになる。
これは、Personクラスのpsn自体はStudentクラスの情報を持っていないため、
変換した際に、必要な情報が含まれているのかが分からないため。
ちゃんとStudentクラスにインスタンスがあるということを伝えるためにキャストを使う。
psn.display();
⇓
psnは、Personクラスの情報しか取り込めないけど、オーバーライドは有効となる。
そのため、Studentクラスで、オーバーライドを使ってdisplay()を再定義している場合は、
Studentクラスで再定義した結果が出力される。
psn.chgStuNo(~);
⇓
psnにはない(Personクラスでは定義してない)メソッドなのでエラーとなる。
stu2.chgStuNo(~);
⇓
問題なし!!
といった感じです!!
そして、もう1つ学んだのが、「instanceof」というキーワード。
スーパークラスからサブクラスに型変更する際に、
「この対象オブジェクトは、このクラスのインスタンスですか?」
と確認をするためのキーワードとのことです!!
if(psn instanceof Student){
Student stu2 = (Student)psn;
stu2.chgStuNo;
stu2.display();
}
みたいな感じです!!
「オブジェクトpsnは、Studentクラスのインスタンスですか?」
という感じで、instanceofはtrueかfalseで返すキーワードなので、
trueなら、問題なく処理ができると理解できました!!
うん!
少し難しいと感じましたが、なんとか理解できました!!
次も楽しんでいこう!!!