Почему я могу получить доступ к частной переменной экземпляра одного экземпляра из метода, вызванного в другом экземпляре того же объекта?

В приведенном ниже коде:

 class Person {
    private String name;
    private int x = 5;
    public Person(String name) {
        this.name = name;
    }
    public void invoke(Person p) {
        System.out.println(p.name);
    }
}
class YU {
    public static void main(String args[]) {
        Person p1 = new Person("P1");
        Person p2 = new Person("P2");
        p1.invoke(p2);
    }
}

Когда я вызываю метод «вызов» для экземпляра p1 и передаю p2 в качестве аргумента, я могу получить доступ к частной переменной экземпляра p2 непосредственно внутри метода вызова, который был вызван для экземпляра p1. Почему это не вызывает ошибку времени компиляции? Несмотря на то, что p2 является экземпляром класса Person, метод вызывается для p1, а не для p2, и, следовательно, только частные переменные p1 должны быть доступны напрямую. Просьба уточнить.


person paidedly    schedule 18.05.2015    source источник
comment
Обращаясь за помощью, потратьте время на разумное форматирование кода.   -  person T.J. Crowder    schedule 18.05.2015


Ответы (1)


Когда я вызываю метод «вызов» для экземпляра p1 и передаю p2 в качестве аргумента, я могу получить доступ к частной переменной экземпляра p2 непосредственно внутри метода вызова, который был вызван для экземпляра p1. Почему это не вызывает ошибку времени компиляции?

Потому что это не ошибка. name принадлежит классу Person, а не конкретному экземпляру класса. Конфиденциальность для каждого экземпляра отсутствует. Управление доступом в Java связано с тем, частью какого класса (и, соответственно, пакета) является код, а не с тем, к какому экземпляру он был вызван.

person T.J. Crowder    schedule 18.05.2015