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

时间:2014-02-20 07:06:30

标签: 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类的私有方法。是的,主要方法属于A类,但它不会在"此" 的上下文中从内部访问当前对象的私有方法参考。实际上,由于它是静态方法,因此无法从类中访问非静态成员。而不是main(),非静态成员方法可以仅从内部调用methodA()。但这是另一个问题,因为我没有定义任何非静态的第二种方法。

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

我在拉我的头发......

任何人,请回复......

4 个答案:

答案 0 :(得分:17)

  

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

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

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

这可能不是您选择指定语言的方式,但 是如何指定Java的。有关辅助功能的详细信息,请参阅JLS 6.6.1。特别是:

  

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

请注意protected访问权限略微奇怪 - 类SuperClass的受保护实例成员只能通过SubClass中的代码在SubClass中的代码中访问{{1}}或另一个子类。但它仍然不一定是“相同”的对象。

答案 1 :(得分:7)

private modifer

  

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

答案 2 :(得分:5)

private表示“私人上课”。不是“实例私有”。

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

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

答案 3 :(得分:2)

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

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

要考虑的另一件事:

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