Just like burner phones, our money will use “disposable addresses” so we never use the same address twice. That way, nobody can see in the public list of transactions how much money was sent to any address, and therefore cannot calculate how much money is in there.
But a problem appears, if we only use the same address once, does that mean we need to remember each time to create a new address to give to anyone we transact to? Even worse, we would need to keep sending that person another new address for every time they want to send to use. Even worse! Since our blockchain is decentralized and permission-less, we have no way to control that our friend really uses a new address of ours every time. he could be lazy, and our entire plan is screwed.
It’s also very cumbersome for our normal life not having a persistent address that doesn’t change, so we can put it somewhere. For example in our profile or website, or in an image asking for donations, or in a QR code to pay for an entrance ticket, etc.
But there’s a very clever way to address both things (see what I did there). Monero uses something called stealth addresses. Literally the best of both worlds: we use public addresses that don’t need to change every time, but every time that address is written on the list to send any amount to it, our app will automatically replace it with a different address, generated by it.
That way, since our addresses are all generated with our secret key, and all stealth addresses are derived from those addresses, only us with our key will know which transactions were meant for us. To everyone else looking at the list, they all look like undistinguishable one-use addresses.
Remember, that means the user won’t have to use a different address every time, and still be private. But it doesn’t mean all privacy angles are covered.