views:

185

answers:

3

I can imagine 3 type of visibility for variables (but I think there are more):

  1. Variable is used within a method and any changes of the value of this variable are not visible from outside of the method (so it is local for a particular method).

  2. A variable is local to the class meaning that it is unvisible from outisde of the class. However, any method of the class can easily see and change value of this variable without necessity to give the variable in the list of arguments of methods (so it is kind of global within the class).

  3. Variable can be accessed by "objectName.variableName".

How do I declare these different kinds of variables?

+2  A: 

1) Any variable declared in a method is only visible in that method. (method-local). The programmer has no choice in that.

2) Any variable declared with the modifier private is visible only from within instances of the class it is delared in.

3) public variables can be accessed from any class with object.variable; protected variables can be accessed in this way from subclasses only; private variables can be accesses in this way only within instances of the class the variable is declared in.

For detail and reference, see the Java Learning Trail on Sun's website.

However: exposing class members (variables) to other classes is bad practise, and access should be enabled using methods, such as:

public class MyClass {
  private int myInt;

  public int getMyInt() {
    return myInt;
  }

  public void setMyInt(int newInt) {
    myInt = newInt;
  }
}
Brabster
Don't forget that omitting the modifier in the first place makes it package-private. This makes it visible outside the class but only within the local package (which is extremely useful). http://java.sun.com/docs/books/tutorial/java/javaOO/accesscontrol.html
Chris Dennett
Indeed, but that wasn't covered by use-cases in the question :)
Brabster
Actually - now that you mention it @Chris Dennett, I have to admit I've never had need to use package private. I've always thought it introduced an unnecessary dependency on package structure and had very limited usefulness. There's another SO question on that point you might want to post an answer to if you have use cases that aren't covered :)
Brabster
It's really useful when you want to share methods around, but don't want external code to see it. Otherwise you have to mess around with interfaces (without the internal methods) and then converting from the interfaces to the real classes (which can cause problems if people decide to implement the interface themselves in some cases!)
Chris Dennett
A: 

1: just something like int i; within the method

2: use the private modifier or protected modifier

3: use public

Excel20
+1  A: 

Important to remember: If you declare a variable in a class and don't use any access modifier it will be package-private. That means from other classes within the same package you can reference it with objectname.variable while from classes in other packages you can't.

ahe