I should not be able to invoke a private method of an instantiated object. I wonder why the code below works.
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");
}
}
I understand that a private method is accessible from within the class. But if a method inside a class instantiate an object of that same class, shouldn't the scope rules apply to that instantiated object?
Can static method like main access the non-static member of the class, as given in this example ?
Your
main
method is a method ofSimpleApp
, so it can callSimpleApp
's private methods.Just because it's a
static
method doesn't prevent it behaving like a method for the purposes ofpublic
,private
etc.private
only prevents methods of other classes from accessingSimpleApp
's methods.private
means "only stuff in this class can mess around with it". It doesn't mean "only this instance can call its methods", which seems to be what you're expecting. Any code inSimpleApp
can use anything in anySimpleApp
. The alternative would be to break encapsulation -- how would you make a properequals
method, for example, that didn't require access to another instance's fields, without making those fieldsprotected
or evenpublic
or requiring getters for data that should only be available inside the class?