見出し画像

JavaSilverに向けて⑧ メソッド

・メソッドの戻り値の特殊な特性


  ー voidメソッドを宣言した場合、戻り値を受け取る事はできない。受け取ろうとした場合、コンパイルエラーとなる。
  ー 戻り値を受け取る宣言をしたとしても、その戻り値を受け取る必要はない。戻り値を受け取り、変数に代入しなければ、その戻り値は破棄される。
  ー 戻り値を受け取るためには、メソッドの戻り値型と同じ型、若しくは互換性の型の変数に代入しなければならない。

・可変長引数


引数の型の直後に「…」をつけると、そのメソッドを呼び出す側はその型の引数をいくつでも書けるようになる。
可変長引数は、各メソッドにつき1つだけ、そのメソッドの最後の引数に対してのみ指定可能。
このような可変長引数を持つメソッドで渡された複数の値は、JVMによって配列に置き換えられる。そのため、可変長引数の値を使うときは、[]を使う。
可変長引数は、引数なしでも呼び出す事ができる。
*定義例
void method(String… args) {
}
void method(String str, int… num) {
}
*呼び出し例
method(“abc”,”def”);
method(“abc”,”def”,”ghi”);
method();

・可変長引数でのオーバーロード


1, void method(String str1) {
}
2, void method(String str1, str2){
}
3, void method(String… str){
}

method(“abc”)は1にも3にも合致する。また、method(“abc”, “def”)は2にも3にも合致する。
しかし、このような場合は可変長引数ではないメソッドが呼び出される。

・return文


*呼び出し元のメソッドに値を戻す
*呼び出し元に制御を戻す
→そのメソッドの処理を強制終了し、呼び出し元のメソッドに戻る
return文は上記の特性を持っている。そのため、returnだけを記述する事も可能。
return文が現れた時点で強制的に制御が戻され、return文以降のメソッド内の処理は続行されない。

・return文と到達不能コード
void sample(String str){
    return;
    System.out.println(str);
}
上記の場合、System.out.println()に到達する前に呼び出し元のメソッドに制御が戻される。
このように実行されないコードがある場合は、コンパイラは「到達不能なコードがある」としてコンパイルエラーとなる。

・メソッドのオーバーロード


同名のメソッドを複数宣言できる機能。引数の数や型が違うという特徴がある。
以下のように同じメソッドで、引数や型に違いがない場合は、コンパイルエラーとなる。
public class Sample {
    void hello(){}
    void hello(){}
}
また、アクセス修飾子だけが違う場合もオーバーロードとしてはみなされない。

・コンストラクタ 


クラスからオブジェクト(インスタンス)を作成した際に、自動的に実行されるメソッドのこと。
インスタンス作成時に自動的に呼び出される性質からクラスのメンバを初期化する時に使われる。
その他の特徴として以下の3つの特徴がある。
  ー メソッド名をクラス名と同じにする必要がある。
  ー 戻り値型は記述できない。
そのため、メソッドと同様、アクセス修飾子自体は自由に定義できる。
オーバーロードされたコンストラクタで、「this」を使えば、別のコンストラクタが呼び出される。もしくは、インスタンスそのものを表す参照を入れる特別な変数として使っている場合がある。
「this」を使い、別のコンストラクタを呼び出す際には、処理の最初に記述しなければならないというルールがある。
コンストラクタ内で「super」を使った際は、スーパークラスのコンストラクタが呼び出される。
  ー newと一緒にしか使えない

・デフォルトコンストラクタ 


コンストラクタを省略した場合、コンパイル時に引数なしのコンストラクタを追加する。この自動的に追加されるコンストラクタを「デフォルトコンストラクタ」という。
デフォルトコンストラクタは、1つもコンストラクタが存在していない場合のみ追加される。
そのため、1つでもコンストラクタが存在していれば、デフォルトコンストラクタは作られない。

・初期化子


クラス内に何も修飾せず、クラスブロック直下に「 { //処理内容 } 」と記述する事で、コンストラクタが呼び出される前にメソッドとして呼び出される。
初期化子を使えば、オーバーロードされたすべてのコンストラクタ共通の前処理を宣言できる。
大体の場合、コンストラクタで初期化を行えばいいので、初期化子を実務で使うという場面はほぼない。

・修飾子


  ー アクセス修飾子の種類
public: 全てのクラスからアクセス可能
protected: 同じパッケージに属するか継承しているサブクラスからアクセス可能。
なし: 同じパッケージ内の全てのクラスからアクセス可能。
private: クラス内部からのみアクセス可能。


この記事が気に入ったらサポートをしてみませんか?