Juste mes deux centimes 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 commodité semble être la clé ici. En fait, une visibilité privée au niveau de l'objet aurait obligé à exposer les méthodes à d'autres classes (par exemple dans le même paquet) dans le scénario illustré par le PO.
En vérité, je n'ai pu ni concocter ni trouver un exemple montrant que la visibilité au niveau classe-privée (comme celle offerte par Java) crée des problèmes si on la compare à la visibilité au niveau objet-privé.
Cela dit, les langages de programmation dotés d'un système plus fin de politiques de visibilité peuvent permettre la visibilité des objets au niveau des objets et des classes.
Par exemple Eiffel offre une exportation sélective : vous pouvez exporter n'importe quelle fonctionnalité de classe vers n'importe quelle classe de votre choix, de {NONE} (objet-privé) à {ANY} (équivalent de public, un objet de classe). (objet-privé) à {ANY} (l'équivalent de public, et aussi la valeur par défaut), à {PERSON} (classe-privée, voir l'exemple du PO), à des groupes spécifiques de classes {PERSON, BANQUE}.
Il est également intéressant de noter qu'en Eiffel, il n'est pas nécessaire de rendre un attribut privé et d'écrire un getter pour empêcher les autres classes de l'affecter. Les attributs publics en Eiffel sont par défaut accessibles en lecture seule, vous n'avez donc pas besoin d'un getter pour retourner leur valeur.
Bien sûr, vous avez toujours besoin d'un setter pour définir un attribut, mais vous pouvez le cacher en le définissant comme "assigner" pour cet attribut. Cela vous permet, si vous le souhaitez, d'utiliser l'opérateur d'affectation, plus pratique, au lieu de l'invocation du setter.