Reputation: 298
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 ?
Upvotes: 3
Views: 7236
Reputation: 188174
Because the private
scope limits access to the class defining the method, and your main
happens to be in the same class.
private modifier—the field is accessible only within its own class.
See Access Modifiers in the Java Documentation.
Upvotes: 0
Reputation: 915
See below chart
Access Modifiers
**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
As your method is inside car it's accessible based on above thumb rule.
Upvotes: 3
Reputation: 1
In the program, we created two instances of the class by using which we called two private methods. It's a kind of interesting to see this works is that this is the way we used to call public or default methods outside its class using object reference. In this case, it's all done inside the class definition, so it's valid. The same code put outside the class will result in error.
Upvotes: 0
Reputation: 86575
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 in SimpleApp
can use anything in any SimpleApp
. The alternative would be to break encapsulation -- how would you make a proper equals
method, for example, that didn't require access to another instance's fields, without making those fields protected
or even public
or requiring getters for data that should only be available inside the class?
Upvotes: 2
Reputation: 1892
The call you issue is from within the same class where your private method resides. This is allowed. This is the way 'private' is defined in java.
Upvotes: 0
Reputation: 11308
From the Java Tutorial:
private modifier—the field is accessible only within its own class
The main
method is inside the same class as the private method and thus has access to it.
Upvotes: 2
Reputation: 281835
Your main
method is a method of SimpleApp
, so it can call SimpleApp
's private methods.
Just because it's a static
method doesn't prevent it behaving like a method for the purposes of public
, private
etc. private
only prevents methods of other classes from accessing SimpleApp
's methods.
Upvotes: 13