Java 为什么“a”可以;“私人”;方法是否可以从其他实例访问?

Java 为什么“a”可以;“私人”;方法是否可以从其他实例访问?,java,private,Java,Private,尽管这是一段非常基本的代码,但Java或者我用来运行代码的EclipseIDE使用的JVM似乎存在一些根本性的缺陷 代码运行,即使它不应该(我认为)!java中的代码只显示“您好,我是一个程序员!” 这是: import java.lang.*; import java.util.*; class A { private void methodA() {System.out.println("Hello, I am A!");} public static v

尽管这是一段非常基本的代码,但Java或者我用来运行代码的EclipseIDE使用的JVM似乎存在一些根本性的缺陷

代码运行,即使它不应该(我认为)!java中的代码只显示“您好,我是一个程序员!”

这是:

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的私有方法。是的,主方法属于类A,但它不是从“this”引用上下文中当前对象的内部访问私有方法。事实上,由于它是一个静态方法,因此无法从类内访问非静态成员。非静态成员方法只能从内部调用methodA(),而不是main()。但这是另一个问题,因为我没有定义任何非静态的第二种方法

既然已经讨论了内部视图,那么让我们回到主题,外部视图。如您所见,main()尝试从对象外部调用methodA,并成功!为什么private没有被视为private

我在拉扯我的头发

任何人,请回复…

声明为私有的方法、变量和构造函数只能在声明的类本身内访问


private
表示“对该类私有”。不是“实例私有的”

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

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

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

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

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

这可能不是您选择指定语言的方式,而是Java的指定方式。有关可访问性的详细信息,请参阅。特别是:

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


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

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

在我看来,
private
方法和属性存在的主要原因是“实现隐藏”。您正在声明“不要在我的类(!)之外使用此方法,因为它可能会在我喜欢的任何时候更改或取消”。因此,禁止从类外访问是有意义的。但是,如果我从同一类的另一个对象访问它,并进行任何实现更改,我很清楚这些更改和私有成员的访问,并且可以相应地采取行动

还有一件事需要考虑:


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

你说的“对象外部”是什么意思?C#也是这样吗?@Moslem:是的。有一些不同,但基本原则是相同的。有没有任何面向对象的语言封装在实例级而不是类级?回答我自己的问题:显然,这就是Smalltalk中的工作方式。