gpt4 book ai didi

java - Java中C是A的子类时 "C c = new C()"和 "A c = new C()"的区别

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:19:14 26 4
gpt4 key购买 nike

假设我们有 A 类作为父类,C 类扩展它。

class A
{
void m()
{
System.out.println("A.m");
}
}

class C extends A
{
@Override
void m()
{
System.out.println("C.m");
}
}

引用 A aC c 当我们使用它们指向相同的对象类型时有什么区别,例如 A a = new C( );C c = new C();?

来自这个问题:Java inheritance vs. C# inheritance , 看起来像ac 指向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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com