什么时候做Superclass var = Subclass()

时间:2013-10-28 07:38:52

标签: java

class A {
.
.
.
}

class B extends A {
.
.
.
}

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

时有什么不同

5 个答案:

答案 0 :(得分:1)

如果您A var = new B();,如果var = new C(),您还可以指定C extends A。这是多态主体。您可以分配多个类的实例,这些类通过IS-A测试,用于类A

答案 1 :(得分:0)

  

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

我在声明变量时经常使用抽象类型,但是为它指定一个具体类型的实例:

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

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

答案 2 :(得分:0)

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

更改代码
 A var = new B();

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

这是微不足道的。但是,如果您在任何地方都使用B,那么您以后可以自行修改并检查代码。

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

 void methodIsInSet(Set<T> set);

可以替换为

 void methodIsInSet(Collection<T> set);

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

答案 3 :(得分: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.

答案 4 :(得分:0)

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

案例2:接口是通用表示,实现是特定表示。当您使用接口时,相同的引用对其他实现类对象可能很有用。