3

假设我们有 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继承与C#继承,它看起来像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);

    }
}
4

4 回答 4

2

这取决于对象将用于什么。

如果你真正需要的是一个具有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 没有您想要的所有接口),那么为什么还要麻烦呢?

于 2013-02-17T04:34:08.360 回答
1

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

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();
}
于 2013-02-17T04:17:57.497 回答
1

Java 是关于接口和实现的。

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

实现是实际上使这些方法和属性做某事的代码。实现可以是 的类,implementsinterface可以是其他实现的子类。

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

Interface a = new Implementation();

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

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

于 2013-02-17T04:23:37.117 回答
0

首先A是父类,C当你这样做时是子类,A a = new A()然后A创建对象并由A句柄持有。当你这样做时C c = new C(),对象C正在创建并且C句柄持有它。但是当你这样做时,A a = new C()对象C被创建并且A句柄持有它。这意味着C现在已经使用了 的所有属性。虽然句柄A被使用的属性(实例)C使用。这就是我们的多态性。现在它将使用 C 而不是 A 的所有重载方法

以用法为例
当您创建一个为子类创建方法的大型项目时,差异就出现了
假设您有hello方法
public void hello(C c) { }

将来你有另一个类 B 扩展 A.. 在这种情况下你不能使用hello它的参数是 C.. 并且想象你有很多类作为 A 的子类需要使用这种方法(那么有多少这样的方法您将创建)。多态是救援
你用 A 作为参数创建你好,现在你可以对..
public void hello (A x) { }
的所有孩子使用相同的方法。 现在所有人都可以使用这就是多态的美妙之处A
A c = new C()
A b = new B()

hello

于 2013-02-17T04:20:11.233 回答