gpt4 book ai didi

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

转载 作者:搜寻专家 更新时间:2023-10-30 20:59:14 25 4
gpt4 key购买 nike

尽管这是一个非常基本的代码,但似乎 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com