为啥我能够从在同一对象的另一个实例上调用的方法访问一个实例的私有实例变量? [复制]

Posted

技术标签:

【中文标题】为啥我能够从在同一对象的另一个实例上调用的方法访问一个实例的私有实例变量? [复制]【英文标题】:Why am I able to access a private instance variable of one instance from a method invoked on another instance of the same object? [duplicate]为什么我能够从在同一对象的另一个实例上调用的方法访问一个实例的私有实例变量? [复制] 【发布时间】:2015-05-18 07:30:21 【问题描述】:

在下面的代码中:

 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 上调用的调用方法内访问 p2 的私有实例变量。为什么这不会引发编译时错误?尽管 p2 是 Person 类的一个实例,但该方法是在 p1 而不是 p2 上调用的,因此,只有 p1 的私有变量应该可以直接访问。请澄清。

【问题讨论】:

寻求帮助时,请花时间合理地格式化您的代码。 【参考方案1】:

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

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

【讨论】:

以上是关于为啥我能够从在同一对象的另一个实例上调用的方法访问一个实例的私有实例变量? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

为啥同一类而不是同一对象可以访问受保护和私有属性?

在 PHP 中,为啥可以在同一类类型的方法中创建的新实例上调用私有方法? [复制]

Java:直接从同一类的另一个实例访问私有字段

将 Ansible 变量从一个角色(在一个主机上运行)传递给在同一剧本中的另一台主机上运行的另一个角色

JAVA:为啥我不能访问同一个类中的方法?

使用反射从同一类型的另一个实例复制所有对象值