다음과 같은 코드가 있을 때 인스턴스 a와 b는 같은 결과를 가져온다.
A a = new A(1);
A b = a;
b.id = 2;
인스턴스가 생성될 때 인스턴스 변수에는 값 이 저장되는 게 아니라 값이 저장되어 있는 위치 가 저장된다. 따라서 위 코드를 보았을 때, 인스턴스 a 는 A(1)에 대한 값이 저장되어 있는 저장소의 위치를 저장한다.
인스턴스 b 변수 또한 a 와 같다고 했기에 a 에 저장되어 있던 A(1)의 값이 저장되어 있는 저장소 위치를 저장하게 되는 것이다. 그림으로 표현하자면 아래와 같다.

a 라는 인스턴스와 b라는 인스턴스는 둘 다 new A()로 생성된 값이 저장되어 있는 위치를 가리키고 있는데 이를 참조 하고 있다고 한다.
복제는 말 그대로 값을 복사 붙여넣기 한다. 복제의 예시 코드는 아래와 같으며 결과는 다음과 같다.
int a = 1;
int b = a;

생활코딩의 Java 강의를 참고하였습니다.