Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Accessing a static variable via an object reference in Java

Tags:

java

scope

static

Why can we access a static variable via an object reference in Java, like the code below?

public class Static {
    private static String x = "Static variable";

    public String getX() {
        return this.x;                 // Case #1
    }

    public static void main(String[] args) {
        Static member = new Static();
        System.out.println(member.x);  // Case #2
    }   
}
like image 335
TU_HEO DAKAI Avatar asked Mar 19 '12 05:03

TU_HEO DAKAI


People also ask

Can we access static variables using object reference?

Static variables can also be accessed by the object reference but an instance variable can only be accessed by the object reference.

Can an object access static variable in Java?

static variables are otherwise called as class variables, because they are available to each object of that class. As member is an object of the class Static, so you can access all static as wll as non static variables of Static class through member object.

How do you reference a static variable in Java?

Static variables can be accessed by calling with the class name ClassName. VariableName. When declaring class variables as public static final, then variable names (constants) are all in upper case. If the static variables are not public and final, the naming syntax is the same as instance and local variables.

Can a object reference be static in Java?

An object reference cannot be static. Static-ness is not a meaningful property for object references. It simply doesn't make sense. An object reference is a value, not a variable.


2 Answers

Generally, public variables can be accessed by everybody, and private variables can only be accessed from within the current instance of the class. In your example you're allowed to access the x variable from the main method, because that method is within the Static class.

If you're wondering why you're allowed to access it from another instance of Static class than the one you're currently in (which generally isn't allowed for private variables), it's simply because static variables don't exist on a per-instance basis, but on a per class basis. This means that the same static variable of A can be accessed from all instances of A.

If this wasn't the case, nobody would be able to access the private static variable at all, since it doesn't belong to one instance, but them all.

like image 119
kba Avatar answered Nov 01 '22 16:11

kba


The reason that it is allowed is that the JLS says it is. The specific sections that allows this are JLS 6.5.6.2 (for the member.x cases) and JLS 15.11.1 (in both cases). The latter says:

If the field is static:

  • If the field is a non-blank final field, then the result is the value of the specified class variable in the class or interface that is the type of the Primary expression.

  • If the field is not final, or is a blank final and the field access occurs in a class variable initializer (§8.3.2) or static initializer (§8.7), then the result is a variable, namely, the specified class variable in the class that is the type of the Primary expression.


Why are these allowed by the JLS?

Frankly, I don't know. I can't think of any good reasons to allow them.

Either way, using a reference or this to access a static variable is a bad idea because most programmers are likely to be mislead into thinking that you are using an instance field. That is a strong reason to not use this feature of Java.

In your first and second cases you should reference the variable as x or Static.x rather than member.x. (I prefer Static.x.)

like image 29
Stephen C Avatar answered Nov 01 '22 17:11

Stephen C