给定以下类层次结构:
class SuperClass{}
class SubClass extends SuperClass{}
为什么人们使用这种模式来实例化子类:
SuperClass instance = new SubClass();
请使用这个:
SubClass instance = new SubClass();
现在,我通常看到的答案是这样做是为了将instance
作为参数发送到需要超类实例的方法中,就像这里一样:
void aFunction(SuperClass param){}
//somewhere else in the code...
...
aFunction(instance);
...
但是我可以将SubClass的实例发送到aFunction,而不管它所持有的变量类型!这意味着以下代码将编译并且不会出现错误(假设先前提供了aFunction的定义):
SubClass instance = new SubClass();
aFunction(instance);
实际上,据我所知,在运行时变量类型是没有意义的。它们仅由编译器使用!
将变量定义为SuperClass的另一个可能的原因是,如果它有几个不同的子类,并且该变量应在运行时切换到其中的几个子类引用,但例如我只看到这种情况发生在类中(不是超级,不是子类。只是类)。绝对不足以需要一般模式...