虽然这是一个非常基本的代码,但似乎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或另外的子类.但它仍然不一定是"相同"的对象.
private意思是"私人上课".不是"私有的实例".
那是什么让像静态工厂方法实现的东西调用私有构造函数,或equals()或compareTo()方法比较同一类对象的私有字段,或拷贝构造函数等.
封闭类的私有成员也可以从这个封闭类的内部类访问,反之亦然.