Every Object is a reference, every primitive is a value. Arrays and Strings are objects.
Whenever you have an instance of an Object, any fields that “hold” that object are just references to the same Object in memory.
MyObject o = new MyObject();
MyObject o2 = o;
MyObject o3 = o;
MyObject o4 = o3;
MyObject o5 = o;
MyObject o6 = o2;
MyObject o7 = o;
MyObject o8 = o7;
What’s being copied when you set those equal is the address of the original MyObject you created, not the object itself. Think of it that you aren’t ever creating any new object unless you say “new” or you call a method that returns a new object (like clone()). In the latter case, the method is going to be calling new somewhere anyway.