1
class A {
.
.
.
}

class B extends A {
.
.
.
}

A var = new B()作品。但是我什么时候需要这样做而不是简单的B var = B()?它有什么区别?使用 var.method() 或 var.field 有什么不同吗?

4

5 回答 5

1

如果你这样做A var = new B();,你也可以分配var = new C()if C extends A。这是多态性原则。您可以分配通过IS-A测试的多个类的实例 class A

于 2013-10-28T07:41:19.343 回答
0

案例 1. JDBC 就是一个例子。您使用 Connection、Statemet 接口来引用对象,但提供者为您实现了类 ConnectionImpl 和 StatementImpl(这里我们从不关心名称。)。

情况2:接口是通用表示,实现是具体表示。当您使用接口时,相同的引用可能对其他实现类对象有用。

于 2013-10-28T07:46:08.427 回答
0

但是我什么时候需要这样做而不是简单的B var = B()?> 它有什么不同?

我在声明变量时经常使用抽象类型,但为其分配一个具体类型的实例:

List<Integer> list = new ArrayList<Integer>();

这使得在以后替换不同的具体列表实现变得更容易。

于 2013-10-28T07:43:46.290 回答
0

您将使用最合适的超类或理想的接口。这在代码中演示了您需要的最少功能以及是否需要更改代码

 A var = new B();

 A var = new C(); // C also extends A

这是微不足道的。但是,如果您B在任何地方都使用,您将在以后让 mroe 为自己工作以更改和检查代码。

唯一的例外是当您可以使对象过于通用而错过一些重要行为时。例如

 void methodIsInSet(Set<T> set);

可以替换为

 void methodIsInSet(Collection<T> set);

因为方法是相同的,但忽略了关于重复等的重要假设。

于 2013-10-28T07:44:46.190 回答
0

您通常不会在诸如 之类的简单语句中这样做A var = new B(),因此您的观察在许多情况下是正确的。但是,您将使用它类似于

public A CreateAnObject(int i)
{
    if (i = 0)
        return new A();
    else 
        return new B();
}

现在你可以做一个A var = CreateAnObject(something). var 将是 A 或 B。

于 2013-10-28T07:44:48.723 回答