I like the explanation when taking into consideration threads. If you made your fields public, how is your instance going to know when a certain thread changed one of its fields?
The only way to do it would be with encapsulation, or simpler put give getters and setters to that field, thus you always know and can check/react to fields updates, for example.