アップキャストとダウンキャスト(java)
アップキャストとは
アップキャストとは継承するときに自動的に生成されているインスタンスのことである
基本的にはextendsすることでJVMが自動で生成してくれるものである
以下のクラスを見て欲しい
まずはAクラス
public class A{ public int num=10; }
次にAクラスを継承したBクラス
public class B extends A{ public static void main(String[] args) { B b = new B(); System.out.println(b.num); } }
Bクラスでは当然、numは継承されているので10を出力することができる
しかしこれには隠れたコードが存在するのである
それを示したものを次に書く
public class B extends A{ public static void main(String[] args) { B b = new B(); A a = b;//A型のaにB型のbを代入 System.out.println(a.num); } }
継承というのはそもそも継承元のクラスの上に差分プログラムを追加したものになるという認識である
元々、B型で唱えられたb.numはBクラスのnumとなっているがnumはAクラスにあったものである
なのでJVMはA型のaにBクラスのインスタンスを代入することでnumをAクラスのもので使用しているように修正してくれているのである
これがアップキャストと言われるものである
普段は自動で生成されるものであるので目に見えるものではない
ダウンキャストとは
ダウンクラスはスーパークラスからサブクラスへ変換してくれるものであるダウンキャストは自動で生成されないものなので注意したい
先ほどのBクラスでダウンキャストを使ったものを紹介する
public class B extends A{ public static void main(String[] args) { B b = new B(); A a = b; b =(B) a; System.out.println(b.num); } }
Bクラスのアドレスが入っているaではAクラス(スーパークラス)の成分しか表示はできない
しかし、「b = (B) a;」とすることで新たな変数bにaに書いているBクラス(サブクラス)の成分を表示できるようにしたのである
public class B extends A{ int i=3; public static void main(String[] args) { B b = new B(); A a = b; b =(B) a; System.out.println(b.i); } }
このようにBクラス内に変数iを宣言した
これをa.iでは表示することはできないので「b = (B) a;」でBクラスの成分を表示できるようにしたのである
これがダウンキャストである