Ring signatures hide the sender
Each input is signed as one of 16 older outputs. The signature proves one of them is being spent without showing which. The ring size is fixed at 16, so every payment looks the same.
Stealth addresses hide the receiver
The sender works out a fresh one-time key for every payment. Your address never goes on the chain, and two payments to you can't be linked.
RingCT hides the amount
Amounts are encrypted. Bulletproofs+ let every node confirm no coins were created from nothing without seeing a number.
Dandelion++ hides where it started
A new payment passes through a few nodes quietly before it spreads, so most nodes can't tell where it came from.