Когда переменная объявлена, ее тип определяется с ней. Его назначение не влияет на его тип. Его тип - то, как это может использоваться и только как это может использоваться. Подклассы этого типа могут иметь дополнительные функции, но когда тип не является этим подклассом, эти функции недоступны, поскольку в отношении любой принимающей функции он использует тип как способ определения доступных функций.
Рассмотрим следующие фрагменты кода:
public class SuperClass {
...
public void normalFunction(){...}
...
}
//
public class SubClassA extends SuperClass {
...
public void specialFunctionA(){...}
...
}
//
public class SubClassB extends SuperClass {
...
public void specialFunctionB(){...}
...
}
//
public class Demo {
public static void main(String[] args){
SubClassA a = new SubClassA();
a.specialFunctionA(); //it's ok here because here its TYPE is SubClassA
a.normalFunction(); //also fine because superclass functions are inherited
someFunction(a);
}
public void someFunction(SuperClass sc){
sc.specialFunctionA(); // How could we know whether specialFunctionA is available?
sc.specialFunctionB(); // How could we know whether specialFunctionB is available?
sc.normalFunction(); // fine because this function is declare in SuperClass
}
}