ReviseAlgo Logo

Methods

Method Parameters

Demystify Java's strict Pass-By-Value model for primitives and object references, Varargs, and SafeVarargs warnings.

Interview: Tests parameter reassignments vs mutations, varargs array conversions, heap pollution, and memory frame tracking.

Last Updated: June 13, 2026 10 min read

Java uses a strict Pass-by-Value evaluation model for all parameter values. For primitive types, the actual value is copied. For object references, the value of the reference (the heap memory address) is copied, leading to specific behavioral results when values are modified inside methods.

Core Idea

Java is strictly pass-by-value. Methods receive copies of primitives or copies of reference addresses, never pointers to the variables themselves.

Why It Matters

Modifying fields on a passed reference mutates the original object on the heap, whereas reassigning the parameter variable has no effect outside the method.

Interview Lens

Expect swap-value trick questions, varargs compiler translations, heap pollution warnings, and @SafeVarargs implementations.

Pass-by-Value: Primitives vs. References

To understand Java parameter passing, distinguish between the type categories:

  • Primitive Parameters: A direct value copy (e.g. a copy of 5 or false) is passed into the method's local variable. Modifying this local copy has no effect on the caller's original variable.
  • Object Reference Parameters: The value of the reference variable (which is a memory address pointing to the object on the heap) is copied. When you invoke a method, both the caller's variable and the method's local parameter variable contain copies of the same address. Thus:
    • Mutating fields: Calling setter methods or modifying public fields (e.g., param.value = 10;) changes the shared heap object. The caller will see the changes.
    • Reassigning the reference: Reassigning the parameter to a new object (e.g., param = new Object();) only changes the local copy reference. The caller's original reference continues pointing to the original heap object.

Variable Arguments (Varargs)

Introduced in Java 5, Varargs (variable arguments) allows a method to accept zero or more arguments of a specified type.

  • The syntax uses three dots: type... parameterName.
  • Under the hood, the compiler translates varargs into a standard array (e.g., int... becomes int[]).
  • Restrictions: A method can have only one varargs parameter, and it must be the last parameter in the method signature.

Heap Pollution and @SafeVarargs: When using varargs with generic/non-reifiable types (e.g., List<String>...), the compiler generates a generic array under the hood. Since arrays do not support runtime generics, this can lead to Heap Pollution. If the method only reads from the varargs array, it is safe, and developers should annotate it with @SafeVarargs to suppress compiler warnings.

Common Pitfalls

  • Assuming Pass-by-Reference: Expecting object swap methods to swap variables in the calling code.
  • Declaring multiple varargs: Writing declarations with multiple varargs fields or putting varargs before other parameters.
  • Mutating objects unintentionally: Accidentally changing reference object fields in a method when you only wanted to check values.

Best Practices

  • Mark parameters as final (e.g. public void process(final User user)) to prevent accidentally reassigning references within the method.
  • Validate inputs at the start of methods (fail-fast rule) using checks like Objects.requireNonNull().
  • Use @SafeVarargs only when the varargs array is not modified or leaked from the method.

Interview-Relevant Information

Q1: Does Java support pass-by-reference?
Answer: No. Java is strictly pass-by-value. For primitive parameters, the value itself is copied. For object parameters, the reference address is copied and passed. Because the pointer value is copied, reassigning the reference variable inside the method does not change the reference outside the method.

Q2: Why does the compiler warn about generic varargs, and how does @SafeVarargs resolve it?
Answer: Varargs are compiled as arrays. Creating an array of non-reifiable generic types (like List<String>[]) is unsafe and can result in heap pollution. If the method body does not modify the array elements or expose the array to external code, it is safe, and @SafeVarargs can be used to suppress compiler warnings.

Quick Checklist

Can you trace heap memory addresses during method calls, predict result parameters of a swap function, define correct varargs signatures, and apply @SafeVarargs annotations safely? If yes, you understand method parameters.

Use Cases

Creating methods that modify mutable state holders safely in pipeline calculations.

Using varargs to simplify log writing interfaces with variable parameters.

Common Mistakes

Expecting reference reassignments inside methods to swap variables in the calling scope.

Modifying reference elements inside generic varargs arrays, leading to heap pollution.