我知道这个问题被问了很多,但在我看来,通常的答案远不能令人满意。
给定以下类层次结构:
class SuperClass{}
class SubClass extends SuperClass{}
为什么人们使用这种模式来实例化子类:
SuperClass instance = new SubClass();
而不是这个:
SubClass instance = new SubClass();
现在,我看到的通常答案是,这是为了将instance
作为参数发送到需要 SuperClass 实例的方法,如下所示:
void aFunction(SuperClass param){}
//somewhere else in the code...
...
aFunction(instance);
...
但是我可以将 SubClass 的实例发送到 aFunction 而不管保存它的变量的类型!这意味着以下代码将编译并运行而没有错误(假设之前提供的 aFunction 定义):
SubClass instance = new SubClass();
aFunction(instance);
事实上,AFAIK 变量类型在运行时毫无意义。它们仅供编译器使用!
将变量定义为 SuperClass 的另一个可能原因是它有几个不同的子类,并且该变量应该在运行时切换它对其中几个的引用,但例如我只在类中看到了这种情况(不是 super,不是 sub.只是上课)。绝对不足以要求通用模式......