ホームページ > Java > &#&チュートリアル > 変数パラメータ型の解析 Java メソッドの例

変数パラメータ型の解析 Java メソッドの例

高洛峰
リリース: 2017-01-22 10:58:10
オリジナル
1380 人が閲覧しました

Java メソッドの変数パラメーターの型は非常に重要な概念であり、非常に幅広い用途があります。この記事では、これを例の形で分析します。詳細は次のとおりです:

一般に、多くの Java 初心者が次のコードを見ると、「dealArray メソッドの 3 つの小さな点は何ですか?」という質問をするでしょう。

public class TestVarArgus {
  public static void dealArray(int... intArray){
      
  }
    
  public static void main(String args[]){
      
  }
}
ログイン後にコピー


この記事で説明するのは、可変パラメータ型 (不定パラメータ型とも呼ばれます) です。英語の略語は varargus で、可変引数の型を意味します。このメソッドがパラメータを受け取るとき、その数値が可変であることは、その名前から簡単にわかります。さて、このメソッドを呼び出してみましょう。コードと出力を見てください:

public class TestVarArgus {
  public static void dealArray(int... intArray){
    for (int i : intArray)
      System.out.print(i +" ");
      
    System.out.println();
  }
    
  public static void main(String args[]){
    dealArray();
    dealArray(1);
    dealArray(1, 2, 3);
  }
}
ログイン後にコピー

Output:

1
1 2 3

main メソッドでの呼び出しを通じて、この変数パラメータはパラメータを持たないか (空のパラメータ)、または変数であることがわかります。長さ 。これを見た人はおそらく、この可変長パラメーターが実際には配列パラメーターに非常によく似ていることを理解するでしょう。実際、これは事実です。コンパイラは、この最後の仮パラメータを静かに配列パラメータに変換し、コンパイルされたクラス ファイルにマークを付けて、これが可変数の実パラメータを持つメソッドであることを示します。コードを見てください:

dealArray(); //dealArray(int[] intArray{});
dealArray(1); //dealArray(int[] intArray{1});
dealArray(1, 2, 3); //dealArray(int[] intArray{1, 2, 3});
ログイン後にコピー

ここで、この変数パラメーターが配列クラス パラメーターであるかどうかを確認できますか?コードを見てください:

public class TestVarArgus {
  public static void dealArray(int... intArray){
    for (int i : intArray)
      System.out.print(i +" ");
      
    System.out.println();
  }
    
  public static void dealArray(int[] intArray){//会有Duplicate method dealArray(int[]) in type TestVarArgus的错误
    for (int i : intArray)
      System.out.print(i +" ");
      
    System.out.println();
  }
    
  public static void main(String args[]){
    dealArray(); 
    dealArray(1);
    dealArray(1, 2, 3);
  }
}
ログイン後にコピー

上記のコードからわかるように、これら 2 つのメソッドは競合するため、オーバーロードできません。ここで、別の興味深い実験を行ってみましょう:

コード 1:

public class TestVarArgus {
  public static void dealArray(int... intArray){
    for (int i : intArray)
      System.out.print(i +" ");
      
    System.out.println();
  }
    
  public static void main(String args[]){
    int[] intArray = {1, 2, 3};
      
    dealArray(intArray); //通过编译,正常运行
  }
}
ログイン後にコピー


コード 2:

public class TestVarArgus {
  public static void dealArray(int[] intArray){
    for (int i : intArray)
      System.out.print(i +" ");
      
    System.out.println();
  }
    
  public static void main(String args[]){
    dealArray(1, 2, 3); //编译错误
  }
}
ログイン後にコピー


上記 2 つのコードからわかるように、変数パラメーターは配列クラスのパラメーターと互換性があります。 、配列クラスのパラメーターは変数パラメーターと互換性がありません。実際、2 番目のコードでは、コンパイラーは、何が変更可能で何が変更不可能であるかを認識していません。dealArray(int, int, int) クラスのメソッドを定義する必要があります。したがって、配列クラスのパラメータの dealArray メソッドと一致させることは当然不可能です。

Java メソッドは可変パラメータを受け取るので、次のコードを見てみましょう:

public class TestVarArgus {
  public static void dealArray(int count, int... intArray){
      
  }
    
  public static void dealArray(int... intArray, int count){//编译报错,可变参数类型应该作为参数列表的最后一项
      
  }
    
  public static void main(String args[]){
       
  }
}
ログイン後にコピー


このコードは、可変パラメータの型がパラメータ リストの最後の項目でなければならず、固定パラメータの前に配置できないことを示しています。長さパラメータ。おそらく「優先順位」という言葉を思い浮かべるでしょう。正確な説明はないので、ここでは「優先順位」という言葉を使って理解してください:

public class TestVarArgus {
  public static void dealArray(int... intArray){
    System.out.println("1");
  }
    
  public static void dealArray(int count, int count2){
    System.out.println("2");
  }
    
  public static void main(String args[]){
    dealArray(1, 2);
  }
}
ログイン後にコピー


このコードを投稿した人はおそらく、このコードが出力することを知っています。 1ではなく2です。ここで覚えておく必要があるのは、固定長メソッドが照合できる場合は、そのメソッドが最初に照合されるということです。可変パラメーターを持つオーバーロードされたメソッドが最後に選択されます。

最後に、main メソッドのパラメーターは配列型であることは誰もが知っているため、実際には不定のパラメーター型に変更できます。試してみて、コンパイル エラーがないか確認してください。

この記事で説明されている内容は、すべての人が Java プログラミングを学習する上で一定の参考価値があると信じています。

Java メソッドの変数パラメーター型の分析例に関するその他の関連記事については、PHP 中国語 Web サイトに注目してください。

関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート