oracleJavaSilverの勉強日記(メソッドとカプセル化の操作)
メソッドの定義
構文
アクセス修飾子 戻り値型 メソッド名(引数の型 引数名){メソッド内の処理}
戻り値型は、メソッドを実行した結果、どのような種類の結果データを戻すかを表したもの。戻り値型の宣言は必須。戻り値型を何も戻さない場合は、戻り値型をvoidにする
戻り値
メソッドが戻す戻り値を受け取るには、メソッドが定義する戻り値型と同じ型、もしくは互換性のある型の変数を宣言して、結果を代入しなければいけない。
引数
メソッドに宣言された引数は処理を実行するために必要なデータを意味する。そんため、宣言された引数はそのメソッドを呼び出す際に「渡されなければいけないデータ」と考える。
可変長引数
引数の数を自由に変更できる引数の事。引数の型の直後にピリオド3つ「...」を付けて宣言する。
例
void sample(int... num){}
渡された複数の値は、JVMによって配列に置き換えられる。そのため、可変長引数の値を使う時には、配列と同じように大かっこ「[]」を使う。
可変長引数を使う時の、注意点
・同じ型の数が可変な引数をまとめられるだけで、異なる型はまとめられない。
・可変長引数以外の引数を受け取る必要がる場合、可変長引数は最後の引数にすること
return文
値の呼び出し元のメソッドに戻す以外にも、呼び出し元に制御を戻すという意味もある
return文の後ろの処理は実行できない。もし、return文を実行したあとに何らかの処理をするようなコードを記述するとコンパイルエラーになる。
staticなフィールド
ロード後、staticで修飾されたフィールドやメソッドは、「static領域」と呼ばれる領域に配置される。それ以外の部分は、「ヒープ領域」と呼ばれる領域に配置される。
インスタンスが生成されるときには、ヒープ領域にあるクラス定義に従ってインスタンスが生成される。この仕組みがあるため、staticフィールドはインスタンスを作らなくても使えるという性質を持つ。
staticなフィールドにアクセスするには「クラス名.フィールド名」
インスタンスの生成後であれば「変数名.フィールド名」
staticなメンバのルール
staticなメンバとはstaticで修飾されたフィールドやメソッドのこと。
・staticなメソッドから、staticではないメンバにはアクセスができない。
・staticではないメソッドから、staticなメンバにアクセスすることは可能。
オーバーロード
メソッドの多重定義とも呼ばれ、同名のメソッドを複数宣言できる機能の事。ただし、名前が同じでも引数が異なることという条件が付く。
引数が異なるとは、引数の数や型、順番が異なることで、これらが異なれば同名のメソッドを複数定義できる。
メソッド名と引数のセットのことを「シグニチャ」と呼ぶ
※アクセス修飾子・引数名・戻り値の型・変数名を変えてもオーバーロードにならない
コンストラクタ
生成されたインスタンスが他のインスタンスから使われる前に、初期化するためメソッドの一種。自由に定義ができ、普通のメソッドと同じくオーバーロードすることができる。
コンストラクタには3つのルールがある。
・メソッド名をクラス名と同じにすること。
・戻り値型は記述できない
・newと一緒にしか使えない(インスタンス生成時以外は呼び出しができない)
・アクセス修飾子はすべて使える
コンストラクタが存在しない場合は、デフォルトコンストラクタが自動で追加される。
ただし、明示的にコンストラクタを生成したら、デフォルトコンストラクタは追加されない。
※引数ありのコンストラクタを生成した時、引数なしのデフォルトコンストラクタは生成されない。
初期化ブロック
クラスに直接書かれている初期化ブロック「{}」はコンストラクタより先に実行される。
this()
別のコンストラクタを呼び出すときに使う。
this()は、最初に記述しなければいけない。this()より先に何らかの処理を記述したら、コンパイラエラー
super()
カプセル化
何のためのクラスなのかとういクラスの目的を明確化するためのもの。
カプセル化はフィールドをprivateにし、アクセスするためのメソッドをpublicにすることでできる。
※すべてのメソッドを公開しなければいけないわけではなく、必要なものだけ公開すればよいため、公開メソッドと非公開メソッドの両方が混在するのは問題ない。
メソッドの引数
プリミティブ型
プリミティブ型の値をメソッドに渡すとき、その値はコピーされて渡される。そのため、呼び出したメソッド内で値が変更さえても、呼び出し元の値は変わらない。
オブジェクト型
オブジェクト型の引数では、呼び出し元から呼び出し先のメソッドに参照値がコピーされて渡される。そのため、二つのメソッドから参照するインスタンスは同じになる。インスタンスをの値を変えたら変更になる。
※呼び出し元と呼び出し先のメソッドが持っている参照は異なるもの。しかし、それぞれの参照が示す参照先にあるインスタンスは同じもの。