Java初心者がメソッドの基礎的な部分と、
カプセル化の特徴をあげてみました。
メソッド
構文
アクセス修飾子 戻り値型 メソッド名(引数の型 引数名){
//メソッド内の処理
}
戻り値についてメモ
-
メソッド宣言で戻り値宣言は必ずする。戻り値をなにも戻さない場合には、戻り値型に void を指定する
-
戻り値型がvoidであるメソッドは、値を戻せない
-
戻り値型と、実際に戻す値の方は同じでなければいけない
-
戻り値型がvoidであるメソッドに対して、
戻り値を受け取る変数を宣言して、受け取ることはできない。
(コンパイルエラー) -
何らかの戻り値を戻すメソッドを宣言しても、その戻り値を受け取る必要はない。戻り値を戻して、変数に代入しなければ破棄される。
-
メソッドの戻り値の型と、戻り値を受け取るための変数の型は、同じか互換性のある型ではないといけない。
-
呼び出し元のメソッドの引数は、メソッドで宣言されている種類、
数を一致させなければいけない。不一致の場合はコンパイルエラー -
なにも受け取らないメソッドの宣言はカッコの中になにも記入しない
-
可変長引数を含む複数の引数を受け取るメソッドのとき、可変長引数は最後の引数としてのみ利用可能。
-
可変長引数は、「...」は、型の後ろにつけること(コンパイルエラになるよ)
-
return文の後ろの処理は実行できないよ(処理を書くとコンパイルエラー)
static領域について
-
クラスファイルをロード後、staticなものと、そうでないもので分離される。それぞれ異なるメモリ空間に配置される。
staticで修飾されたメソッド、フィールドはstatic領域に配置され、
それ以外はヒープ領域に配置される。
インスタンス生成のときは、ヒープ領域にあるクラス定義にしたがって、インスタンスが生成される。 -
↑ staticなフィールドはインスタンスを作らなくても使えるという性質を持っとる。
-
staticなフィールドにアクセスする際は以下
クラス名.フィールド名
インスタンス生成後であれば、
変数名.フィールド名
- static なメソッドはstaticで修飾されたものしかアクセスできない。
オーバーロード
- 引数の数、型、順番が異なる同名のメソッドを定義すること(シグニチャが異なる)
- 戻り値型が異なるだけでは、オーバーロードとみなされない。同じメソッドが重複して存在するとして、コンパイルエラーとなる
- アクセス修飾子は含まれないので、アクセス修飾子が異なるだけではオーバーロードではない。
コンストラクタ
- 生成されたインスタンスが他のインスタンスから使われる前に、事前準備を整える「前処理」をするためのメソッドの一種。
普通のメソッドと同じようにオーバーロードして複数定義も可能
3つのルール
- メソッド名をクラス名と同じにすること
- 戻り値型は記述できない。
- new と一緒にしか使えない(インスタンス生成時しか呼び出せない)
-
コンストラクタ定義の際、アクセス修飾子に制限はなく、
public,protected,デフォルト,private 4つすべて利用可能。 -
戻り値を定義できない。定義するとメソッドと認識される。ただ、クラス名と同名だとしてもコンパイルエラーにはならない。
-
コンストラクタもメソッドの一種で、オーバーロードで複数定義も可能、このときすべてのコンストラクタで、一部だけ共通の処理をしたいしたいときは初期化ブロックが便利。初期化ブロックはコンストラクタよりも先に実行される
記述例
public class Sample {
{
//初期化ブロックで行う共通の前処理
}
}
- コンストラクタ定義を省略した場合、引数なしのコンストラクタをコンパイラがコンパイル時に追加する。自動的に追加されるものをデフォルトコンストラクタと呼ぶ。
- コンストラクタないから、オーバーロードされた他のコンストラクタを呼び出すには、thisを使う。呼び出す前に何らかの処理を記述してはいけない。
カプセル化の話
- カプセル化はフィールドを非公開(private)にして、アクセスするためのメソッドを提供(public)にすることで完成する
- プリミティブ型の値をメソッドに渡す時、その値は値はコピーされた渡される。呼び出したメソッドないで値が更新されても、呼び出し元は変わらない。
- オブジェクト型の引数では、呼び出し元から呼び出し先へ 参照値が コピーされて渡る。そのため2つのメソッドから参照するインスタンスは同じ。