java - 为什么可以从不同的实例访问 "private"方法?

标签 java private

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

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

我在拉头发....

任何人,请回复...

最佳答案

Yes, the main method belongs to class A, but it is not accessing the private method from inside the current object in the context of the "this" reference.

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

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

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

Otherwise, if the member or constructor is declared private, then access is permitted if and only if it occurs within the body of the top level class (§7.6) that encloses the declaration of the member or constructor.

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

关于java - 为什么可以从不同的实例访问 "private"方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21900632/

相关文章:

java - Android 无法完成 Activity

java - 关于字段的私有(private)静态最终关键字的快速 Java 问题

java - java中如何使用Socket处理多个连接

java - HttpURLConnection.getResponseCode() 在第二次调用时返回 -1

kotlin - 如何从 Kotlin 中的类外部调用类的私有(private)函数

networking - 如何通过网络在私有(private)应用程序之间进行私有(private)通信?

c++ - 有 friend 看基类吗?

c# - 为什么明确写 "private"?

java - android从内存加载选项卡图标

java - 基于 JSON 对象创建 HashMap