JAvaベース(9)可変パラメータリストの紹介

2358 ワード

一、可変パラメータの概要
パラメータの個数が不確定な場合は、可変パラメータリストを使用できます.
1.構文:パラメータタイプ...(3点)
例:void printArray(Object...)
注:各メソッドには最大1つの可変パラメータしかありません.なぜなら、可変パラメータはメソッドの最後のパラメータでなければなりません.
2.可変パラメータのタイプ可変パラメータは任意のタイプに設定できます:参照タイプ、基本タイプ;もちろんタイプチェックも行います.
3.パラメータの個数:
  • 0個のパラメータ
  • 個のパラメータ:配列であれば、この配列を直接パラメータとしてメソッドに転送し、新しい配列を埋め込まない.
  • 複数のパラメータ:パラメータは配列であってもよいし、単一の変数、定数であってもよい.しかし、このとき、これらのパラメータを新しい配列に埋め込み、この配列をメソッドに転送します.

  • 4.可変パラメータの使用
      可変パラメータは完全に1つの配列として使用することができ、あるいは本質的に可変パラメータは1つの配列である(以下詳細に説明する).したがって,配列が持つメソッド,属性は,可変パラメータのように持つ.
    public void varArgMethod(int b,int... arr) {
        //     ,    length
        int lenth = arr.length;
        //    
        for(int i=0;i

      上記の例では、可変パラメータの使用は配列の使用と全く同じであり、すなわち、可変パラメータは配列に等価である
    5.可変パラメータのメソッドリロード
    可変パラメータリストのメソッドのリロードは、通常のメソッドとは異なります.可変パラメータのタイプを変更するだけでメソッドをリロードすることはできません.
    たとえば、varArray(int... a)varArray(Object... a)の場合、この2つのメソッドは呼び出し時にエラーが発生し、メソッドの再ロードに失敗します.
    二、可変パラメータの原理を深く分析する
      可変パラメータの様々な態様は、前述したように詳細に説明されている.このセクションでは、可変パラメータの実装原理、特に可変パラメータの使用が配列と同じである理由を深く理解します.
    次の簡単な例を見てみましょう.
    public class MyTest{
    
    public static void main(String[] args) {
        int a = 100;
        varArgMethod(5, 7,8,9,10,a);
     }
    
    public static void varArgMethod(int b,int... arr) {
        //    
        for(int i=0;i

    例は簡単です.コンパイラがどのように処理されているかを理解するために、jadで上記の例のclassファイルを逆コンパイルします.
    public class MyTest {
    
        public static void main(String args[]) {
            int a = 100;
            varArgMethod(5, new int[]{7, 8, 9, 10, a});//              int[]  
        }
    
        public static transient void varArgMethod(int b, int arr[]) { //           
            for (int i = 0; i < arr.length; i++)
                System.out.println(arr[i]);
    
        }
    }

      逆コンパイルの結果から,コンパイラは可変パラメータを配列varArgMethod(int b, int arr[])に処理するだけでなく,可変パラメータメソッドを呼び出すパラメータリストを処理し,パラメータリストを1つの配列varArgMethod(5, new int[]{7, 8, 9, 10, a})にカプセル化することが分かる.
    今から見れば、可変パラメータのリストはそれほど不思議ではなく、プログラマーの仕事を簡略化し、コンパイラに任せて処理したにすぎない.最後に,可変パラメータの使用は配列と同様に珍しくない.可変パラメータは最後にコンパイラによって配列に処理され,可変パラメータは配列であるからである.
    転載先:https://www.cnblogs.com/jinggod/p/8426046.html