何时执行超类变量 = 子类()


class A {
.
.
.
}
class B extends A {
.
.
.
}

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

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

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

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

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

这样可以更轻松地在以后替换不同的具体列表实现。

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

 A var = new B();

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

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

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

 void methodIsInSet(Set<T> set);

可以替换为

 void methodIsInSet(Collection<T> set);

由于方法相同,但遗漏了关于重复项等的重要假设。

你通常不会在一个简单的语句中这样做,比如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。

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

情况 2:接口是泛型表示,实现是特定表示。 使用接口时,相同的引用可能对其他实现类对象有用。

最新更新