You're building a logging method. Sometimes you log one value, sometimes five. Instead of overloading for every count, varargs lets you accept any number of arguments with a single method definition.

Accept any number of arguments

Define a method that takes zero or more values.

BasicVarargs.java
Replay: real traced execution (multi-file project)
public class BasicVarargs {
    public static void main(String[] args) {
        System.out.println("=== Basic Varargs ===\n");

        // Call with different numbers of arguments
        printAll();                           // Zero args
        printAll("Hello");                    // One arg
        printAll("Alice", "Bob");             // Two args
        printAll("Red", "Green", "Blue");     // Three args

        System.out.println("\n=== Inside the Method ===");
        showDetails("a", "b", "c");

        // Typed varargs
        System.out.println("\n=== Integer Varargs ===");
        showNumbers(10, 20, 30, 40);
    }

    // Varargs method
    static void printAll(String... messages) {
        System.out.println("Called with " + messages.length + " argument(s):");
        for (String msg : messages) {
            System.out.println("  - " + msg);
        }
    }

    static void showDetails(String... items) {
        System.out.println("items.getClass(): " + items.getClass().getSimpleName());
        System.out.println("items.length: " + items.length);
        System.out.print("items contents: ");
        for (int i = 0; i < items.length; i++) {
            System.out.print(items[i]);
            if (i < items.length - 1) System.out.print(", ");
        }
        System.out.println();
    }

