【发布时间】:2013-10-01 10:01:02
【问题描述】:
我知道这个问题被问了很多,但在我看来,通常的答案远不能令人满意。
给定以下类层次结构:
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 的另一个可能原因是,如果它有几个不同的子类,并且该变量应该在运行时切换它对其中几个的引用,但例如我只在类中看到了这种情况(不是超级,不是子。只是类)。绝对不足以要求通用模式...
【问题讨论】:
-
因为他们不想知道实例是什么类型的子类。他们对超类的上下文感兴趣。
-
换句话说,你需要什么 ATM 是主观的,而不是最佳实践。对吗?
标签: java inheritance casting polymorphism type-conversion