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

标签 java inheritance

假设我们有 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/

相关文章:

java - 单个容器上的应用程序之间通信的最快方式

java - RDD join : After joining two different pair RDDs, 结果RDD键值和顺序发生了变化?

java - 如果(空!=变量)为什么不如果(变量!=空)

c++ - 在C++中公开继承其祖 parent 时私下继承 parent

c++ - 在 C++ 中使用抽象基类和模板进行重构

java - 如何继承两个类

java - 在 Firebase 上编写 ArrayList 的方法比 for 循环更好?

java - 为什么我的横幅出现在我的主视图下?

c# - 在类的所有实例中引发事件

c++ - 动态创建继承类,使用 std::map 使用基类指针访问?