It means that suppose you have:
Object x = "hello";
The type of the variable is Object, but the type of the object it refers to is String. it's the variable type which determines what you can do though - so you can't call
// Invalid
String y = x.toUpperCase();
The compiler only knows that you're calling a method on Object, which doesn't include toUpperCase. Similarly, overloaded methods are only resolved against the ones you know about:
public class Superclass
{
public void foo(Object x) {}
}
public class Subclass extends Superclass
{
public void foo(String y) {}
}
...
Subclass x = new Subclass();
Superclass y = x;
x.foo("hello"); // Calls Subclass.foo(String)
y.foo("hello"); // Calls Superclass.foo(Object)