В Java есть два основных типа в JVM . 1) примитивные типы и 2) ссылочные типы. int является примитивным типом, а Integer является типом класса (который является типом ссылочного типа).
Примитивные значения не разделяют состояние с другими примитивными значениями. Переменная, тип которой является примитивным типом, всегда содержит примитивное значение этого типа.
int aNumber = 4;
int anotherNum = aNumber;
aNumber += 6;
System.out.println(anotherNum); // Prints 4
Объект - это динамически создаваемый экземпляр класса или массив. Ссылочные значения (часто просто ссылки) являются указателями на эти объекты и специальной нулевой ссылкой, которая не ссылается ни на один объект. На один и тот же объект может быть много ссылок.
Integer aNumber = Integer.valueOf(4);
Integer anotherNumber = aNumber; // anotherNumber references the
// same object as aNumber
Также в Java все передается по значению. Для объектов передаваемое значение является ссылкой на объект. Итак, еще одно различие между int и Integer в Java заключается в том, как они передаются в вызовах методов. Например, в
public int add(int a, int b) {
return a + b;
}
final int two = 2;
int sum = add(1, two);
Переменная two передается как примитивный целочисленный тип 2. Тогда как в
public int add(Integer a, Integer b) {
return a.intValue() + b.intValue();
}
final Integer two = Integer.valueOf(2);
int sum = add(Integer.valueOf(1), two);
Переменная two передается как ссылка на объект, который содержит целочисленное значение 2.
@ WolfmanDragon:
Передача по ссылке будет работать так:
public void increment(int x) {
x = x + 1;
}
int a = 1;
increment(a);
// a is now 2
Когда вызывается приращение, он передает ссылку (указатель) на переменную a . А функция increment напрямую изменяет переменную a .
А для типов объектов это будет работать следующим образом:
public void increment(Integer x) {
x = Integer.valueOf(x.intValue() + 1);
}
Integer a = Integer.valueOf(1);
increment(a);
// a is now 2
Вы видите разницу сейчас?