我不应该能够调用实例化对象的私有方法。我想知道为什么下面的代码有效。
public class SimpleApp2 {
/**
* @param args
*/
private int var1;
public static void main(String[] args) {
SimpleApp2 s = new SimpleApp2();
s.method1(); // interesting?!
}
private void method1() {
System.out.println("this is method1");
this.method2(); // this is ok
SimpleApp2 s2 = new SimpleApp2();
s2.method2(); // interesting?!
System.out.println(s2.var1); // interesting?!
}
private void method2() {
this.var1 = 10;
System.out.println("this is method2");
}
}
我知道可以从类中访问私有方法。但是,如果类中的方法实例化同一个类的对象,那么范围规则是否应该应用于该实例化对象?
像main这样的静态方法可以访问该类的非静态成员吗?如本例所示?
答案 0 :(得分:11)
您的main
方法是SimpleApp
的方法,因此可以调用SimpleApp
的私有方法。
仅仅因为它是一个static
方法并不会阻止它在public
,private
等方面表现得像一个方法。private
只会阻止其他类来访问SimpleApp
的方法。
答案 1 :(得分:3)
因为main
也是SimpleApp
的成员。
答案 2 :(得分:2)
答案 3 :(得分:2)
private
意味着“只有这个课程中的东西可以乱用它”。它不意味着“只有这个实例可以调用它的方法”,这似乎是你所期待的。 SimpleApp
中的任何代码都可以使用任何SimpleApp
中的任何内容。另一种方法是打破封装 - 例如,如果不需要访问另一个实例的字段,而不创建那些字段equals
甚至{{1},您将如何制作正确的protected
方法或者要求获取只能在类中可用的数据的getter?
答案 4 :(得分:2)
见下图
访问修饰符
**Same Class Same Package Subclass Other packages**
**public** Y Y Y Y
**protected** Y Y Y N
**no access modifier** Y Y N N
**private** Y N N N
由于您的方法在车内,因此可以根据上述拇指规则进行操作。
答案 5 :(得分:0)
答案 6 :(得分:0)
您发出的呼叫来自私有方法所在的同一个类。这是允许的。这就是在java中定义'private'的方式。
答案 7 :(得分:0)
在程序中,我们使用了两个私有方法创建了类的两个实例。看到这个工作的一个有趣之处在于,这是我们使用对象引用在类之外调用公共或默认方法的方式。在这种情况下,它都在类定义中完成,因此它是有效的。放在类外的相同代码将导致错误。