为什么可以从不同的实例访问“私有”方法?

虽然这是一个非常基本的代码,但似乎Java中存在一些根本性的缺陷,或者我用来运行代码的Eclipse IDE使用的JVM。

代码运行即使它不应该(我认为)! A.java中的代码只显示“你好,我是A!”

这里是:

import java.lang.*; import java.util.*; class A { private void methodA() {System.out.println("Hello, I am A!");} public static void main(String[] args) { A a = new A(); a.methodA(); } } 

我不明白为什么在创建类A的实例后,main()成功地在该实例上运行类A的私有方法。 是的,main方法属于A类,但它不是在“this”引用的上下文中从当前对象内部访问private方法。 实际上,由于它是静态方法,因此无法从类中访问非静态成员。 而不是main(),非静态成员方法只能从内部调用methodA()。 但这是另一个问题,因为我没有定义任何非静态的第二种方法。

现在谈到内部视图 ,让我们回到关键点,即外部视图 。 如您所见,main()尝试从对象外部调用methodA并成功! 为什么私人不被视为私人

我在拉我的头发….

有人,请回复……

是的,main方法属于A类,但它不是在“this”引用的上下文中从当前对象内部访问private方法。

那没关系。 这不是Java使用的可访问性模型。 重要的是编写代码的类,而不是它是否访问同一对象中的成员。

这非常有用,否则(例如)使用两个类的私有成员实现equals方法是不可能的。

这可能不是您选择指定语言的方式,但它是指定Java的方式。 有关可访问性的详细信息,请参阅JLS 6.6.1 。 尤其是:

否则,如果成员或构造函数被声明为private,则当且仅当它发生在包含成员或构造函数声明的顶级类(第7.6节)的主体内时才允许访问。

请注意, protected访问在这里有点奇怪 – 类SuperClass的受保护实例成员只能通过SubClass或其他子类的表达式在SubClass中的代码中访问。 但它仍然不一定是“相同”的对象。

私人改造者

声明为private的方法,变量和构造函数只能在声明的类本身中访问。

private意味着“私人上课”。 不是“私有的实例”。

这就是允许实现调用私有构造函数的静态工厂方法,或者比较同一类的对象的私有字段或复制构造函数等的equals()compareTo()方法。

封闭类的私有成员也可以从这个封闭类的内部类访问,反之亦然。

在技​​术上正确的答案之后我的两分钱为什么我认为以这种方式实现private是非常合理的:

我认为private方法和属性存在的主要原因是“实现隐藏”。 你宣称“不要在课堂外使用这种方法(!),因为它可能随时改变或消失”。 所以禁止从课外访问是有意义的。 但是,如果我从同一个类的另一个对象访问它并进行任何实现更改,我很清楚私有成员的更改和访问,并可以采取相应的行动。

另一件需要考虑的事情:

如果B类扩展了A类,那么任何B对象也是A对象,但是它不能访问私有A方法。 如果私有方法对于对象是私有的,为什么会这样呢?