    // Integer varargs
    static void showNumbers(int... nums) {
        System.out.println("Received " + nums.length + " integers");
        int sum = 0;
        for (int n : nums) sum += n;
        System.out.println("Sum: " + sum);
    }
}
  1. public static void main(String[] args)

    2public class BasicVarargs {3    public static void main(String[] args) {4        System.out.println("=== Basic Varargs ===\n");5        6        // Call with different numbers of arguments  //?calls7        printAll();                           // Zero args8        printAll("Hello");                    // One arg
    output=== Basic Varargs ===
  2. static void printAll(String... messages)

    pass 1 of 4
    6    // Call with different numbers of arguments  //?calls7    printAll();                           // Zero args8    printAll("Hello");                    // One arg9    printAll("Alice", "Bob");             // Two args10    printAll("Red", "Green", "Blue");     // Three args11    12    System.out.println("\n=== Inside the Method ===");13    showDetails("a", "b", "c");14    15    // Typed varargs  //@var=_,!16    System.out.println("\n=== Integer Varargs ===");17    showNumbers(10, 20, 30, 40);18}1920// Varargs method  //?varargs21static void printAll(String... messages) {22    System.out.println("Called with " + messages.length0 + " argument(s):");23    for (String msg : messages) {
    outputCalled with 0 argument(s):
    All 4 passes — pass 1 is the card above
    passmessages.lengthitems.lengthi
    10
    21
    32
    4330
  3. for (String msg : messages)

    pass 1 of 6
    7    printAll();                           // Zero args8    printAll("Hello");                    // One arg9    printAll("Alice", "Bob");             // Two args10    printAll("Red", "Green", "Blue");     // Three args11    12    System.out.println("\n=== Inside the Method ===");13    showDetails("a", "b", "c");14    15    // Typed varargs  //@var=_,!16    System.out.println("\n=== Integer Varargs ===");17    showNumbers(10, 20, 30, 40);18}1920// Varargs method  //?varargs21static void printAll(String... messages) {22    System.out.println("Called with " + messages.length + " argument(s):");23    for (String msgHello : messages) {24        System.out.println("  - " + msgHello);25    }
    output  - Hello
    All 6 passes — pass 1 is the card above
    passmsgitems.lengthi
    1Hello
    2Alice
    3Bob
    4Red
    5Green
    6Blue30
  4. static void showDetails(String... items)

    28static void showDetails(String... items) {  //?details29    System.out.println("items.getClass(): " + items.getClass().getSimpleName());30    System.out.println("items.length: " + items.length3);31    System.out.print("items contents: ");32    for (int i = 0; i < items.length; i++) {
    outputitems.getClass(): String[]
    items.length: 3
    items contents: 
  5. for (int i = 0; i < items.length; i++)

    pass 1 of 3
    31System.out.print("items contents: ");32for (int i0 = 0; i < items.length3; i++) {33    System.out.print(items[i]a);34    if (i < items.length - 1) System.out.print(", ");
    outputa
    All 3 passes — pass 1 is the card above
    passiitems[i]
    10a
    21b
    32c
  6. if (i < items.length - 1)

    pass 1 of 2
    33    System.out.print(items[i]);34    if (i0 < items.length3 - 1) System.out.print(", ");35}
    output, 
  7. if (i < items.length - 1)

    pass 2 of 2
    33    System.out.print(items[i]);34    if (i1 < items.length3 - 1) System.out.print(", ");35}
    output, 
  8. System.out.println();

    12    System.out.println("\n=== Inside the Method ===");13    showDetails("a", "b", "c");14    15    // Typed varargs  //@var=_,!16    System.out.println("\n=== Integer Varargs ===");17    showNumbers(10, 20, 30, 40);18}1920// Varargs method  //?varargs21static void printAll(String... messages) {22    System.out.println("Called with " + messages.length + " argument(s):");23    for (String msg : messages) {24        System.out.println("  - " + msg);25    }26}2728static void showDetails(String... items) {  //?details29    System.out.println("items.getClass(): " + items.getClass().getSimpleName());30    System.out.println("items.length: " + items.length);31    System.out.print("items contents: ");32    for (int i = 0; i < items.length; i++) {33        System.out.print(items[i]);34        if (i < items.length - 1) System.out.print(", ");35    }36    System.out.println();37}
    output
    === Integer Varargs ===
  9. sum ← 0

    39// Integer varargs  //@var=_,!40static void showNumbers(int... nums) {  //?intvarargs41    System.out.println("Received " + nums.length4 + " integers");  //@var=_,!42    int sum→ 0 = 0;  //@var=_,!43    for (int n : nums) sum += n;  //@var=_,!
    outputReceived 4 integers
  10. sum ← 10

    pass 1 of 4
    42int sum = 0;  //@var=_,!43for (int n10 : nums) sum→ 10 += n;  //@var=_,!44System.out.println("Sum: " + sum);  //@var=_,!
    All 4 passes — pass 1 is the card above
    passnsum
    1100 10
    22010 30
    33030 60
    44060 100
  11. System.out.println("Sum: " + sum); //@var=_,!

    16    System.out.println("\n=== Integer Varargs ===");17    showNumbers(10, 20, 30, 40);18}1920// Varargs method  //?varargs21static void printAll(String... messages) {22    System.out.println("Called with " + messages.length + " argument(s):");23    for (String msg : messages) {24        System.out.println("  - " + msg);25    }26}2728static void showDetails(String... items) {  //?details29    System.out.println("items.getClass(): " + items.getClass().getSimpleName());30    System.out.println("items.length: " + items.length);31    System.out.print("items contents: ");32    for (int i = 0; i < items.length; i++) {33        System.out.print(items[i]);34        if (i < items.length - 1) System.out.print(", ");35    }36    System.out.println();37}3839// Integer varargs  //@var=_,!40static void showNumbers(int... nums) {  //?intvarargs41    System.out.println("Received " + nums.length + " integers");  //@var=_,!42    int sum = 0;  //@var=_,!43    for (int n : nums) sum += n;  //@var=_,!44    System.out.println("Sum: " + sum100);  //@var=_,!45}  //@var=_,!
    outputSum: 100

Use Type... name syntax. Inside the method, it's an array.

varargs Variable arguments: `void print(String... items)`. Received as array.

Sum any count of numbers

Calculate the sum of however many numbers are passed.

bonus
SumNumbers.java
Replay: real traced execution (multi-file project)
public class SumNumbers {
    public static void main(String[] args) {
        System.out.println("=== Summing with Varargs ===\n");

        // Sum different counts of numbers
        int bonus = 5;
        System.out.println("sum() = " + sum());
        System.out.println("sum(" + bonus + ") = " + sum(bonus));
        System.out.println("sum(1, 2, " + bonus + ") = " + sum(1, 2, bonus));
        System.out.println("sum(10, 20, 30, 40, " + bonus + ") = " + sum(10, 20, 30, 40, bonus));

        System.out.println("\n=== Finding Max ===");
        System.out.println("max(5) = " + max(5));
        System.out.println("max(3, 7, 2) = " + max(3, 7, 2));
        System.out.println("max(10, -5, 8, 20, 15) = " + max(10, -5, 8, 20, 15));

        // Extended stats
        System.out.println("\n=== Statistics ===");
        stats(1, 2, 3, 4, bonus);
        stats(10, 20, 30);
    }

    static int sum(int... numbers) {
        int total = 0;
        for (int n : numbers) {
            total += n;
        }
        return total;
    }

    static int max(int first, int... rest) {
        // first guarantees at least one argument
        int maximum = first;
        for (int n : rest) {
            if (n > maximum) {
                maximum = n;
            }
        }
        return maximum;
    }

    // Stats helper
    static void stats(int... numbers) {
        if (numbers.length == 0) {
            System.out.println("No numbers provided");
            return;
        }
        int sum = 0, min = numbers[0], max = numbers[0];
        for (int n : numbers) {
            sum += n;
            if (n < min) min = n;
            if (n > max) max = n;
        }
        double avg = (double) sum / numbers.length;
        System.out.printf("Count: %d, Sum: %d, Avg: %.2f, Min: %d, Max: %d%n",
            numbers.length, sum, avg, min, max);
    }
}
public class SumNumbers {
    public static void main(String[] args) {
        System.out.println("=== Summing with Varargs ===\n");

        // Sum different counts of numbers
        int bonus = -2;
        System.out.println("sum() = " + sum());
        System.out.println("sum(" + bonus + ") = " + sum(bonus));
        System.out.println("sum(1, 2, " + bonus + ") = " + sum(1, 2, bonus));
        System.out.println("sum(10, 20, 30, 40, " + bonus + ") = " + sum(10, 20, 30, 40, bonus));

        System.out.println("\n=== Finding Max ===");
        System.out.println("max(5) = " + max(5));
        System.out.println("max(3, 7, 2) = " + max(3, 7, 2));
        System.out.println("max(10, -5, 8, 20, 15) = " + max(10, -5, 8, 20, 15));

        // Extended stats
        System.out.println("\n=== Statistics ===");
        stats(1, 2, 3, 4, bonus);
        stats(10, 20, 30);
    }

    static int sum(int... numbers) {
        int total = 0;
        for (int n : numbers) {
            total += n;
        }
        return total;
    }

    static int max(int first, int... rest) {
        // first guarantees at least one argument
        int maximum = first;
        for (int n : rest) {
            if (n > maximum) {
                maximum = n;
            }
        }
        return maximum;
    }

    // Stats helper
    static void stats(int... numbers) {
        if (numbers.length == 0) {
            System.out.println("No numbers provided");
            return;
        }
        int sum = 0, min = numbers[0], max = numbers[0];
        for (int n : numbers) {
            sum += n;
            if (n < min) min = n;
            if (n > max) max = n;
        }
        double avg = (double) sum / numbers.length;
        System.out.printf("Count: %d, Sum: %d, Avg: %.2f, Min: %d, Max: %d%n",
            numbers.length, sum, avg, min, max);
    }
}
public class SumNumbers {
    public static void main(String[] args) {
        System.out.println("=== Summing with Varargs ===\n");

        // Sum different counts of numbers
        int bonus = 10;
        System.out.println("sum() = " + sum());
        System.out.println("sum(" + bonus + ") = " + sum(bonus));
        System.out.println("sum(1, 2, " + bonus + ") = " + sum(1, 2, bonus));
        System.out.println("sum(10, 20, 30, 40, " + bonus + ") = " + sum(10, 20, 30, 40, bonus));

        System.out.println("\n=== Finding Max ===");
        System.out.println("max(5) = " + max(5));
        System.out.println("max(3, 7, 2) = " + max(3, 7, 2));
        System.out.println("max(10, -5, 8, 20, 15) = " + max(10, -5, 8, 20, 15));

        // Extended stats
        System.out.println("\n=== Statistics ===");
        stats(1, 2, 3, 4, bonus);
        stats(10, 20, 30);
    }

    static int sum(int... numbers) {
        int total = 0;
        for (int n : numbers) {
            total += n;
        }
        return total;
    }

    static int max(int first, int... rest) {
        // first guarantees at least one argument
        int maximum = first;
        for (int n : rest) {
            if (n > maximum) {
                maximum = n;
            }
        }
        return maximum;
    }

    // Stats helper
    static void stats(int... numbers) {
        if (numbers.length == 0) {
            System.out.println("No numbers provided");
            return;
        }
        int sum = 0, min = numbers[0], max = numbers[0];
        for (int n : numbers) {
            sum += n;
            if (n < min) min = n;
            if (n > max) max = n;
        }
        double avg = (double) sum / numbers.length;
        System.out.printf("Count: %d, Sum: %d, Avg: %.2f, Min: %d, Max: %d%n",
            numbers.length, sum, avg, min, max);
    }
}
  1. bonus ← 5

    2public class SumNumbers {3    public static void main(String[] args) {4        System.out.println("=== Summing with Varargs ===\n");5        6        // Sum different counts of numbers  //?sum7        int bonus→ 5 = 5;  //@bonus=5, 10, -28        System.out.println("sum() = " + sum());9        System.out.println("sum(" + bonus + ") = " + sum(bonus));
    output=== Summing with Varargs ===
  2. total ← 0

    pass 1 of 4
    24static int sum(int... numbers) {  //?summethod25    int total→ 0 = 0;26    for (int n : numbers) {27        total += n;28    }29    return total0;30}
    All 4 passes — pass 1 is the card above
    passtotal
    10
    20
    30
    40
  3. System.out.println("sum(" + bonus + ") = " + sum(bonus));

    7int bonus = 5;  //@bonus=5, 10, -28System.out.println("sum() = " + sum());9System.out.println("sum(" + bonus5 + ") = " + sum(bonus));10System.out.println("sum(1, 2, " + bonus + ") = " + sum(1, 2, bonus));
    outputsum() = 0
  4. total ← 5

    pass 1 of 9
    25int total = 0;26for (int n5 : numbers) {27    total→ 5 += n5;28}
    All 9 passes — pass 1 is the card above
    passntotal
    150 5
    210 1
    321 3
    453 8
    5100 10
    62010 30
    73030 60
    84060 100
    95100 105
  5. return total;

    28    }29    return total5;30}
  6. System.out.println("sum(" + bonus + ") = " + sum(bonus));

    8System.out.println("sum() = " + sum());9System.out.println("sum(" + bonus5 + ") = " + sum(bonus));10System.out.println("sum(1, 2, " + bonus5 + ") = " + sum(1, 2, bonus));11System.out.println("sum(10, 20, 30, 40, " + bonus + ") = " + sum(10, 20, 30, 40, bonus));
    outputsum(5) = 5
  7. return total;

    28    }29    return total8;30}
  8. System.out.println("sum(1, 2, " + bonus + ") = " + sum(1, 2, bonus));

    9System.out.println("sum(" + bonus + ") = " + sum(bonus));10System.out.println("sum(1, 2, " + bonus5 + ") = " + sum(1, 2, bonus));11System.out.println("sum(10, 20, 30, 40, " + bonus5 + ") = " + sum(10, 20, 30, 40, bonus));
    outputsum(1, 2, 5) = 8
  9. return total;

    28    }29    return total105;30}
  10. System.out.println("sum(10, 20, 30, 40, " + bonus + ") = " + sum(10, 2…

    10System.out.println("sum(1, 2, " + bonus + ") = " + sum(1, 2, bonus));11System.out.println("sum(10, 20, 30, 40, " + bonus5 + ") = " + sum(10, 20, 30, 40, bonus));1213System.out.println("\n=== Finding Max ===");  //?max14System.out.println("max(5) = " + max(5));15System.out.println("max(3, 7, 2) = " + max(3, 7, 2));
    outputsum(10, 20, 30, 40, 5) = 105
    
    === Finding Max ===
  11. maximum ← 5

    pass 1 of 3
    32static int max(int first5, int... rest) {  //?requireone33    // first guarantees at least one argument34    int maximum→ 5 = first;35    for (int n : rest) {36        if (n > maximum) {37            maximum = n;38        }39    }40    return maximum5;41}
    All 3 passes — pass 1 is the card above
    passfirstnmaximum
    155
    2373
    3102010
  12. System.out.println("max(5) = " + max(5));

    13System.out.println("\n=== Finding Max ===");  //?max14System.out.println("max(5) = " + max(5));15System.out.println("max(3, 7, 2) = " + max(3, 7, 2));16System.out.println("max(10, -5, 8, 20, 15) = " + max(10, -5, 8, 20, 15));
    outputmax(5) = 5
  13. for (int n : rest)

    pass 1 of 6
    34int maximum = first;35for (int n7 : rest) {36    if (n > maximum) {
    All 6 passes — pass 1 is the card above
    passnmaximum
    173 7
    22
    3-5
    48
    52010 20
    615
  14. maximum ← 7

    pass 1 of 2
    35for (int n : rest) {36    if (n7 > maximum3) {37        maximum→ 7 = n7;38    }
  15. return maximum;

    39    }40    return maximum7;41}
  16. System.out.println("max(3, 7, 2) = " + max(3, 7, 2));

    14System.out.println("max(5) = " + max(5));15System.out.println("max(3, 7, 2) = " + max(3, 7, 2));16System.out.println("max(10, -5, 8, 20, 15) = " + max(10, -5, 8, 20, 15));
    outputmax(3, 7, 2) = 7
  17. maximum ← 20

    pass 2 of 2
    35for (int n : rest) {36    if (n20 > maximum10) {37        maximum→ 20 = n20;38    }
  18. return maximum;

    39    }40    return maximum20;41}
  19. stats(1, 2, 3, 4, bonus);

    15System.out.println("max(3, 7, 2) = " + max(3, 7, 2));16System.out.println("max(10, -5, 8, 20, 15) = " + max(10, -5, 8, 20, 15));1718// Extended stats  //@var=_,!19System.out.println("\n=== Statistics ===");20stats(1, 2, 3, 4, bonus5);21stats(10, 20, 30);
    outputmax(10, -5, 8, 20, 15) = 20
    
    === Statistics ===
  20. max ← 1

    pass 1 of 2
    43// Stats helper  //@var=_,!44static void stats(int... numbers) {  //?stats45    if (numbers.length == 0) {  //@var=_,!46        System.out.println("No numbers provided");  //@var=_,!47        return;  //@var=_,!48    }  //@var=_,!49    int sum = 0, min = numbers[0], max→ 1 = numbers[0]1;  //@var=_,!50    for (int n : numbers) {  //@var=_,!
  21. sum ← 1

    pass 1 of 8
    49int sum = 0, min = numbers[0], max = numbers[0];  //@var=_,!50for (int n1 : numbers) {  //@var=_,!51    sum→ 1 += n1;  //@var=_,!52    if (n < min) min = n;  //@var=_,!
    All 8 passes — pass 1 is the card above
    passnsum
    110 1
    221 3
    333 6
    446 10
    5510 15
    6100 10
    72010 30
    83030 60
  22. max ← 2

    pass 1 of 6
    52    if (n < min) min = n;  //@var=_,!53    if (n2 > max1) max = n;  //@var=_,!54}  //@var=_,!
    All 6 passes — pass 1 is the card above
    passnmax
    121 2
    232 3
    343 4
    454 5
    52010 20
    63020 30
  23. avg ← 3.0

    19    System.out.println("\n=== Statistics ===");20    stats(1, 2, 3, 4, bonus5);21    stats(10, 20, 30);22}2324static int sum(int... numbers) {  //?summethod25    int total = 0;26    for (int n : numbers) {27        total += n;28    }29    return total;30}3132static int max(int first, int... rest) {  //?requireone33    // first guarantees at least one argument34    int maximum = first;35    for (int n : rest) {36        if (n > maximum) {37            maximum = n;38        }39    }40    return maximum;41}4243// Stats helper  //@var=_,!44static void stats(int... numbers) {  //?stats45    if (numbers.length == 0) {  //@var=_,!46        System.out.println("No numbers provided");  //@var=_,!47        return;  //@var=_,!48    }  //@var=_,!49    int sum = 0, min = numbers[0], max = numbers[0];  //@var=_,!50    for (int n : numbers) {  //@var=_,!51        sum += n;  //@var=_,!52        if (n < min) min = n;  //@var=_,!53        if (n > max) max = n;  //@var=_,!54    }  //@var=_,!55    double avg→ 3.0 = (double) sum / numbers.length5;  //@var=_,!56    System.out.printf("Count: %d, Sum: %d, Avg: %.2f, Min: %d, Max: %d%n",  //@var=_,!57        numbers.length5, sum15, avg3.0, min1, max5);  //@var=_,!58}  //@var=_,!
  24. max ← 10

    pass 2 of 2
    43// Stats helper  //@var=_,!44static void stats(int... numbers) {  //?stats45    if (numbers.length == 0) {  //@var=_,!46        System.out.println("No numbers provided");  //@var=_,!47        return;  //@var=_,!48    }  //@var=_,!49    int sum = 0, min = numbers[0], max→ 10 = numbers[0]10;  //@var=_,!50    for (int n : numbers) {  //@var=_,!
  25. avg ← 20.0

    20    stats(1, 2, 3, 4, bonus);21    stats(10, 20, 30);22}2324static int sum(int... numbers) {  //?summethod25    int total = 0;26    for (int n : numbers) {27        total += n;28    }29    return total;30}3132static int max(int first, int... rest) {  //?requireone33    // first guarantees at least one argument34    int maximum = first;35    for (int n : rest) {36        if (n > maximum) {37            maximum = n;38        }39    }40    return maximum;41}4243// Stats helper  //@var=_,!44static void stats(int... numbers) {  //?stats45    if (numbers.length == 0) {  //@var=_,!46        System.out.println("No numbers provided");  //@var=_,!47        return;  //@var=_,!48    }  //@var=_,!49    int sum = 0, min = numbers[0], max = numbers[0];  //@var=_,!50    for (int n : numbers) {  //@var=_,!51        sum += n;  //@var=_,!52        if (n < min) min = n;  //@var=_,!53        if (n > max) max = n;  //@var=_,!54    }  //@var=_,!55    double avg→ 20.0 = (double) sum / numbers.length3;  //@var=_,!56    System.out.printf("Count: %d, Sum: %d, Avg: %.2f, Min: %d, Max: %d%n",  //@var=_,!57        numbers.length3, sum60, avg20.0, min10, max30);  //@var=_,!58}  //@var=_,!
  1. bonus ← -2

    1public class SumNumbers {2    public static void main(String[] args) {3        System.out.println("=== Summing with Varargs ===\n");4        5        // Sum different counts of numbers6        int bonus→ -2 = -2;7        System.out.println("sum() = " + sum());8        System.out.println("sum(" + bonus + ") = " + sum(bonus));
    output=== Summing with Varargs ===
  2. total ← 0

    pass 1 of 4
    23static int sum(int... numbers) {24    int total→ 0 = 0;25    for (int n : numbers) {26        total += n;27    }28    return total0;29}
    All 4 passes — pass 1 is the card above
    passtotal
    10
    20
    30
    40
  3. System.out.println("sum(" + bonus + ") = " + sum(bonus));

    6int bonus = -2;7System.out.println("sum() = " + sum());8System.out.println("sum(" + bonus-2 + ") = " + sum(bonus));9System.out.println("sum(1, 2, " + bonus + ") = " + sum(1, 2, bonus));
    outputsum() = 0
  4. total ← -2

    pass 1 of 9
    24int total = 0;25for (int n-2 : numbers) {26    total→ -2 += n-2;27}
    All 9 passes — pass 1 is the card above
    passntotal
    1-20 -2
    210 1
    321 3
    4-23 1
    5100 10
    62010 30
    73030 60
    84060 100
    9-2100 98
  5. return total;

    27    }28    return total-2;29}
  6. System.out.println("sum(" + bonus + ") = " + sum(bonus));

    7System.out.println("sum() = " + sum());8System.out.println("sum(" + bonus-2 + ") = " + sum(bonus));9System.out.println("sum(1, 2, " + bonus-2 + ") = " + sum(1, 2, bonus));10System.out.println("sum(10, 20, 30, 40, " + bonus + ") = " + sum(10, 20, 30, 40, bonus));
    outputsum(-2) = -2
  7. return total;

    27    }28    return total1;29}
  8. System.out.println("sum(1, 2, " + bonus + ") = " + sum(1, 2, bonus));

    8System.out.println("sum(" + bonus + ") = " + sum(bonus));9System.out.println("sum(1, 2, " + bonus-2 + ") = " + sum(1, 2, bonus));10System.out.println("sum(10, 20, 30, 40, " + bonus-2 + ") = " + sum(10, 20, 30, 40, bonus));
    outputsum(1, 2, -2) = 1
  9. return total;

    27    }28    return total98;29}
  10. System.out.println("sum(10, 20, 30, 40, " + bonus + ") = " + sum(10, 2…

    9System.out.println("sum(1, 2, " + bonus + ") = " + sum(1, 2, bonus));10System.out.println("sum(10, 20, 30, 40, " + bonus-2 + ") = " + sum(10, 20, 30, 40, bonus));1112System.out.println("\n=== Finding Max ===");13System.out.println("max(5) = " + max(5));14System.out.println("max(3, 7, 2) = " + max(3, 7, 2));
    outputsum(10, 20, 30, 40, -2) = 98
    
    === Finding Max ===
  11. maximum ← 5

    pass 1 of 3
    31static int max(int first5, int... rest) {32    // first guarantees at least one argument33    int maximum→ 5 = first;34    for (int n : rest) {35        if (n > maximum) {36            maximum = n;37        }38    }39    return maximum5;40}
    All 3 passes — pass 1 is the card above
    passfirstnmaximum
    155
    2373
    3102010
  12. System.out.println("max(5) = " + max(5));

    12System.out.println("\n=== Finding Max ===");13System.out.println("max(5) = " + max(5));14System.out.println("max(3, 7, 2) = " + max(3, 7, 2));15System.out.println("max(10, -5, 8, 20, 15) = " + max(10, -5, 8, 20, 15));
    outputmax(5) = 5
  13. for (int n : rest)

    pass 1 of 6
    33int maximum = first;34for (int n7 : rest) {35    if (n > maximum) {
    All 6 passes — pass 1 is the card above
    passnmaximum
    173 7
    22
    3-5
    48
    52010 20
    615
  14. maximum ← 7

    pass 1 of 2
    34for (int n : rest) {35    if (n7 > maximum3) {36        maximum→ 7 = n7;37    }
  15. return maximum;

    38    }39    return maximum7;40}
  16. System.out.println("max(3, 7, 2) = " + max(3, 7, 2));

    13System.out.println("max(5) = " + max(5));14System.out.println("max(3, 7, 2) = " + max(3, 7, 2));15System.out.println("max(10, -5, 8, 20, 15) = " + max(10, -5, 8, 20, 15));
    outputmax(3, 7, 2) = 7
  17. maximum ← 20

    pass 2 of 2
    34for (int n : rest) {35    if (n20 > maximum10) {36        maximum→ 20 = n20;37    }
  18. return maximum;

    38    }39    return maximum20;40}
  19. stats(1, 2, 3, 4, bonus);

    14System.out.println("max(3, 7, 2) = " + max(3, 7, 2));15System.out.println("max(10, -5, 8, 20, 15) = " + max(10, -5, 8, 20, 15));1617// Extended stats18System.out.println("\n=== Statistics ===");19stats(1, 2, 3, 4, bonus-2);20stats(10, 20, 30);
    outputmax(10, -5, 8, 20, 15) = 20
    
    === Statistics ===
  20. max ← 1

    pass 1 of 2
    42// Stats helper43static void stats(int... numbers) {44    if (numbers.length == 0) {45        System.out.println("No numbers provided");46        return;47    }48    int sum = 0, min = numbers[0], max→ 1 = numbers[0]1;49    for (int n : numbers) {
  21. sum ← 1

    pass 1 of 8
    48int sum = 0, min = numbers[0], max = numbers[0];49for (int n1 : numbers) {50    sum→ 1 += n1;51    if (n < min) min = n;
    All 8 passes — pass 1 is the card above
    passnsummin
    110 1
    221 3
    333 6
    446 10
    5-210 81 -2
    6100 10
    72010 30
    83030 60
  22. max ← 2

    pass 1 of 5
    51    if (n < min) min = n;52    if (n2 > max1) max = n;53}
    All 5 passes — pass 1 is the card above
    passnmaxmin
    121 2
    232 3
    343 41 -2
    42010 20
    53020 30
  23. min ← -2

    50sum += n;51if (n-2 < min1) min = n;52if (n > max) max = n;
  24. avg ← 1.6

    18    System.out.println("\n=== Statistics ===");19    stats(1, 2, 3, 4, bonus-2);20    stats(10, 20, 30);21}2223static int sum(int... numbers) {24    int total = 0;25    for (int n : numbers) {26        total += n;27    }28    return total;29}3031static int max(int first, int... rest) {32    // first guarantees at least one argument33    int maximum = first;34    for (int n : rest) {35        if (n > maximum) {36            maximum = n;37        }38    }39    return maximum;40}4142// Stats helper43static void stats(int... numbers) {44    if (numbers.length == 0) {45        System.out.println("No numbers provided");46        return;47    }48    int sum = 0, min = numbers[0], max = numbers[0];49    for (int n : numbers) {50        sum += n;51        if (n < min) min = n;52        if (n > max) max = n;53    }54    double avg→ 1.6 = (double) sum / numbers.length5;55    System.out.printf("Count: %d, Sum: %d, Avg: %.2f, Min: %d, Max: %d%n",56        numbers.length5, sum8, avg1.6, min-2, max4);57}
  25. max ← 10

    pass 2 of 2
    42// Stats helper43static void stats(int... numbers) {44    if (numbers.length == 0) {45        System.out.println("No numbers provided");46        return;47    }48    int sum = 0, min = numbers[0], max→ 10 = numbers[0]10;49    for (int n : numbers) {
  26. avg ← 20.0

    19    stats(1, 2, 3, 4, bonus);20    stats(10, 20, 30);21}2223static int sum(int... numbers) {24    int total = 0;25    for (int n : numbers) {26        total += n;27    }28    return total;29}3031static int max(int first, int... rest) {32    // first guarantees at least one argument33    int maximum = first;34    for (int n : rest) {35        if (n > maximum) {36            maximum = n;37        }38    }39    return maximum;40}4142// Stats helper43static void stats(int... numbers) {44    if (numbers.length == 0) {45        System.out.println("No numbers provided");46        return;47    }48    int sum = 0, min = numbers[0], max = numbers[0];49    for (int n : numbers) {50        sum += n;51        if (n < min) min = n;52        if (n > max) max = n;53    }54    double avg→ 20.0 = (double) sum / numbers.length3;55    System.out.printf("Count: %d, Sum: %d, Avg: %.2f, Min: %d, Max: %d%n",56        numbers.length3, sum60, avg20.0, min10, max30);57}
  1. bonus ← 10

    1public class SumNumbers {2    public static void main(String[] args) {3        System.out.println("=== Summing with Varargs ===\n");4        5        // Sum different counts of numbers6        int bonus→ 10 = 10;7        System.out.println("sum() = " + sum());8        System.out.println("sum(" + bonus + ") = " + sum(bonus));
    output=== Summing with Varargs ===
  2. total ← 0

    pass 1 of 4
    23static int sum(int... numbers) {24    int total→ 0 = 0;25    for (int n : numbers) {26        total += n;27    }28    return total0;29}
    All 4 passes — pass 1 is the card above
    passtotal
    10
    20
    30
    40
  3. System.out.println("sum(" + bonus + ") = " + sum(bonus));

    6int bonus = 10;7System.out.println("sum() = " + sum());8System.out.println("sum(" + bonus10 + ") = " + sum(bonus));9System.out.println("sum(1, 2, " + bonus + ") = " + sum(1, 2, bonus));
    outputsum() = 0
  4. total ← 10

    pass 1 of 9
    24int total = 0;25for (int n10 : numbers) {26    total→ 10 += n10;27}
    All 9 passes — pass 1 is the card above
    passntotal
    1100 10
    210 1
    321 3
    4103 13
    5100 10
    62010 30
    73030 60
    84060 100
    910100 110
  5. return total;

    27    }28    return total10;29}
  6. System.out.println("sum(" + bonus + ") = " + sum(bonus));

    7System.out.println("sum() = " + sum());8System.out.println("sum(" + bonus10 + ") = " + sum(bonus));9System.out.println("sum(1, 2, " + bonus10 + ") = " + sum(1, 2, bonus));10System.out.println("sum(10, 20, 30, 40, " + bonus + ") = " + sum(10, 20, 30, 40, bonus));
    outputsum(10) = 10
  7. return total;

    27    }28    return total13;29}
  8. System.out.println("sum(1, 2, " + bonus + ") = " + sum(1, 2, bonus));

    8System.out.println("sum(" + bonus + ") = " + sum(bonus));9System.out.println("sum(1, 2, " + bonus10 + ") = " + sum(1, 2, bonus));10System.out.println("sum(10, 20, 30, 40, " + bonus10 + ") = " + sum(10, 20, 30, 40, bonus));
    outputsum(1, 2, 10) = 13
  9. return total;

    27    }28    return total110;29}
  10. System.out.println("sum(10, 20, 30, 40, " + bonus + ") = " + sum(10, 2…

    9System.out.println("sum(1, 2, " + bonus + ") = " + sum(1, 2, bonus));10System.out.println("sum(10, 20, 30, 40, " + bonus10 + ") = " + sum(10, 20, 30, 40, bonus));1112System.out.println("\n=== Finding Max ===");13System.out.println("max(5) = " + max(5));14System.out.println("max(3, 7, 2) = " + max(3, 7, 2));
    outputsum(10, 20, 30, 40, 10) = 110
    
    === Finding Max ===
  11. maximum ← 5

    pass 1 of 3
    31static int max(int first5, int... rest) {32    // first guarantees at least one argument33    int maximum→ 5 = first;34    for (int n : rest) {35        if (n > maximum) {36            maximum = n;37        }38    }39    return maximum5;40}
    All 3 passes — pass 1 is the card above
    passfirstnmaximum
    155
    2373
    3102010
  12. System.out.println("max(5) = " + max(5));

    12System.out.println("\n=== Finding Max ===");13System.out.println("max(5) = " + max(5));14System.out.println("max(3, 7, 2) = " + max(3, 7, 2));15System.out.println("max(10, -5, 8, 20, 15) = " + max(10, -5, 8, 20, 15));
    outputmax(5) = 5
  13. for (int n : rest)

    pass 1 of 6
    33int maximum = first;34for (int n7 : rest) {35    if (n > maximum) {
    All 6 passes — pass 1 is the card above
    passnmaximum
    173 7
    22
    3-5
    48
    52010 20
    615
  14. maximum ← 7

    pass 1 of 2
    34for (int n : rest) {35    if (n7 > maximum3) {36        maximum→ 7 = n7;37    }
  15. return maximum;

    38    }39    return maximum7;40}
  16. System.out.println("max(3, 7, 2) = " + max(3, 7, 2));

    13System.out.println("max(5) = " + max(5));14System.out.println("max(3, 7, 2) = " + max(3, 7, 2));15System.out.println("max(10, -5, 8, 20, 15) = " + max(10, -5, 8, 20, 15));
    outputmax(3, 7, 2) = 7
  17. maximum ← 20

    pass 2 of 2
    34for (int n : rest) {35    if (n20 > maximum10) {36        maximum→ 20 = n20;37    }
  18. return maximum;

    38    }39    return maximum20;40}
  19. stats(1, 2, 3, 4, bonus);

    14System.out.println("max(3, 7, 2) = " + max(3, 7, 2));15System.out.println("max(10, -5, 8, 20, 15) = " + max(10, -5, 8, 20, 15));1617// Extended stats18System.out.println("\n=== Statistics ===");19stats(1, 2, 3, 4, bonus10);20stats(10, 20, 30);
    outputmax(10, -5, 8, 20, 15) = 20
    
    === Statistics ===
  20. max ← 1

    pass 1 of 2
    42// Stats helper43static void stats(int... numbers) {44    if (numbers.length == 0) {45        System.out.println("No numbers provided");46        return;47    }48    int sum = 0, min = numbers[0], max→ 1 = numbers[0]1;49    for (int n : numbers) {
  21. sum ← 1

    pass 1 of 8
    48int sum = 0, min = numbers[0], max = numbers[0];49for (int n1 : numbers) {50    sum→ 1 += n1;51    if (n < min) min = n;
    All 8 passes — pass 1 is the card above
    passnsum
    110 1
    221 3
    333 6
    446 10
    51010 20
    6100 10
    72010 30
    83030 60
  22. max ← 2

    pass 1 of 6
    51    if (n < min) min = n;52    if (n2 > max1) max = n;53}
    All 6 passes — pass 1 is the card above
    passnmax
    121 2
    232 3
    343 4
    4104 10
    52010 20
    63020 30
  23. avg ← 4.0

    18    System.out.println("\n=== Statistics ===");19    stats(1, 2, 3, 4, bonus10);20    stats(10, 20, 30);21}2223static int sum(int... numbers) {24    int total = 0;25    for (int n : numbers) {26        total += n;27    }28    return total;29}3031static int max(int first, int... rest) {32    // first guarantees at least one argument33    int maximum = first;34    for (int n : rest) {35        if (n > maximum) {36            maximum = n;37        }38    }39    return maximum;40}4142// Stats helper43static void stats(int... numbers) {44    if (numbers.length == 0) {45        System.out.println("No numbers provided");46        return;47    }48    int sum = 0, min = numbers[0], max = numbers[0];49    for (int n : numbers) {50        sum += n;51        if (n < min) min = n;52        if (n > max) max = n;53    }54    double avg→ 4.0 = (double) sum / numbers.length5;55    System.out.printf("Count: %d, Sum: %d, Avg: %.2f, Min: %d, Max: %d%n",56        numbers.length5, sum20, avg4.0, min1, max10);57}
  24. max ← 10

    pass 2 of 2
    42// Stats helper43static void stats(int... numbers) {44    if (numbers.length == 0) {45        System.out.println("No numbers provided");46        return;47    }48    int sum = 0, min = numbers[0], max→ 10 = numbers[0]10;49    for (int n : numbers) {
  25. avg ← 20.0

    19    stats(1, 2, 3, 4, bonus);20    stats(10, 20, 30);21}2223static int sum(int... numbers) {24    int total = 0;25    for (int n : numbers) {26        total += n;27    }28    return total;29}3031static int max(int first, int... rest) {32    // first guarantees at least one argument33    int maximum = first;34    for (int n : rest) {35        if (n > maximum) {36            maximum = n;37        }38    }39    return maximum;40}4142// Stats helper43static void stats(int... numbers) {44    if (numbers.length == 0) {45        System.out.println("No numbers provided");46        return;47    }48    int sum = 0, min = numbers[0], max = numbers[0];49    for (int n : numbers) {50        sum += n;51        if (n < min) min = n;52        if (n > max) max = n;53    }54    double avg→ 20.0 = (double) sum / numbers.length3;55    System.out.printf("Count: %d, Sum: %d, Avg: %.2f, Min: %d, Max: %d%n",56        numbers.length3, sum60, avg20.0, min10, max30);57}

Loop through the varargs array just like any array.

Combine regular and varargs parameters

Mix required parameters with varargs.

MixedParams.java
Replay: real traced execution (multi-file project)
public class MixedParams {
    public static void main(String[] args) {
        System.out.println("=== Mixed Parameters with Varargs ===\n");

        // Required params + varargs
        log("INFO", "System started");
        log("DEBUG", "Loading config", "user.properties");
        log("ERROR", "Failed to connect", "timeout", "retry=3");

        System.out.println("\n=== Shopping Cart ===");
        printReceipt("Alice", 10.99, 24.50, 5.25);
        printReceipt("Bob", 99.99);

        System.out.println("\n=== Team Roster ===");
        printTeam("Engineering", "Alice", "Bob", "Charlie");
        printTeam("Marketing", "Diana", "Eve");
        printTeam("Executive");  // No members
    }

    // Level (required) + message (required) + details (varargs)
    static void log(String level, String message, String... details) {
        System.out.print("[" + level + "] " + message);
        if (details.length > 0) {
            System.out.print(" | ");
            System.out.print(String.join(", ", details));
        }
        System.out.println();
    }

    // Name + prices (at least one price makes sense)
    static void printReceipt(String customer, double... prices) {
        System.out.println("Receipt for: " + customer);
        double total = 0;
        for (int i = 0; i < prices.length; i++) {
            System.out.printf("  Item %d: $%.2f%n", i + 1, prices[i]);
            total += prices[i];
        }
        System.out.printf("  Total: $%.2f%n", total);
    }

    static void printTeam(String teamName, String... members) {
        System.out.print("Team " + teamName + ": ");
        if (members.length == 0) {
            System.out.println("(no members)");
        } else {
            System.out.println(String.join(", ", members));
        }
    }
}
  1. public static void main(String[] args)

    1public class MixedParams {2    public static void main(String[] args) {3        System.out.println("=== Mixed Parameters with Varargs ===\n");4        5        // Required params + varargs  //?mixed6        log("INFO", "System started");7        log("DEBUG", "Loading config", "user.properties");
    output=== Mixed Parameters with Varargs ===
  2. static void log(String level, String message, String... details)

    pass 1 of 3
    5    // Required params + varargs  //?mixed6    log("INFO", "System started");7    log("DEBUG", "Loading config", "user.properties");8    log("ERROR", "Failed to connect", "timeout", "retry=3");9    10    System.out.println("\n=== Shopping Cart ===");  //?cart11    printReceipt("Alice", 10.99, 24.50, 5.25);12    printReceipt("Bob", 99.99);13    14    System.out.println("\n=== Team Roster ===");  //?roster15    printTeam("Engineering", "Alice", "Bob", "Charlie");16    printTeam("Marketing", "Diana", "Eve");17    printTeam("Executive");  // No members18}1920// Level (required) + message (required) + details (varargs)21static void log(String levelINFO, String messageSystem started, String... details) {  //?logmethod22    System.out.print("[" + levelINFO + "] " + messageSystem started);23    if (details.length > 0) {24        System.out.print(" | ");25        System.out.print(String.join(", ", details));26    }27    System.out.println();28}
    output[INFO] System started
    All 3 passes — pass 1 is the card above
    passlevelmessagedetails.length
    1INFOSystem started
    2DEBUGLoading config1
    3ERRORFailed to connect2
  3. if (details.length > 0)

    pass 1 of 2
    22System.out.print("[" + level + "] " + message);23if (details.length1 > 0) {24    System.out.print(" | ");25    System.out.print(String.join(", ", details));26}
    output |
    user.properties
  4. System.out.println();

    6    log("INFO", "System started");7    log("DEBUG", "Loading config", "user.properties");8    log("ERROR", "Failed to connect", "timeout", "retry=3");9    10    System.out.println("\n=== Shopping Cart ===");  //?cart11    printReceipt("Alice", 10.99, 24.50, 5.25);12    printReceipt("Bob", 99.99);13    14    System.out.println("\n=== Team Roster ===");  //?roster15    printTeam("Engineering", "Alice", "Bob", "Charlie");16    printTeam("Marketing", "Diana", "Eve");17    printTeam("Executive");  // No members18}1920// Level (required) + message (required) + details (varargs)21static void log(String level, String message, String... details) {  //?logmethod22    System.out.print("[" + level + "] " + message);23    if (details.length > 0) {24        System.out.print(" | ");25        System.out.print(String.join(", ", details));26    }27    System.out.println();28}
  5. if (details.length > 0)

    pass 2 of 2
    22System.out.print("[" + level + "] " + message);23if (details.length2 > 0) {24    System.out.print(" | ");25    System.out.print(String.join(", ", details));26}
    output |
    timeout, retry=3
  6. System.out.println();

    7    log("DEBUG", "Loading config", "user.properties");8    log("ERROR", "Failed to connect", "timeout", "retry=3");9    10    System.out.println("\n=== Shopping Cart ===");  //?cart11    printReceipt("Alice", 10.99, 24.50, 5.25);12    printReceipt("Bob", 99.99);13    14    System.out.println("\n=== Team Roster ===");  //?roster15    printTeam("Engineering", "Alice", "Bob", "Charlie");16    printTeam("Marketing", "Diana", "Eve");17    printTeam("Executive");  // No members18}1920// Level (required) + message (required) + details (varargs)21static void log(String level, String message, String... details) {  //?logmethod22    System.out.print("[" + level + "] " + message);23    if (details.length > 0) {24        System.out.print(" | ");25        System.out.print(String.join(", ", details));26    }27    System.out.println();28}
    output
    === Shopping Cart ===
  7. total ← 0.0

    pass 1 of 2
    30// Name + prices (at least one price makes sense)31static void printReceipt(String customerAlice, double... prices) {  //?receipt32    System.out.println("Receipt for: " + customerAlice);33    double total→ 0.0 = 0;34    for (int i = 0; i < prices.length; i++) {
    outputReceipt for: Alice
  8. total ← 10.99

    pass 1 of 4
    33double total = 0;34for (int i0 = 0; i < prices.length3; i++) {35    System.out.printf("  Item %d: $%.2f%n", i0 + 1, prices[i]10.99);36    total→ 10.99 += prices[i]10.99;37}
    All 4 passes — pass 1 is the card above
    passiprices.lengthprices[i]total
    10310.990.0 10.99
    21324.510.99 35.49
    3235.2535.49 40.74
    40199.990.0 99.99
  9. System.out.printf(" Total: $%.2f%n", total);

    10    System.out.println("\n=== Shopping Cart ===");  //?cart11    printReceipt("Alice", 10.99, 24.50, 5.25);12    printReceipt("Bob", 99.99);13    14    System.out.println("\n=== Team Roster ===");  //?roster15    printTeam("Engineering", "Alice", "Bob", "Charlie");16    printTeam("Marketing", "Diana", "Eve");17    printTeam("Executive");  // No members18}1920// Level (required) + message (required) + details (varargs)21static void log(String level, String message, String... details) {  //?logmethod22    System.out.print("[" + level + "] " + message);23    if (details.length > 0) {24        System.out.print(" | ");25        System.out.print(String.join(", ", details));26    }27    System.out.println();28}2930// Name + prices (at least one price makes sense)31static void printReceipt(String customer, double... prices) {  //?receipt32    System.out.println("Receipt for: " + customer);33    double total = 0;34    for (int i = 0; i < prices.length; i++) {35        System.out.printf("  Item %d: $%.2f%n", i + 1, prices[i]);36        total += prices[i];37    }38    System.out.printf("  Total: $%.2f%n", total40.74);39}
  10. total ← 0.0

    pass 2 of 2
    30// Name + prices (at least one price makes sense)31static void printReceipt(String customerBob, double... prices) {  //?receipt32    System.out.println("Receipt for: " + customerBob);33    double total→ 0.0 = 0;34    for (int i = 0; i < prices.length; i++) {
    outputReceipt for: Bob
  11. System.out.printf(" Total: $%.2f%n", total);

    11    printReceipt("Alice", 10.99, 24.50, 5.25);12    printReceipt("Bob", 99.99);13    14    System.out.println("\n=== Team Roster ===");  //?roster15    printTeam("Engineering", "Alice", "Bob", "Charlie");16    printTeam("Marketing", "Diana", "Eve");17    printTeam("Executive");  // No members18}1920// Level (required) + message (required) + details (varargs)21static void log(String level, String message, String... details) {  //?logmethod22    System.out.print("[" + level + "] " + message);23    if (details.length > 0) {24        System.out.print(" | ");25        System.out.print(String.join(", ", details));26    }27    System.out.println();28}2930// Name + prices (at least one price makes sense)31static void printReceipt(String customer, double... prices) {  //?receipt32    System.out.println("Receipt for: " + customer);33    double total = 0;34    for (int i = 0; i < prices.length; i++) {35        System.out.printf("  Item %d: $%.2f%n", i + 1, prices[i]);36        total += prices[i];37    }38    System.out.printf("  Total: $%.2f%n", total99.99);39}
    output
    === Team Roster ===
  12. static void printTeam(String teamName, String... members)

    pass 1 of 3
    41static void printTeam(String teamNameEngineering, String... members) {  //?team42    System.out.print("Team " + teamNameEngineering + ": ");43    if (members.length == 0) {
    outputTeam Engineering: 
    All 3 passes — pass 1 is the card above
    passteamNamemembers.length
    1Engineering
    2Marketing
    3Executive0
  13. else

    pass 1 of 2
    14    System.out.println("\n=== Team Roster ===");  //?roster15    printTeam("Engineering", "Alice", "Bob", "Charlie");16    printTeam("Marketing", "Diana", "Eve");17    printTeam("Executive");  // No members18}1920// Level (required) + message (required) + details (varargs)21static void log(String level, String message, String... details) {  //?logmethod22    System.out.print("[" + level + "] " + message);23    if (details.length > 0) {24        System.out.print(" | ");25        System.out.print(String.join(", ", details));26    }27    System.out.println();28}2930// Name + prices (at least one price makes sense)31static void printReceipt(String customer, double... prices) {  //?receipt32    System.out.println("Receipt for: " + customer);33    double total = 0;34    for (int i = 0; i < prices.length; i++) {35        System.out.printf("  Item %d: $%.2f%n", i + 1, prices[i]);36        total += prices[i];37    }38    System.out.printf("  Total: $%.2f%n", total);39}4041static void printTeam(String teamName, String... members) {  //?team42    System.out.print("Team " + teamName + ": ");43    if (members.length == 0) {44        System.out.println("(no members)");45    } else {46        System.out.println(String.join(", ", members));47    }
    outputAlice, Bob, Charlie
  14. else

    pass 2 of 2
    15    printTeam("Engineering", "Alice", "Bob", "Charlie");16    printTeam("Marketing", "Diana", "Eve");17    printTeam("Executive");  // No members18}1920// Level (required) + message (required) + details (varargs)21static void log(String level, String message, String... details) {  //?logmethod22    System.out.print("[" + level + "] " + message);23    if (details.length > 0) {24        System.out.print(" | ");25        System.out.print(String.join(", ", details));26    }27    System.out.println();28}2930// Name + prices (at least one price makes sense)31static void printReceipt(String customer, double... prices) {  //?receipt32    System.out.println("Receipt for: " + customer);33    double total = 0;34    for (int i = 0; i < prices.length; i++) {35        System.out.printf("  Item %d: $%.2f%n", i + 1, prices[i]);36        total += prices[i];37    }38    System.out.printf("  Total: $%.2f%n", total);39}4041static void printTeam(String teamName, String... members) {  //?team42    System.out.print("Team " + teamName + ": ");43    if (members.length == 0) {44        System.out.println("(no members)");45    } else {46        System.out.println(String.join(", ", members));47    }
    outputDiana, Eve
  15. if (members.length == 0)

    16    printTeam("Marketing", "Diana", "Eve");17    printTeam("Executive");  // No members18}1920// Level (required) + message (required) + details (varargs)21static void log(String level, String message, String... details) {  //?logmethod22    System.out.print("[" + level + "] " + message);23    if (details.length > 0) {24        System.out.print(" | ");25        System.out.print(String.join(", ", details));26    }27    System.out.println();28}2930// Name + prices (at least one price makes sense)31static void printReceipt(String customer, double... prices) {  //?receipt32    System.out.println("Receipt for: " + customer);33    double total = 0;34    for (int i = 0; i < prices.length; i++) {35        System.out.printf("  Item %d: $%.2f%n", i + 1, prices[i]);36        total += prices[i];37    }38    System.out.printf("  Total: $%.2f%n", total);39}4041static void printTeam(String teamName, String... members) {  //?team42    System.out.print("Team " + teamName + ": ");43    if (members.length0 == 0) {44        System.out.println("(no members)");45    } else {
    output(no members)

Varargs must be the last parameter. Regular params come first.

Build printf-style formatting

Create a method that formats strings with variable placeholders.

PrintfStyle.java
Replay: real traced execution (multi-file project)
public class PrintfStyle {
    public static void main(String[] args) {
        System.out.println("=== printf-Style Formatting ===\n");

        // Java's actual printf
        System.out.printf("Name: %s, Age: %d%n", "Alice", 30);
        System.out.printf("Price: $%.2f%n", 29.99);
        System.out.printf("%s scored %d points%n", "Bob", 150);

        System.out.println("\n=== Our Simple Format ===");

        // Our custom simpleFormat
        String msg1 = simpleFormat("Hello, {}!", "World");
        System.out.println(msg1);

        String msg2 = simpleFormat("{} + {} = {}", 10, 20, 30);
        System.out.println(msg2);

        String msg3 = simpleFormat("User {} logged in from {}", "alice", "192.168.1.1");
        System.out.println(msg3);

        System.out.println("\n=== Logging with Format ===");
        logf("INFO", "User {} completed task {}", "Bob", "cleanup");
        logf("ERROR", "Failed after {} retries", 3);
        logf("DEBUG", "Processing {} items from {}", 100, "queue-1");
    }

    // Custom format function like SLF4J
    static String simpleFormat(String template, Object... args) {
        String result = template;
        for (Object arg : args) {
            // Replace first {} with next argument
            result = result.replaceFirst("\\{\\}", String.valueOf(arg));
        }
        return result;
    }

    // Logging with formatting
    static void logf(String level, String template, Object... args) {
        String message = simpleFormat(template, args);
        System.out.println("[" + level + "] " + message);
    }
}
  1. public static void main(String[] args)

    1public class PrintfStyle {2    public static void main(String[] args) {3        System.out.println("=== printf-Style Formatting ===\n");4        5        // Java's actual printf  //?printf6        System.out.printf("Name: %s, Age: %d%n", "Alice", 30);7        System.out.printf("Price: $%.2f%n", 29.99);8        System.out.printf("%s scored %d points%n", "Bob", 150);9        10        System.out.println("\n=== Our Simple Format ===");  //?custom11        12        // Our custom simpleFormat13        String msg1 = simpleFormat("Hello, {}!", "World");14        System.out.println(msg1);
    output=== printf-Style Formatting ===
    
    === Our Simple Format ===
  2. result ← Hello, {}!

    pass 1 of 6
    28// Custom format function like SLF4J  //?simpleformat29static String simpleFormat(String templateHello, {}!, Object... args) {30    String result→ Hello, {}! = template;31    for (Object arg : args) {
    All 6 passes — pass 1 is the card above
    passtemplateresult
    1Hello, {}!Hello, {}!
    2{} + {} = {}{} + {} = {}
    3User {} logged in from {}User {} logged in from {}
    4User {} completed task {}User {} completed task {}
    5Failed after {} retriesFailed after {} retries
    6Processing {} items from {}Processing {} items from {}
  3. result ← Hello, World!

    pass 1 of 11
    30String result = template;31for (Object argWorld : args) {32    // Replace first {} with next argument33    result→ Hello, World! = result.replaceFirst("\\{\\}", String.valueOf(argWorld));34}
    All 11 passes — pass 1 is the card above
    passargresult
    1WorldHello, World!
    21010 + {} = {}
    32010 + 20 = {}
    43010 + 20 = 30
    5aliceUser alice logged in from {}
    6192.168.1.1User alice logged in from 192.168.1.1
    7BobUser Bob completed task {}
    8cleanupUser Bob completed task cleanup
    93Failed after 3 retries
    10100Processing 100 items from {}
    11queue-1Processing 100 items from queue-1
  4. return result;

    34    }35    return resultHello, World!;36}
  5. msg1 ← Hello, World!

    12// Our custom simpleFormat13String msg1→ Hello, World! = simpleFormat("Hello, {}!", "World");14System.out.println(msg1Hello, World!);1516String msg2 = simpleFormat("{} + {} = {}", 10, 20, 30);17System.out.println(msg2);
    outputHello, World!
  6. return result;

    34    }35    return result10 + 20 = 30;36}
  7. msg2 ← 10 + 20 = 30

    16String msg2→ 10 + 20 = 30 = simpleFormat("{} + {} = {}", 10, 20, 30);17System.out.println(msg210 + 20 = 30);1819String msg3 = simpleFormat("User {} logged in from {}", "alice", "192.168.1.1");20System.out.println(msg3);
    output10 + 20 = 30
  8. return result;

    34    }35    return resultUser alice logged in from 192.168.1.1;36}
  9. msg3 ← User alice logged in from 192.168.1.1

    19String msg3→ User alice logged in from 192.168.1.1 = simpleFormat("User {} logged in from {}", "alice", "192.168.1.1");20System.out.println(msg3User alice logged in from 192.168.1.1);2122System.out.println("\n=== Logging with Format ===");  //?logging23logf("INFO", "User {} completed task {}", "Bob", "cleanup");24logf("ERROR", "Failed after {} retries", 3);
    outputUser alice logged in from 192.168.1.1
    
    === Logging with Format ===
  10. static void logf(String level, String template, Object... args)

    pass 1 of 3
    38// Logging with formatting  //?logformat39static void logf(String levelINFO, String templateUser {} completed task {}, Object... args) {40    String message = simpleFormat(templateUser {} completed task {}, args);41    System.out.println("[" + level + "] " + message);
    All 3 passes — pass 1 is the card above
    passleveltemplate
    1INFOUser {} completed task {}
    2ERRORFailed after {} retries
    3DEBUGProcessing {} items from {}
  11. return result;

    34    }35    return resultUser Bob completed task cleanup;36}
  12. message ← User Bob completed task cleanup

    22    System.out.println("\n=== Logging with Format ===");  //?logging23    logf("INFO", "User {} completed task {}", "Bob", "cleanup");24    logf("ERROR", "Failed after {} retries", 3);25    logf("DEBUG", "Processing {} items from {}", 100, "queue-1");26}2728// Custom format function like SLF4J  //?simpleformat29static String simpleFormat(String template, Object... args) {30    String result = template;31    for (Object arg : args) {32        // Replace first {} with next argument33        result = result.replaceFirst("\\{\\}", String.valueOf(arg));34    }35    return result;36}3738// Logging with formatting  //?logformat39static void logf(String level, String template, Object... args) {40    String message→ User Bob completed task cleanup = simpleFormat(templateUser {} completed task {}, args);41    System.out.println("[" + levelINFO + "] " + messageUser Bob completed task cleanup);42}
    output[INFO] User Bob completed task cleanup
  13. return result;

    34    }35    return resultFailed after 3 retries;36}
  14. message ← Failed after 3 retries

    23    logf("INFO", "User {} completed task {}", "Bob", "cleanup");24    logf("ERROR", "Failed after {} retries", 3);25    logf("DEBUG", "Processing {} items from {}", 100, "queue-1");26}2728// Custom format function like SLF4J  //?simpleformat29static String simpleFormat(String template, Object... args) {30    String result = template;31    for (Object arg : args) {32        // Replace first {} with next argument33        result = result.replaceFirst("\\{\\}", String.valueOf(arg));34    }35    return result;36}3738// Logging with formatting  //?logformat39static void logf(String level, String template, Object... args) {40    String message→ Failed after 3 retries = simpleFormat(templateFailed after {} retries, args);41    System.out.println("[" + levelERROR + "] " + messageFailed after 3 retries);42}
    output[ERROR] Failed after 3 retries
  15. return result;

    34    }35    return resultProcessing 100 items from queue-1;36}
  16. message ← Processing 100 items from queue-1

    24    logf("ERROR", "Failed after {} retries", 3);25    logf("DEBUG", "Processing {} items from {}", 100, "queue-1");26}2728// Custom format function like SLF4J  //?simpleformat29static String simpleFormat(String template, Object... args) {30    String result = template;31    for (Object arg : args) {32        // Replace first {} with next argument33        result = result.replaceFirst("\\{\\}", String.valueOf(arg));34    }35    return result;36}3738// Logging with formatting  //?logformat39static void logf(String level, String template, Object... args) {40    String message→ Processing 100 items from queue-1 = simpleFormat(templateProcessing {} items from {}, args);41    System.out.println("[" + levelDEBUG + "] " + messageProcessing 100 items from queue-1);42}
    output[DEBUG] Processing 100 items from queue-1

