From JavaProgramming ''About passing arguments to methods in Java, which is very different from C++'' Default values for method arguments as we know and love from C++ are not allowed. A new method has to be declared for every method signature: /* T''''''estDefaultConstructor.java */ public class T''''''estDefaultConstructor { private int i; private String s; // public T''''''estDefaultConstructor(String arg = "") { // Not allowed public T''''''estDefaultConstructor() { i = 0; System.out.println("T''''''estDefaultConstructor()"); } public T''''''estDefaultConstructor(String arg) {// "Overloaded" constructor this(); // Call default constructor s = arg; System.out.println("T''''''estDefaultConstructor\(\" + arg + \"\)"); } public static void main(String[] args) { T''''''estDefaultConstructor obj = new T''''''estDefaultConstructor("abc"); // output: T''''''estDefaultConstructor() // T''''''estDefaultConstructor(abc) } } Method arguments are allways called by value. Calling by reference is not possible for basic data types such as integer. In order to call by reference, variables of basic data types must be wrapped within an object: /* T''''''estMethodCall.java */ class Wrapper { public int i; public Wrapper(int n) { i = n; } } public class T''''''estMethodCall { public static void inc(int i) { i++; } // Primitive types is call by value public static void inc(Wrapper w) { w.i++; } // Argument is an object reference public static void main(String[] args) { int i = 1; inc(i); System.out.println(i); // Output: 1, i is only modified locally Wrapper w = new Wrapper(i); inc(w); System.out.println(w.i); // Output: 2, Wrapper object is modified } }