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();
    }
}