In Java, member variables have static binding because Java does not allow for polymorphic behavior with member variables.
private
methods, as they are never inherited and the compiler can resolve
calls to any private method at compile time only. Hence static binding.
Secondly, consider the below code..
class SuperClass{
...
public String someVariable = "SuperClass";
...
}
class SubClass extends SuperClass{
...
public String someVariable = "SubClass";
...
}
...
...
SuperClass superClass1 = new SuperClass();
SuperClass superClass2 = new SubClass();
System.out.println(superClass1.someVariable);
System.out.println(superClass2.someVariable);
...
Output:-
SuperClass
SuperClass
The member variable is resolved based on the declared type of the object reference only,
which the compiler is capable of finding as early as at the compile time only and
hence a static binding in this case.
In summary, basically Java developers didn't want these checks to happen till Run time and get an exception at that point.