首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >当C是Java中A的子类时,"C c= new C()“和"A c= new C()”之间的区别

当C是Java中A的子类时,"C c= new C()“和"A c= new C()”之间的区别
EN

Stack Overflow用户
提问于 2013-02-17 12:12:54
回答 4查看 836关注 0票数 3

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

代码语言:javascript
运行
复制
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

代码语言:javascript
运行
复制
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);

    }
}
EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2013-02-17 12:34:08

这取决于对象要用来做什么。

如果你真正需要的是一个有A接口的对象(也就是A的类型),强烈推荐使用A a = new C();。这样可以清楚地表明你想要的是A接口,而不是C实现。以后当你改变主意时,你可以在不破坏其他代码的情况下安全地将其更改为A a = new Another_Subtype_Of_A();

A是一个接口时尤其如此(在您的例子中,A是一个类)。例如,如果你只是想要一个列表,List list = new ArrayList();显然比ArrayList list = new ArrayList();更好。这就是所谓的“编程到接口,而不是实现”。

如果你正在创建一个特别需要C接口的对象(尤其是那些没有出现在A中的接口),你最好选择C c = new C();。如果你写的是A a = new C(),你迟早还是要把这个对象转换成C(因为A没有你想要的所有接口),所以为什么要麻烦呢?

票数 2
EN

Stack Overflow用户

发布于 2013-02-17 12:17:57

这与变量的运行时类型无关。您可能只知道在编译时有一个Vehicle对象,并且根据用户输入,它可能是一个GarbageTruckSportsCar

代码语言:javascript
运行
复制
GarbageTruck t;
...
t = new SportsCar();  //can't do this!

// so we do this:
Vehicle t;
if(user.isFast()) {
   t = new SportsCar();
} else {
   t = new GarbageTruck();
}
票数 1
EN

Stack Overflow用户

发布于 2013-02-17 12:23:37

Java是关于接口和实现的。

接口只是一组公共字段(方法和属性),用于描述用户如何与实现接口的类进行交互。

实现是实际使这些方法和属性执行某些操作的代码。实现可以是对interface执行implements操作的类,也可以是其他实现的子类。

当您实例化一个类时,您编写的代码如下:

代码语言:javascript
运行
复制
Interface a = new Implementation();

很多时候,我们把接口和实现包装在一起……换句话说,当我们定义一个接口时,无论我们是否显式地实现了一个接口,我们都是在用我们编写的每个public方法定义一个接口。

因此,是接口影响了我们可以调用的方法,而是实现影响了我们调用它们时发生的事情。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14917903

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档