見出し画像

【Javaお勉強日記】メソッドとコンストラクタのオーバーロード

メソッドと
コンストラクタの
オーバーロード
って5・7・5っぽいですね(5・7・7だけど)

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

一つのクラスの中に、同じ名前のメソッドをいっぱい作っても問題ない。

ただし、引数の構成(型・数・並び方)が違わないといけない

例えば、「本棚」オブジェクトに「本を足す」メソッドを作る場合、

・本のタイトル、著者名、シリーズ名、巻数を全部入力する場合
・本のタイトル、著者名だけを入力する場合
・本のタイトルだけ入力する場合

があるとする。

それぞれ「add_all」と「add_one」と「add_only_title」とか名前を分けてもいいけど、「あれ、本の追加用ってどんなメソッドがあったっけ??」ってなっちゃう。

なので

public void add_book(String title, String author, String series, int number){...}
public void add_book(String title, String author){...}
public void add_book(String title){...}

と、同じ名前で引数の構成の違う3つのメソッドを用意すると、同じ仕事をさせたいときは同じメソッドが使えるので便利。(もちろん中で不足した引数を足して同じ処理をする)

※引数の名前が違っても、型と数が同じだとエラーになる。上記のメソッドが存在するクラスに

public void add_book(String author, String title){...}

を追加するとエラーになる(どっち呼んでるかわからなくなるから)

コンストラクタもオーバーロード出来る

引数のパターンにバリエーションを用意しておくことで、例えば「本」オブジェクトを作る時、シリーズものにだけ「シリーズ名」と「巻数」を持たせたい、とか、「ページ数」は解らなくても登録出来るようにする、とかが出来る。

で、コンストラクタをオーバーロードしたときには、結局同じ処理をするので、「自分自身のコンストラクタを呼んで、オーバーロードしてる側のコンストラクタが受け取った引数に、不足分は規定値を入れて、元のコンストラクタを呼ぶ」って処理をするとよき。その時は、

//Bookクラス

public Book(String title, String author, String series, int number){
    // ここがフルスペックのコンストラクタ(省略)
}

public Book(String title, String author){
    // 引数を減らしたコンストラクタ
    this(title,author,"なし",0)
}

と、this()を使って記述を簡略化できる。(this()で、「このオブジェクトのコンストラクタ」という意味になる。this()を使えるのはコンストラクタ内のみ)

引数なしコンストラクタはコンパイル時に自動生成されるけど、そういう暗黙の処理させちゃうと保守性が下がるのできっちり自分で書いておくこと。

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