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
}

例:

コード 説明
public static void print(String str)
{
}
メソッドprintはパラメータを使用して宣言されます。
String str
public static void print(String str, int count)
{
}
このprintメソッドは 2 つのパラメーターを使用して宣言されます。
String str
int count
public static void write(int x, int y)
{
}
このwriteメソッドは 2 つのパラメーターを使用して宣言されます。
int x
int y

メソッドにパラメータを持たせたくない場合は、括弧を空のままにします。

パラメータはメソッド内の特別な変数です。これらの助けを借りて、メソッドが呼び出されたときにさまざまな値をメソッドに渡すことができます。

たとえば、テキスト文字列を指定された回数だけ表示するメソッドを作成してみましょう。

画面上に文字列を何度か表示するコードの書き方はすでにご存知でしょう。しかし、どの文字列を出力すればよいでしょうか? そして何回ですか?そのためにパラメータが必要なのです。

これを行うコードは次のようになります。

コード 説明
class Solution
{
   public static void printLines(String text, int count)
   {
     for (int i = 0; i < count; i++)
       System.out.println(text);
   }

   public static void main(String[] args)
   {
     printLines("Hi", 10);
     printLines("Bye", 20);
   }
}


printLines次のパラメータを使用してメソッドを宣言しました。
String textint count
メソッドは文字列のtext count時間を表示します。さまざまなパラメータを





使用してメソッドを呼び出します。printLines

メソッドが呼び出されるたびに、そのパラメータには渡された値が割り当てられ、その後初めてメソッド内でコマンドの実行が開始されます。


2. 引数

パラメーターを使用したメソッドの呼び出しにもう少し注目していただきたいと思います。

メソッドに渡される値は、通常、メソッドに渡されるときに引数と呼ばれます。

別の例を見てみましょう。

コード 説明
class Solution
{
   public static void printLines(String text, int count)
   {
     for (int i = 0; i < count; i++)
       System.out.println(text);
   }

   public static void main(String[] args)
   {
     printLines("Hi", 10);
     printLines("Bye", 20);
   }
}


printLines次のパラメータを使用してメソッドを宣言しました。
String textint 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. メソッド呼び出し時の変数名が競合する

変数はメソッドの引数として使用できます。これはシンプルでわかりやすいですが、潜在的にいくつかの問題が発生する可能性があります。同じ例に戻りましょう。ただし、今回は引数を別の変数に移動します。

コード 説明
class Solution
{
   public static void printLines(String text, int count)
   {
     for (int i = 0; i < count; i++)
       System.out.print(text);
   }

   public static void main(String[] args)
   {
     String str = "Hi";
     int n = 10;
     printLines(str, n);
   }
}


printLines次のパラメータを使用してメソッドを宣言しました。
String textint count
メソッドは文字列のtext count回数を表示します。 次の引数を







使用してメソッドを呼び出します。printLines
text = str;
count = n;

ここまでは順調です。str変数が得られました。textその値は、メソッドの呼び出し時にパラメータに割り当てられます。変数がありますncountその値は、メソッドが呼び出されたときにパラメータに割り当てられます。」 これまでのところ、すべてが明らかです。

次に、メソッド内の変数の名前を変更しましょうmain

コード 説明
class Solution
{
   public static void printLines(String text, int count)
   {
     for (int i = 0; i < count; i++)
       System.out.print(text);
   }

   public static void main(String[] args)
   {
     String text = "Hi";
     int count = 10;
     printLines(text, count);
   }
}


printLines次のパラメータを使用してメソッドを宣言しました。
String textint count
メソッドは文字列のtext count回数を表示します。 次の引数を







使用してメソッドを呼び出します。printLines
text = text;
count = count;

2つのことに注意してください

まず、異なるメソッドに同じ名前の変数があります。これらは異なる変数です (意図的に異なる色を使用して表しています)。すべては前の例と同じように機能します。メソッド内の変数のmain名前はstrとでしたn

2 番目: メソッドが呼び出されたときに魔法のようなことは何も起こりません。パラメータには引数値が割り当てられるだけです。数値、文字列、変数、式のいずれであっても。

main メソッドの変数の名前を変更しても、何も変わりません。これらは以前は異なるメソッドの異なる変数であったため、そのまま残ります。text と変数の間には魔法のような関係はありませんtext 。



4. メソッドへの参照の受け渡し

