为什么我能够从在同一对象的另一个实例上调用的方法访问一个实例的私有实例变量?

时间:2015-05-18 07:30:21

标签: java oop inheritance polymorphism modifier

在下面的代码中:

 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上调用方法“invoke”并将p2作为参数传递时,我能够直接在实例p1上调用的invoke方法中访问p2的私有实例变量。为什么这不会引发编译时错误?尽管p2是Person类的一个实例,但是该方法是在p1而不是p2上调用的,因此只能直接访问p1的私有变量。请澄清。

1 个答案:

答案 0 :(得分:2)

  

当我在实例p1上调用方法“invoke”并将p2作为参数传递时,我能够直接在实例p1上调用的invoke方法中访问p2的私有实例变量。为什么这不会引发编译时错误?

因为这不是错误。 namePerson类的私有,而不是该类的特定实例。没有每个实例的隐私。 Java的访问控制涉及代码所属的类(以及扩展名,包),而不是调用它的实例。