Victor Leung
Victor Leung
BlogAI SolutionAlphaAlgoFlower shopFX CombineIEESushi ClassifierWealth Agile

Java: Variables are Always Passed by Copy

March 14, 2015

I am learning Java. One of the important concepts to understand is whether arguments of a function is passing by copy or reference. Passing by copy means when a variable is passed to a function, a copy is made. Passing by reference means when a variable is passed to a function, the code in the function operates on the original variable.

In Java, variables are always passed by copy. Here are three scenarios:

Case 1: Passing Primitives

void incrementValue(int inFunction){
  inFunction ++;
  System.out.printIn("In function: " + inFunction);
}

int original = 10;
System.out.printIn("Original before: " + original); incrementValue(original);
System.out.printIn("Original after: " + original);

And the result is:

Original before: 10
In Function: 11
Original after: 10

The original value didn’t change.

Case 2: Passing primitives wrapped in objects

    void incrementValue(int[] inFunction){
      inFunction[0] ++;
      System.out.printIn("In function: " + inFunction[0]);
    }

    int[] arOriginal = {10, 20, 30};
    System.out.println("Original before: " + original[0]); incrementValue(original);
    System.out.println("Original after: " + original[0]);

And the result is:

    Original before: 10
    In function: 11
    Original after: 11

The original value did change! This is because complex object variables are references. A reference variable points to a location in memory. When a variable is passed to a function, a new refernce is always created. Both references point to the original objects or values.

    int[] origial = {10, 20, 30}

    original[0] --> | 10 | <-- inFunction[0]
                    | 20 |
                    | 30 |

Both array elements point to the same memory location

Case 3: Passing Strings

    void changeString(String inFunction){
      inFunction = "New!";
      System.out.println("In function: " + inFunction);
    }

    String original = "Original!";
    System.out.println("Original before: " + original); changeString(original);
    System.out.println("Original after: " + original);

The result is:

    Original before: Original!
    In function: New!
    Original after: Original!

Remember, strings are immutable. A copy of the entire String is created when passed to a function.


About Victor Leung

Software development professional with expertise in application architecture, cloud solutions deployment, and financial products development. Possess a Master's degree in Computer Science and an MBA in Finance. Highly skilled in AWS (Certified Solutions Architect, Developer and SysOps Administrator), GCP (Professional Cloud Architect), Microsoft Azure, Kubernetes(CKA, CKAD, CKS, KCNA), and Scrum(PSM, PSPO) methodologies.

Happy to connect
LinkedIn
Github
Twitter
@victorleungtw

Continuous improvement

Copyright © victorleungtw.com 2023.