start with the look of java visibility
Let me say you will class like this
public class VariableAccessibility {
public static int STATICVARIABLE = 1;
public static final int STATICVARIABLECONSTANT = 1;
int protectedVariable = 1; //protected is default
public int publicVariable = 1;
private int privateVariable = 1;
public int getPrivateVariable() {
return privateVariable;
}
public void setPrivateVariable(int privateVariable) {
this.privateVariable = privateVariable;
}
}
Then you can / cannot to do following
VariableAccessibility varAccess = new VariableAccessibility();
int value = varAccess.publicVariable; //works because its public variable
int staticVariable = varAccess.STATICVARIABLE; //works
int consVar = varAccess.STATICVARIABLECONSTANT; //works, because its static
//int privateVar = varAccess.privateVariable; //not visible
int privateVar = varAccess.getPrivateVariable(); //works, call "getter" will be operating with private class variable
//static variables values modification
VariableAccessibility.STATICVARIABLE = 5; //you can do, because static but not final
//VariableAccessibility.STATICVARIABLECONSTANT = 5; //cannot to do, because its final
Basically, its a good point to have all what is possible marked as private
(with private modifier) and if needed, then create/generate getters and setters (methods with get / set in the name).
- public variables are visible everywhere and you can modify them straightly.
- private are not visible without getters/setters, protected should be visible in the same package scope.
static and final are having special purpose:
- static variables are "shared" cross all instances
- final are not modifiable, in general.