虽然这是一个非常基本的代码,但似乎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并成功!为什么私有被视为私有?
我在拉我的头发......
任何人,请回复......
答案 0 :(得分:17)
是的,main方法属于A类,但它不是在“this”引用的上下文中从当前对象内部访问private方法。
那没关系。这不是Java使用的可访问性模型。重要的是编写代码的类,而不是它是否访问同一对象中的成员。
这非常有用,否则(例如)使用两个类的私有成员实现equals
方法是不可能的。
这可能不是您选择指定语言的方式,但 是如何指定Java的。有关辅助功能的详细信息,请参阅JLS 6.6.1。特别是:
否则,如果成员或构造函数被声明为private,则当且仅当它发生在包含成员或构造函数声明的顶级类(第7.6节)的主体内时才允许访问。
请注意protected
访问权限略微奇怪 - 类SuperClass
的受保护实例成员只能通过SubClass
中的代码在SubClass
中的代码中访问{{1}}或另一个子类。但它仍然不一定是“相同”的对象。
答案 1 :(得分:7)
声明为private的方法,变量和构造函数只能在声明的类本身中访问。
答案 2 :(得分:5)
private
表示“私人上课”。不是“实例私有”。
允许实现调用私有构造函数的静态工厂方法,或者比较同一类对象的私有字段或复制构造函数等的equals()
或compareTo()
方法。
封闭类的私有成员也可以从这个封闭类的内部类访问,反之亦然。
答案 3 :(得分:2)
在技术上正确的答案之后,我的两分钱为什么我认为以这种方式实施private
是非常合理的:
我认为private
方法和属性存在的主要原因是“实现隐藏”。你宣称“不要在课堂外使用这种方法(!),因为它可能随时改变或消失”。所以禁止从课外访问是有意义的。但是如果我从同一个类的另一个对象访问它并进行任何实现更改,我很清楚私有成员的更改和访问,并且可以采取相应的行动。
要考虑的另一件事:
如果B类扩展了A类,那么任何B对象也是A对象,但它不能访问私有A方法。如果私有方法是对象的私有方法,那为什么会这样?