続き。今回は 9章。
正確ではないと思うので参考にしないでください
クラス型
コンピュータ内部で何が行われているか。メモリとかアドレスとかのお話
クラス型と配列型は「参照型」と呼ばれる。
変数のメモリにはそのものが入っているのではなく、それが入っている番地の情報だけ入っている。
クラス型はフィールドやメソッドの引数や戻り値にも使うことができる。
String
実はString型もクラス型。でも私は定義していないのになぜ使えるのか。
それはjavaのAPIとして標準で準備してくれているクラスだから。
ここら辺の標準でついているAPIがc#とかjavaでは違うのかな
またnewでインスタンスを作らなくていいのはstringの特例。
String s ="Hello";
これでインスタンスを利用できる。
newでもできる。
String s = new String("");
System.out.println(s);
よく使うものが特例としてしれっと存在していると、わかりにくいなーと思った。
コンストラクタ
newしたときに、メソッド内部で定義しておいた定義が自動で行われる。
決まっている初期値を入れるなどに使う
Hero h = new Hero();
public class Hero{
Hero(){
this.hp = 100;
}
}
赤いのがコンストラクタ
クラス名と同じ名前で、戻り値が記述されていないものがコンストラクタ。
戻り値は設定できないけど、引数は設定できる。
Hero h = new Hero("ビビンバ");
public class Hero{
Hero(String name){
this.hp = 100;
this.name=name;
}
}
仮引数が違ったら、同じ名前のメソッドを作れることを「オーバーロード」という。
クラスに、コンストラクタが一つもなかったら、引数なし処理内容なしのコンストラクタが自動で追加される。
この本コンストラクタのことすごい詳しくやっているけど、Unityc#でも使うのかな?
staticフィールド
同じクラスから生成されたインスタンスで、フィールドを共有したいときは
static int money;
とする。
静的フィールドと呼ぶ
普通フィールドはそれぞれのインスタンスに生成されるけど、静的フィールドはクラスに対して一つだけ用意される。
呼び出すときはクラス名.フィールド名 (Hero.money)
クラスに作られたフィールドの分身をインスタンスに作ることもできる。
h1.money h2.money
h1.moneyに値を入力するとHero.moneyに入る
staticメソッド
static void setRandomMoney(){
}
・staticを付けたメソッドはインスタンスではなくクラスに属す
・インスタンスにメソッドの分身が準備される
・インスタンスを1つも生み出すことなく呼び出せる
mainメソッドがstaticなのはインスタンスが存在していない状態でmainは呼び出されるから
staticメソッド内のコードでは、staticがついていないフィールドやメソッドは利用できない。
最後に
前回より難しくなってきた。Unityであんまり意識しない部分だからかな
staticはよく見るけど。
シーン間で変数を参照するときは、おまじない的に元のスクリプトで
public static int a=1;みたいにしていた。
このゲームで使っていますね
staticで格納した値はインスタンス(オブジェクト)単位ではなくゲーム全体で保持されるため、シーンが変わりオブジェクトが破棄された後でも保持され続けます。
UnityとJavaだとクラスという単位が違う気がしますが、staticの雰囲気はわかりました。
ちゃんと第1部(javaの文法)も読まないと、理解が不十分なところがあるなと思った。メソッドについてとか
でも第2部を読んだから気づけたことでもある
無知の知を知れた?ので少しは成長している気がする。