Объекты передаются значением [ reference , где значением является ссылка ] (вещи, которые наследуются от Object), примитивные значения (int, long, double и т. Д.) передается по значению.
Это означает, что когда примитив передается из вызывающего в метод, он копируется, тогда как с объектом передается [ значение ссылки ].
Что, в свою очередь, означает, что когда объект мутирует методом, вызывающая сторона видит эти изменения, потому что у него есть ссылка на тот же объект.
И наоборот, когда метод мутирует примитив, вызывающая сторона не видит изменений, так как метод работает с копией.
[причина правок]
Если бы Java передавалась по ссылке, вы могли бы сделать это:
Object x;
x = new Integer(42);
foo(x);
System.out.println(x.getClass()); // pass by reference would have it print out java.lang.Float
где foo определяется как:
void foo(Object o)
{
o = new Float(43);
}
Поскольку Java передает ссылку по значению, o = new Float(43);
разрешено - но значение в вызывающей стороне останется как new Integer(42);