前のレッスンですべてを理解していただけたと思います。ここでは引数をメソッドに渡す方法を再検討しますが、さらに深く掘り下げるだけです。

すでにご存知のとおり、一部の Java 変数は値そのものではなく、参照、つまり値が配置されているメモリ ブロックのアドレスを格納します。これが文字列変数と配列変数の仕組みです。

別の配列変数を配列変数に代入するとどうなるでしょうか? それは正しい。2 つの変数はメモリ内の同じ領域を参照し始めます。

メソッドへの参照の受け渡し

これらの変数の 1 つがメソッド パラメーターである場合はどうなるでしょうか?

コード 説明
class Solution
{
   public static void printArraySum(int[] data)
   {
     int sum = 0;
     for (int i = 0; i < data.length; i++)
       sum = sum + data[i];
     System.out.println(sum);
   }
   
   public static void main(String[] args)
   {
     int[] months = {31, 28, 31, 30, 31, 30, 31, 31, 30};
     printArraySum(months);
   }
}


このprintArraySumメソッドは、渡された配列内の数値の合計を計算し、画面に表示します。

まったく同じことが起こります。data パラメータには、変数と同じメモリ領域への参照が含まれますmonths。メソッドが呼び出されると、単純な割り当てが行われます。data = months

そして、両方の変数が整数を格納するメモリの同じ領域を参照するため、メソッドはprintArraySum 配列から値を読み取るだけでなく、値を変更することもできます。

たとえば、2 次元配列に同じ値を埋める独自のメソッドを作成できます。次のようになります。

コード 説明
class Solution
{
   public static void fill(int[][] data, int value)
   {
     for (int i = 0; i < data.length; i++)
     {
       for (int j = 0; j < data[i].length; j++)
         data[i][j] = value;
     }
  }

   public static void main(String[] args)
   {
     int[][] months = {{31, 28}, {31, 30, 31}, {30, 31, 31}};
     fill (months, 8);
   }
}


このfill メソッドは、渡された 2 次元配列内のすべてのセルを反復処理し、valueそれらに割り当てます。








二次元配列を作成します。
配列全体に数値を入力します8


5. 同名のメソッド

ここでもう一度メソッド名の話に戻りましょう。

Java 標準では、同じクラス内のすべてのメソッドが一意の名前を持つことが要求されます。つまり、同じクラス内で 2 つの同じ名前のメソッドを宣言することは不可能です。

メソッドが同一であるかどうかを比較する場合、名前だけでなくパラメータの型も考慮されますパラメータの名前は考慮されないことに注意してください。例:

コード 説明
void fill(int[] data, int value) {
}
void fill(int[][] data, int value) {
}
void fill(int[][][] data, int value)  {
}
これら 3 つの方法は異なる方法です。これらは同じクラス内で宣言できます。
void print(String str) {
}
void print(String str, String str2) {
}
void print(int val) {
}
void print(double val) {
}
void print() {
}
これら 5 つの方法はそれぞれ異なるものとみなされます。これらは同じクラス内で宣言できます。
void sum(int x, int y) {
}
void sum(int data, int value) {
}
これら 2 つのメソッドは同じとみなされます。つまり、同じクラスで宣言することはできません。

一部のメソッドは同じとみなされ、他のメソッドは異なるのはなぜですか? また、メソッドの一意性を判断する際にパラメータ名が考慮されないのはなぜでしょうか?

そもそもなぜ独自性が必要なのでしょうか?問題は、コンパイラがプログラムをコンパイルするときに、特定の場所でどのメソッドを呼び出すつもりであるかを正確に認識している必要があるということです。

たとえば、 と記述すると、コンパイラは賢く、パラメータを使用してここでメソッドを呼び出すつもりであると簡単に判断します。System.out.println("Hi")println()String

ただし、 と記述すると、コンパイラはパラメータを使用したメソッドの呼び出しを認識します。System.out.println(1.0)println()double

メソッドが呼び出されるとき、コンパイラは引数の型がパラメータの型と一致することを確認します。引数の名前にはまったく注意しません。Java では、パラメータ名はコンパイラが呼び出すメソッドを決定するのに役立ちません。そして、それが、メソッドの一意性を決定する際にそれらが考慮されない理由です。

メソッドの名前とそのパラメータの型は、メソッド シグネチャと呼ばれます。例えば、sum(int, int)

各クラスには、一意の名前を持つメソッドではなく、一意のシグネチャを持つメソッドが必要です。