| To refer to a static member of another class, we typically *qualify* that member |
| name by prepending the name of the class it's in, and a dot: |
| `TheClass.theMethod()`. |
| |
| But the Java language also permits you to qualify this call using any |
| *expression* (typically, a variable) whose static type is the class that |
| contains the method: `instanceOfTheClass.theMethod()`. |
| |
| Doing this creates the appearance of an ordinary polymorphic method call, but it |
| behaves very differently. For example: |
| |
| ``` |
| public class Main { |
| static class TheClass { |
| public static int theMethod() { |
| return 1; |
| } |
| } |
| |
| static class TheSubclass extends TheClass { |
| public static int theMethod() { |
| return 2; |
| } |
| } |
| |
| public static void main(String[] args) { |
| TheClass instanceOfTheClass = new TheSubclass(); |
| System.out.println(instanceOfTheClass.theMethod()); |
| } |
| } |
| ``` |
| |
| `TheSubclass` appears to "override" `theMethod`, so we might expect this code to |
| print the number `2`. |
| |
| The code, however, prints the number `1`. The runtime type of |
| `instanceOfTheClass`, `TheSubclass`, is ignored; only the static type of the |
| reference, as seen by `javac`, matters. |
| |
| In fact, the instance that `instanceOfTheClass` points to is *entirely* |
| irrelevant. To prove this, set the variable to `null` and run again. The program |
| will *still* print `1`, not throw a `NullPointerException`! |
| |
| Qualifying a static reference in this way creates an unnecessarily confusing |
| situation. To prevent it, only qualify static method calls using a class name, |
| never an expression (that is, `TheClass.theMethod()` or `theMethod()`, but not |
| `anInstanceOfTheClass.theMethod()`). |