Did you read down to 'Expiration calculations'? What w3 says *is* how the web works, or at least in that ballpark. There's a huge diversity of participants in the WWW and they've all been guilty at some time or another of 'making stuff up' to suit themselves. Heuristics abound to keep the 'lowest common denominator' - a user with a browser - having a reliably consistent experience. There is a lot of advice on the Internet of combinations of headers servers can send with their content, which are conjectured to cause browsers and caches to re-validate (check with the origin server) their caches, but in my experience none of it has ever worked reliably across two or more user-agents. Last time I looked the query-part kludge was the world's favourite way of tricking user-agents into reliably reloading a resource.
This isn't a flaw in Java - or in any web-aware product. It's a feature in HTTP that usually protects servers from vast amounts of spurious cache validation queries and users from annoying lags while their browsers validate recently-loaded content which is almost always still valid. You'll see web devs crying about the same problem when they update their visual themes and clients get a mix of new look and old images and scripts. It's a 'feature' for most Web users and only a flaw for a few Web admins. Welcome to the club!