String.format() and printf() use varargs for their flexible APIs.

Pass an array to varargs

Arrays can be passed directly to varargs methods.

ArrayVsVarargs.java
Replay: real traced execution (multi-file project)
import java.util.Arrays;

public class ArrayVsVarargs {
    public static void main(String[] args) {
        System.out.println("=== Arrays and Varargs ===\n");

        // Call with individual arguments (normal varargs)
        printItems("apple", "banana", "cherry");

        // Call with existing array
        String[] fruits = {"orange", "grape", "mango"};
        printItems(fruits);  // Array passed directly!

        System.out.println("\n=== Creating Arrays ===");

        // Traditional array creation
        int[] arr1 = new int[]{1, 2, 3};

        // Using varargs-based method
        int[] arr2 = createArray(4, 5, 6);

        System.out.println("arr1: " + Arrays.toString(arr1));
        System.out.println("arr2: " + Arrays.toString(arr2));

        System.out.println("\n=== Arrays.asList (varargs) ===");
        var list = Arrays.asList("x", "y", "z");
        System.out.println("List: " + list);

        // Also works with array
        String[] letters = {"a", "b", "c"};
        var list2 = Arrays.asList(letters);
        System.out.println("List from array: " + list2);
    }

    static void printItems(String... items) {
        System.out.println("Received " + items.length + " items:");
        for (String item : items) {
            System.out.println("  - " + item);
        }
    }

