1. 引数を渡す
そして楽しいことが始まります。おそらく、このようなメソッドからメソッドに引数を渡すことができることはすでにご存知でしょうSystem.out.println()
。メソッド内に入ると、それらをパラメータと呼びます。実際、パラメーターはメソッドの作成と使用から得られる利点を大幅に高めます。
パラメーターを使用してメソッドを宣言するにはどうすればよいでしょうか? 実際には非常に簡単です:
public static void name(parameters)
{
method body
}
ここでname
、 はメソッドの一意の名前で、method body
メソッドを構成するコマンドを表します。And はparameters
、カンマで区切られたメソッド パラメーターのプレースホルダーです。このテンプレートについてさらに詳しく説明します。
public static void name(Type1 name1, Type2 name2, Type3 name3)
{
method body
}
例:
コード | 説明 |
---|---|
|
メソッドprint はパラメータを使用して宣言されます。String str |
|
このprint メソッドは 2 つのパラメーターを使用して宣言されます。String str int count |
|
このwrite メソッドは 2 つのパラメーターを使用して宣言されます。int x int y |
メソッドにパラメータを持たせたくない場合は、括弧を空のままにします。
パラメータはメソッド内の特別な変数です。これらの助けを借りて、メソッドが呼び出されたときにさまざまな値をメソッドに渡すことができます。
たとえば、テキスト文字列を指定された回数だけ表示するメソッドを作成してみましょう。
画面上に文字列を何度か表示するコードの書き方はすでにご存知でしょう。しかし、どの文字列を出力すればよいでしょうか? そして何回ですか?そのためにパラメータが必要なのです。
これを行うコードは次のようになります。
コード | 説明 |
---|---|
|
printLines 次のパラメータを使用してメソッドを宣言しました。 String text 、int count メソッドは文字列の text count 時間を表示します。さまざまなパラメータを 使用してメソッドを呼び出します。 printLines |
メソッドが呼び出されるたびに、そのパラメータには渡された値が割り当てられ、その後初めてメソッド内でコマンドの実行が開始されます。
2. 引数
パラメーターを使用したメソッドの呼び出しにもう少し注目していただきたいと思います。
メソッドに渡される値は、通常、メソッドに渡されるときに引数と呼ばれます。
別の例を見てみましょう。
コード | 説明 |
---|---|
|
printLines 次のパラメータを使用してメソッドを宣言しました。 String text 、int count メソッドは文字列の text count 回数を表示します。 次の引数を使用してメソッドを呼び出します。 printLines text = "Hi"; count = 10; text = "Bye"; count = 20; |
このprintLines
メソッドが初めて呼び出されたとき、そのパラメーターには次の値が割り当てられましたString text = "Hi", int count = 10
。
printLines
メソッドが 2 回目に呼び出されたとき、そのパラメータには別の値が割り当てられましたString text = "Bye", int count = 20
。
パラメーターは、メソッドの呼び出し時に特定の値が割り当てられる変数以上でもそれ以下でもありません。値"Hi"
、"Bye"
、10
、および20
それ自体を引数と呼びます。」
3. メソッド呼び出し時の変数名が競合する
変数はメソッドの引数として使用できます。これはシンプルでわかりやすいですが、潜在的にいくつかの問題が発生する可能性があります。同じ例に戻りましょう。ただし、今回は引数を別の変数に移動します。
コード | 説明 |
---|---|
|
printLines 次のパラメータを使用してメソッドを宣言しました。 String text 、int count メソッドは文字列の text count 回数を表示します。 次の引数を使用してメソッドを呼び出します。 printLines text = str; count = n; |
ここまでは順調です。str
変数が得られました。text
その値は、メソッドの呼び出し時にパラメータに割り当てられます。変数がありますn
。count
その値は、メソッドが呼び出されたときにパラメータに割り当てられます。」 これまでのところ、すべてが明らかです。
次に、メソッド内の変数の名前を変更しましょうmain
。
コード | 説明 |
---|---|
|
printLines 次のパラメータを使用してメソッドを宣言しました。 String text 、int count メソッドは文字列の text count 回数を表示します。 次の引数を使用してメソッドを呼び出します。 printLines text = text; count = count; |
2つのことに注意してください
まず、異なるメソッドに同じ名前の変数があります。これらは異なる変数です (意図的に異なる色を使用して表しています)。すべては前の例と同じように機能します。メソッド内の変数のmain
名前はstr
とでしたn
。
2 番目: メソッドが呼び出されたときに魔法のようなことは何も起こりません。パラメータには引数値が割り当てられるだけです。数値、文字列、変数、式のいずれであっても。
main メソッドの変数の名前を変更しても、何も変わりません。これらは以前は異なるメソッドの異なる変数であったため、そのまま残ります。text
と変数の間には魔法のような関係はありませんtext
。
4. メソッドへの参照の受け渡し
前のレッスンですべてを理解していただけたと思います。ここでは引数をメソッドに渡す方法を再検討しますが、さらに深く掘り下げるだけです。
すでにご存知のとおり、一部の Java 変数は値そのものではなく、参照、つまり値が配置されているメモリ ブロックのアドレスを格納します。これが文字列変数と配列変数の仕組みです。
別の配列変数を配列変数に代入するとどうなるでしょうか? それは正しい。2 つの変数はメモリ内の同じ領域を参照し始めます。
これらの変数の 1 つがメソッド パラメーターである場合はどうなるでしょうか?
コード | 説明 |
---|---|
|
この printArraySum メソッドは、渡された配列内の数値の合計を計算し、画面に表示します。 |
まったく同じことが起こります。data
パラメータには、変数と同じメモリ領域への参照が含まれますmonths
。メソッドが呼び出されると、単純な割り当てが行われます。data = months
そして、両方の変数が整数を格納するメモリの同じ領域を参照するため、メソッドはprintArraySum
配列から値を読み取るだけでなく、値を変更することもできます。
たとえば、2 次元配列に同じ値を埋める独自のメソッドを作成できます。次のようになります。
コード | 説明 |
---|---|
|
この fill メソッドは、渡された 2 次元配列内のすべてのセルを反復処理し、value それらに割り当てます。二次元配列を作成します。 配列全体に数値を入力します 8 。 |
5. 同名のメソッド
ここでもう一度メソッド名の話に戻りましょう。
Java 標準では、同じクラス内のすべてのメソッドが一意の名前を持つことが要求されます。つまり、同じクラス内で 2 つの同じ名前のメソッドを宣言することは不可能です。
メソッドが同一であるかどうかを比較する場合、名前だけでなくパラメータの型も考慮されます。パラメータの名前は考慮されないことに注意してください。例:
コード | 説明 |
---|---|
|
これら 3 つの方法は異なる方法です。これらは同じクラス内で宣言できます。 |
|
これら 5 つの方法はそれぞれ異なるものとみなされます。これらは同じクラス内で宣言できます。 |
|
これら 2 つのメソッドは同じとみなされます。つまり、同じクラスで宣言することはできません。 |
一部のメソッドは同じとみなされ、他のメソッドは異なるのはなぜですか? また、メソッドの一意性を判断する際にパラメータ名が考慮されないのはなぜでしょうか?
そもそもなぜ独自性が必要なのでしょうか?問題は、コンパイラがプログラムをコンパイルするときに、特定の場所でどのメソッドを呼び出すつもりであるかを正確に認識している必要があるということです。
たとえば、 と記述すると、コンパイラは賢く、パラメータを使用してここでメソッドを呼び出すつもりであると簡単に判断します。System.out.println("Hi")
println()
String
ただし、 と記述すると、コンパイラはパラメータを使用したメソッドの呼び出しを認識します。System.out.println(1.0)
println()
double
メソッドが呼び出されるとき、コンパイラは引数の型がパラメータの型と一致することを確認します。引数の名前にはまったく注意しません。Java では、パラメータ名はコンパイラが呼び出すメソッドを決定するのに役立ちません。そして、それが、メソッドの一意性を決定する際にそれらが考慮されない理由です。
メソッドの名前とそのパラメータの型は、メソッド シグネチャと呼ばれます。例えば、sum(int, int)
各クラスには、一意の名前を持つメソッドではなく、一意のシグネチャを持つメソッドが必要です。
GO TO FULL VERSION