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

sof*_*ver 12 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(); }   
} 
Run Code Online (Sandbox Code Playgroud)

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

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

我在拉我的头发....

有人,请回复......

Jon*_*eet 17

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

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

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

这可能不是你会如何选择指定的语言,但它如何被指定的Java.有关可访问性的详细信息,请参阅JLS 6.6.1.特别是:

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

注意,protected访问是略微奇数此处-类的一个受保护的实例构件SuperClass只能内码在访问的SubClass通过的任一种表达SubClass或另外的子类.但它仍然不一定是"相同"的对象.

  • @Moslem:是的.存在一些差异,但基本原则是相同的. (3认同)

Nam*_*mbi 7

私人修改者

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

  • [链接到文档会很棒!](http://docs.oracle.com/javase/tutorial/java/javaOO/accesscontrol.html). (3认同)

JB *_*zet 5

private意思是"私人上课".不是"私有的实例".

那是什么让像静态工厂方法实现的东西调用私有构造函数,或equals()compareTo()方法比较同一类对象的私有字段,或拷贝构造函数等.

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