型を変換できます
プログラミングの世界では「キャスト」というものがあります。これはデータの型変換のことを言います。例えば数字の32ビット表現のint型と64ビットのlongを型変換するには次のようになります。
1 2 3 4 5 |
int i = 10000; //32ビットで整数を表現 long l = 1000000; //64ビットで整数を表現 l = (long)i; i = (int)l; |
基本的に型変換は関数が用意されているので、これを使えば変換できます。キャストはそんな手続きなしで変換できるので便利です。さらにプログラミング言語によっては明示的にキャストしなくとも自動で判断してくれる場合もあります。しかし、さすがに数値と文字列の変換はキャストではできません。関連性の高い型同士(数値なら数値の型たち)ならできるのです。では、クラスではどうでしょうか?
クラスのキャスト
継承関係があるクラスではキャストが可能です。具体的には、サブクラスからスーパークラスは可能。スーパークラスからサブクラスは不可能。ただし、サブクラスからスーパークラスにキャストし、それをサブクラスにキャストする場合は可能です。
⇒ | Super | Sub |
---|---|---|
Sub | ○ | – |
Super | – | × |
Sub⇒Super | – | ○ |
スーパークラス、サブクラスに同じ変数、メソッド名が存在している場合は、優先されるルールがあります。サブクラスをスーパークラスにキャストした場合は、変数はスーパークラス、メソッドはサブクラスが優先されます。スーパークラス(サブクラスからキャストしたモノ)からサブクラスにキャストした場合は、サブクラスの変数、メソッドが優先されます。
ー | Super | Sub | ||
変数 | メソッド | 変数 | メソッド | |
Sub⇒Super | ○ | – | ○ | |
Sub⇒Super⇒Sub | ○ | ○ |
参考のソースコードと実行結果を掲載します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 |
package jp.ayax.object; public class Main { public static void main(String[] args) { System.out.println("---Super->Sub"); //Super -> Sub エラーになる //Parent p1 = new Parent(); //Children c1 = (Children)p1; System.out.println("---Sub->Super"); Children c1 = new Children(); Parent p2 = (Parent)c1; p2.process1(); p2.process2(); //p2.process3(); エラー System.out.println(p2.num1); //System.out.println(p2.num2); エラー System.out.println("---Sub->Super->Sub"); Children c2 = (Children)p2; c2.process1(); c2.process2(); c2.process3(); System.out.println(c2.num1); System.out.println(c2.num2); } } class Parent { int num1=1; public void process1(){ System.out.println("process1"); } public void process2(){ System.out.println("process2"); } } class Children extends Parent{ int num1 = 2; int num2 = 3; @Override public void process1() { System.out.println("Children:process1"); } public void process3() { System.out.println("Childrenprocess3"); } } |
1 2 3 4 5 6 7 8 9 10 11 |
---Super->Sub ---Sub->Super Children:process1 process2 1 ---Sub->Super->Sub Children:process1 process2 Childrenprocess3 2 3 |
クラスでキャストできるなんて、凄いですね!「で、なんの意味があるの?」、ごもっともです。クラスのキャストが活躍する場面については後述します。