假设我们有 A 类作为父类,C 类扩展它。
class A
{
void m()
{
System.out.println("A.m");
}
}
class C extends A
{
@Override
void m()
{
System.out.println("C.m");
}
}
引用 A a
和 C c
当我们使用它们指向相同的对象类型时有什么区别,例如 A a = new C( );
和 C c = new C();
?
来自这个问题:Java inheritance vs. C# inheritance , 看起来像a
和c
指向C 的对象类型,使用它们似乎没有区别。
我测试了这段代码,它们都打印了C.m
。
class inherit {
void x(A a)
{
a.m();
}
public static void main(String[] args) {
System.out.println("hello");
A a = new C();
C c = new C();
a.m();
c.m();
new inherit().x(a);
new inherit().x(c);
}
}
最佳答案
这取决于对象的用途。
如果你真正需要的是一个有A
接口(interface)的对象(即A
的类型),强烈推荐使用A a =新 C();
。这样就清楚地表明您需要一个A
接口(interface),而不是一个C
实现。稍后当您改变主意时,可以安全地将其更改为 A a = new Another_Subtype_Of_A();
而不会破坏其他代码。
当 A
是一个接口(interface)时尤其如此(在您的例子中,A
是一个类)。例如,如果您只想要一个列表,List list = new ArrayList();
显然优于 ArrayList list = new ArrayList();
。这就是所谓的“针对接口(interface)而非实现编程”。
如果您创建的对象特别需要 C
的接口(interface)(尤其是 A
中没有的接口(interface)),您最好选择 C c = 新 C();
。如果您改为编写 A a = new C()
,迟早您仍然必须将对象转换为 C
(因为 A 没有您想要的所有接口(interface)),那又何必呢?
关于java - Java中C是A的子类时 "C c = new C()"和 "A c = new C()"的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14917903/