Literally? Yes, along with the wires and doped silicon.
Data Structure vs. Object
A Data Structure is something your code imposes on a region of memory. While a different region of memory can be passed in, the range of behaviours are not. These are supplied by the reader.
Native data types generally are Data Structures: ints, bools, pointers, even strings (in some languages). Also include basic structures such as tuples, arrays, stack frames, object storage, static storage, etc... There are of course exceptions.
An Object is completely isolated from your code. Object's provide an interface through which your code can communicate with them. That interface is usually pre-agreed data structures known as stack frames, though other techniques might be used, such as datagrams on a network.
By this definition functions are objects, so are instances of class types, or generally anything for which you can actually separate the interface from an implementation. This does mean some basic types are also objects in some languages, such as Java's integer which is both a data structure (unboxed) and an object (boxed).
Objects often require other objects as collaborators. Like good object users they do not care which specific object they collaborate with, simply that they provide a given interface.
Dependency Injection is a technique for provisioning an object with its collaborators.
The question to ask is this: Does my object copy or reference the argument it is passed?
- If it copies, then the argument is being treated as a data-structure.
- It it references, then the argument is being treated as an object.