There are two distinct what-geeks-call “data structures” at work here, somewhere in the unfathomable world of C programming; They are called Object and ObjData.
The Object structure contains most of the basic information about an object, but doesn’t contain info such as its location in space. That’s in the ObjData.
When you “create a new object,” one of each of these two data structures is created, and the ObjData “points to” the Object, which “has a reference-count of ‘1’” (because only one ObjData block refers to it).
Mind you, there’s an ambiguity here with respect to that word “Object.” In ordinary human vernacular you simply refer to “a ‘thing’ in space,” waving your hands in front of your face for emphasis. You normally don’t know-about or care-about the duplicity of the internal data-structures. But be aware that if you start trying to engage a computer-programmer in meaningful conversation, [she is going to assume a very precise meaning for the word. Hence my choice of the word, ‘thing.’
"Thing One" ::= <Object (ref. ct=1)>
"Thing Two" ::= <Object (ref. ct=1)>
If you “duplicate (Shift+D) the object,” an exact copy of both of these structures is created, each pair unrelated to the other pair. Both pairs are independent.
Now suppose that you want twenty absolutely-identical “thingys in space,” all of them differing only in where exactly you choose to put each one in space. You can do that with ‘Alt+D.’ When you use this control, you create another ObjData structure only. It is now linked to the same Object structure, which now “has a reference-count of ‘2.’”
"Thing One" ::= <Object (ref. ct=2)>
| ^---------- <ObjData>
"Thing Two" ::= ^------------- <ObjData>
Any change to “thing #1”'s position, or anything else about it that would be reflected only in the ObjData, will affect only it. But any change that would be recorded in the Object structure, like material selections, would instantly affect all the “things” that share it; that, in programmer geek-speek, “reference it.”