Juste mes 2 cents sur la question de savoir pourquoi la sémantique de la visibilité privée en Java est au niveau de la classe plutôt qu'au niveau de l'objet.
Je dirais que la commodité semble être la clé ici. En fait, une visibilité privée au niveau objet aurait obligé à exposer des méthodes à d'autres classes (par exemple dans le même package) dans le scénario illustré par l'OP.
En vérité, je n'ai pas été en mesure de concocter ni de trouver un exemple montrant que la visibilité au niveau de la classe privée (comme celle offerte par Java) crée des problèmes par rapport à la visibilité au niveau de l'objet privé.
Cela dit, les langages de programmation avec un système plus fin de politiques de visibilité peuvent offrir à la fois une visibilité des objets au niveau de l'objet et au niveau de la classe.
Par exemple Eiffel , propose une exportation sélective: vous pouvez exporter n'importe quelle caractéristique de classe vers n'importe quelle classe de votre choix, de {NONE} (object-private) à {ANY} (l'équivalent de public, et aussi la valeur par défaut), vers {PERSON} (class-private, voir l'exemple de l'OP), à des groupes spécifiques de classes {PERSON, BANK}.
Il est également intéressant de remarquer que dans Eiffel, vous n'avez pas besoin de rendre un attribut privé et d'écrire un getter pour empêcher d'autres classes de lui attribuer. Les attributs publics dans Eiffel sont par défaut accessibles en mode lecture seule, vous n'avez donc pas besoin d'un getter juste pour renvoyer leur valeur.
Bien sûr, vous avez toujours besoin d'un setter pour définir un attribut, mais vous pouvez le masquer en le définissant comme "assigner" pour cet attribut. Cela vous permet, si vous le souhaitez, d'utiliser l'opérateur d'affectation le plus pratique au lieu de l'invocation du setter.