Java キャスト
キャストはint型からlong型、int型からstringなど型を変換するときに使う
phpはキャスト成約がゆるいので注意する
//キャストとは→型変換 int a = 100; long b = (long)a; (String s = (String)a; →"100" //php) String str; str.valueof(a); →"100"
変換したいaにたいしてvalueofメソッドでintへ変換。
javaの場合はlong b = (long)a;みたいに同系列でなければ、クラスに用意されたメソッドをつかえば変換できる
以下の継承関係がある3クラスを作成。
//継承元animalクラスにはcry,jumpメソッドを作成してる public class Animal{ public void cry() { System.out.println("うおおおん"); } public void jump() { System.out.println("30cm飛んだ!"); } }
//AnimalクラスをextendsしたHumanクラスのcryメソッドはAnimalクラスにあり、 //継承先と振る舞いが違うので継承先でオーバーライドする public class Human extends Animal { //このメソッドをたどるとanimalクラスを継承しており、humanクラスには継承先として人間だけがもってる振る舞いがあるのでimaginationメソッドを実行します public void imagination() { System.out.println("想像を働かせた!"); } //このメソッドをたどるとAnimalクラスを継承してますAnimalクラスを見に行くとcryメソッドと同じメソッド //があるのでHumanのcryメソッドはAnimalクラスのcryメソッドをオーバーライドしてます @Override public void cry() { System.out.println("えーん"); } }
//animalクラスをextendsしたcatクラスのcry,jumpメソッドはanimalクラスにある //それぞれ継承先と振る舞いが違うので継承先でオーバーライドする public class Cat extends Animal { //このメソッドをたどるとAnimalクラスを継承しており、Animalクラスを見に行くとcryメソッドと同じメソッド //があるのでCatクラスのcryメソッドはanimalクラスのcryメソッドをオーバーライドしてます @Override public void cry() { System.out.println("にゃーん"); } //このメソッドをたどるとAnimalクラスを継承しており、Animalクラスを見に行くとjumpメソッドと同じメソッド //があるのでCatクラスのjumpメソッドはAnimalクラスのjumpメソッドをオーバーライドしてます @Override public void jump() { System.out.println("1m飛んだ!"); } }
クラス | メソッド | 説明 | 継承関係 |
---|---|---|---|
animal | cry | うおおん | 継承元 |
jump | 30cm飛ぶ | 継承元 | |
human | imagination | 想像した | imaginationはanimalクラスにないので作成 |
cry | えーん | animalクラスのcryメソッドをオーバーライド | |
Cat | jump | 1m飛ぶ | animalクラスのjumpメソッドをオーバーライド |
cry | にゃーん | animalクラスのcryメソッドをオーバーライド |
アップキャスト
継承関係があるものに対して適応される
継承関係がある2つのクラスが子クラスから親クラスにキャストすること
ex.)webの画面入力なんかで必要な情報をkeyとvalueにセットしていき、valueには色々な型を入れられてObject型にアップキャストして渡す
List<ItemForm> itemForm = itemService.searchAll();
model.addAttribute("itemlists", itemForm);
みたいなパターン
(key=String,value=Object)なのでitemlistsというkeyとitemFormリストOBJをいれることで一覧画面にlistデータが表示される
子クラスitemFormリストから親クラスであるObjectにアップキャストしてmodelにセットされる
valueがString型でもint型でもObjectをアップキャストする
model.addAttribute("message", "商品を登録しました。");
model.addAttribute("itemmax", "20");
ダウンキャスト
親クラスから子クラスにキャストする
すべてのクラスはObject型を継承してる、つまり他のクラスはobject型へダウンキャストできる
(すべてのクラスはObjectをextendしてるのであらゆるクラスはすべてオブジェクトである。すべてはオブジェクトの考え方のもとでなりたっている)
自分で作ったクラスも暗黙的にobjectを継承してるのでobjectクラスがもってるメソッドも使える
ex.)webの編集画面で編集された結果を戻す
List<ItemForm> itemData = itemService.searchAll();
model.addAttribute("itemlists", itemData);
1回keyで編集結果をとってきたObject型をダウンキャストしてitemData型でうけとる
つまり、Object を継承した子クラスであるitemDataにダウンキャストしてデータを受け取る
MAINクラス
いつもはAnimal animal = new Animal();
のようにnewしたクラスに対して同じものを入れていたが、アップキャストは(子クラスから親クラスにキャスト)なので
Animal animalHuman = new Human();
になる。Humanをnew(子クラス)してAnimalクラス(親クラス)のanimalHumanにいれる。
Animalクラスを継承したHumanクラスをnewして継承元のanimalクラスにアップキャストしてanimalHumanとして代入しanimalHumanOBJを生成する
public class Mainexe { //Mainクラスはanimal,cat,humanの3つのクラスがあり //そのうちanimalが継承元であり継承先としてcat,humanクラスを作成してます public static void main(String[] args) { //Animalクラスを継承したHumanクラスをnewして継承元のanimalクラスに //アップキャストしてanimalHumanとして代入しanimalHumanOBJを生成 Animal animalHuman = new Human(); //Animalクラスを継承したCatクラスをnewして継承元のanimalクラスに //アップキャストしてanimalCatとして代入しanimalCatOBJを生成 Animal animalCat = new Cat(); //humanをanimalにアップキャストしたanimalHumanはのcryメソッドを実行 //HumanクラスでAnimalクラスのcryメソッドをoverrideしてるのでhumanのcryが実行される animalHuman.cry(); animalHuman.jump(); //animalHumanOBJはAnimalクラスにアップキャストしており //HumanクラスではなくAnimalクラスとして振る舞っているので実行できない //animalHuman.imagination(); //animalHumanをHumanにダウンキャストすると使える Human human = (Human)animalHuman; human.imagination(); animalCat.cry(); animalCat.jump(); } }