Причина, по которой оба экземпляра класса `Packet` ссылаются на один и тот же адрес объекта `Integer`, связана с тем, как работают неизменяемые объекты в Java, в частности, объекты класса `Integer`. Когда вы создаете экземпляр `Integer` с определенным значением, Java кэширует объекты для целых чисел в диапазоне от -128 до 127. Таким образом, если два экземпляра `Integer` имеют одно и то же значение в этом диапазоне, оба экземпляра будут ссылаться на один и тот же объект.
Для создания нового экземпляра `Integer` при каждом создании объекта `Packet`, вы можете использовать конструктор `Integer`, который создает новый объект, или явно указать, что хотите создать новый объект. Ниже приведен пример, как это можно сделать:
```java
public class Packet {
private Integer value;
public Packet(Integer value) {
// Создаем новый объект Integer, чтобы избежать ссылки на один и тот же объект
this.value = new Integer(value);
}
public Integer getValue() {
return value;
}
}
// Пример использования
public class Main {
public static void main(String[] args) {
Packet packet1 = new Packet(100);
Packet packet2 = new Packet(100);
System.out.println(packet1.getValue() == packet2.getValue()); // true - значение одинаковое
System.out.println(packet1.getValue() == packet1.getValue()); // true - это один и тот же объект
System.out.println(packet1.getValue().equals(packet2.getValue())); // true - значения равны
}
}
```
В этом примере мы используем новый экземпляр `Integer` в конструкторе класса `Packet`, что приводит к созданию нового объекта для каждого `Packet`. В итоге, даже если мы передаем одно и то же значение, экземпляры `packet1` и `packet2` будут ссылаться на разные объекты `Integer`.
Однако стоит отметить, что создание новых объектов `Integer` не так часто необходимо на практике, так как использование структуры `Integer` предполагает оптимизацию через кэширование, и это может приводить к ненужным накладным расходам на память.