    // Return array from varargs
    static int[] createArray(int... values) {
        return values;  // values IS the array!
    }
}
  1. public static void main(String[] args)

    3public class ArrayVsVarargs {4    public static void main(String[] args) {5        System.out.println("=== Arrays and Varargs ===\n");6        7        // Call with individual arguments (normal varargs)  //?individual8        printItems("apple", "banana", "cherry");
    output=== Arrays and Varargs ===
  2. static void printItems(String... items)

    pass 1 of 2
    35static void printItems(String... items) {  //?method36    System.out.println("Received " + items.length3 + " items:");37    for (String item : items) {
    outputReceived 3 items:
  3. for (String item : items)

    pass 1 of 6
    36System.out.println("Received " + items.length + " items:");37for (String itemapple : items) {38    System.out.println("  - " + itemapple);39}
    output  - apple
    All 6 passes — pass 1 is the card above
    passitemitems.length
    1apple
    2banana
    3cherry3
    4orange
    5grape
    6mango
  4. static void printItems(String... items)

    pass 2 of 2
    35static void printItems(String... items) {  //?method36    System.out.println("Received " + items.length3 + " items:");37    for (String item : items) {
    outputReceived 3 items:
  5. static int[] createArray(int... values)

    42// Return array from varargs43static int[] createArray(int... values) {  //?return44    return values;  // values IS the array!45}
  6. list ← [x, y, z], list2 ← [a, b, c]

    19    // Using varargs-based method20    int[] arr2 = createArray(4, 5, 6);  //?helper21    22    System.out.println("arr1: " + Arrays.toString(arr1));23    System.out.println("arr2: " + Arrays.toString(arr2));24    25    System.out.println("\n=== Arrays.asList (varargs) ===");  //?aslist26    var list→ [x, y, z] = Arrays.asList("x", "y", "z");27    System.out.println("List: " + list[x, y, z]);28    29    // Also works with array30    String[] letters = {"a", "b", "c"};31    var list2→ [a, b, c] = Arrays.asList(letters);32    System.out.println("List from array: " + list2[a, b, c]);33}
    outputarr1: [1, 2, 3]
    arr2: [4, 5, 6]
    
    === Arrays.asList (varargs) ===
    List: [x, y, z]
    List from array: [a, b, c]

Varargs and arrays are interchangeable at the call site.

Exercise: VarargsOverload.java

Explore overloading ambiguity with varargs