
皆さんこんにちは新米です。
今回は可変長引数の使い方について解説していきます。
サンプルコードも用意しましたので実際にプログラムを書いて覚えるのが有効です。

可変長引数?名前から難しそう汗

いやいや、そんなことないよ!可変長引数は覚えると便利だからこの機会に習得しよう!

わかりました!がんばりますっっ!
可変長引数とは?
この記事を見ている方は、今まで定義してきたメソッドは引数の数が定義時から決まっていたんではないでしょうか?
しかし、可変長引数を使用することで引数の型が同じであれば、数を可変に扱えることができます。

メソッドの引数の数が決まってないってこと?

その通り!
引数の型が同じであれば引数の数を任意の数に設定できます。

Javaって便利だね!
可変長引数の値は配列としてメソッドに渡されます。
👇配列が不安な方はこちら

可変長引数の宣言ルール
可変長引数を定義する時はいくつかルールがあります。
◇可変長引数のルール
・データ型の後に「…」と記述する。
例)public void method(String...str){}
・可変長引数は1つしか使用できません。
例)void method(String...str,int...num){}//コンパイルエラー
・可変長引数とデータ型の異なる引数を併用できる。
ただし!可変長引数は最後に置くこと。
例)void method(String str,int...num){}//OK void method(int...num,String str){}//コンパイルエラー

引数を複数記述する時は、必ず可変長引数は最後に記述するんだね!
・引数を明確に定義したメソッドと可変長引数を使用したメソッドの優先順位
例)void method(String...str){} void method(String str){}//明確に定義した方が呼び出される。

オーバーライド時は引数を明示的に定義した
メソッドが呼び出されるってことか~。
実際にコードを書いてみよう
実際にコードを書いて可変長引数に慣れましょう。
[サンプルコード]class Sample{ public void method(String str,int... num){ System.out.println(" "); System.out.println(str + "の要素数は" + num.length); for(int i : num){ System.out.println(" 第2引数の値は" + i); } } } public class Main { public static void main(String[] args) { Sample obj = new Sample(); int[] ary = {10,20,30}; obj.method("1回目"); obj.method("2回目",10); obj.method("3回目",10,20); obj.method("4回目",ary); //obj.method("5回目",null); } }
実行結果
1回目の要素数は0
2回目の要素数は1
第2引数の値は10
3回目の要素数は2
第2引数の値は10
第2引数の値は20
4回目の要素数は3
第2引数の値は10
第2引数の値は20
第2引数の値は30
解説
2行目のmethod()メソッドの第二引数で、int型の可変長引数を定義しています。
14行目から17行目でSampleクラスのmethod()メソッドをそれぞれ呼び出しています。
1回目は第二引数を指定していませんが、空の配列が渡されるため問題ありません。
2回目、3回目の呼び出しでは第二引数で複数の値を指定していますが、可変長引数であるため問題なくコンパイルが成功します。
また4回目のように配列ごと渡すことも可能です。
18行目のコメントを外すと実行時エラーが発生します。
引数にnullを指定してもコンパイルは成功しますが、4行目にlengthをnullで呼び出しているため実行時エラーになります。

NullPointerExceptionと表示されました

nullの長さを配列であるかのように取得しようとしたからNullPointerExceptionエラーが表示されたんだよ!

なるほど!配列そのものがnullだとダメなんだね
まとめ
いかがだったでしょうか。
今回は可変長引数について解説しました。
可変長引数って名前は難しそうでも仕組みは単純です。
しかし書かないと覚えませんので、何回も書いてアウトプットしていきましょう。
コメント