1

为什么在Java中,我们需要创建父类的引用和子类的对象?我们用这个实现什么?显而易见的答案是多态性,但范围是什么?它如何实时提供帮助?我在学习java时遇到了这个问题。

4

2 回答 2

1

在您的示例中,通过使用父类引用,您可以编写一个采用任何类型 List 并对其进行操作的方法,而无需关心它正在传递的特定类型的列表。

另一方面,子类指定了实际的实现,因此该方法的用户可以选择最有效或最适合其要求的任何列表。

假设您编写了一个计算 List 总和的方法:

int sum(List<Integer> input);

现在假设你的方法的一个用户有一个列表,他关心快速随机访问,所以他创建了一个 ArrayList,而另一个用户想要经常拼接和加入他的列表,所以他使用了 LinkedList。

这两个用户现在都可以使用您的 sum 方法。

于 2013-02-21T05:37:37.923 回答
0

多态性如何在现实生活中帮助您?

通过增加代码的灵活性来适应不同的参数或实现。
例如,可以想到一种方法:

void foo(ArrayList<T> arg) {
  for (T t : arg) {
    // do something
  }
}

我们真的需要将此方法限制为仅接受 ArrayList 吗?毕竟,我们在那里使用的函数同样可以在 LinkedList 或 Set 上执行。如果我们改为这样写,它会更加实用:

void foo(Iterable<T> arg) {
  for (T t : arg) {
    // do something
  }
}

同样,如果我们写:

ArrayList<T> arg = new ArrayList<T>();

这仅在我们想在 arg 中使用的方法仅对 ArrayList 可用时才有用。如果我们想要的方法是在 ArrayList 的超类中声明的,那么我们可以通过将其更改为:

Collection<T> arg = new ArrayList<T>();

然后,如果我们确定 arg 实际上需要排序,我们可以很容易地将其更改为

Collection<T> arg = new PriorityQueue<T>();

不会破坏我们代码中的任何其他内容,因为 foo() 将像接受 ArrayList 一样愉快地接受 PriorityQueue。如果你不再依赖任何子类的具体实现细节,你可以很快地改变很多。

正如评论中提到的,一旦你把它从非常简单的例子中分解出来,它就会变得更加强大。假设我们有一个与数据库接口的应用程序。如果我们的数据库是 MySQL,您可能会忙于编写非常具体的 MySQL 代码:(注意,我一直没有做过任何 JDBC 的东西,所以这完全是人为的)

MySQL db = new MySQL();
int results = db.mySqlExecute("SELECT count(*) FROM names WHERE firstname = 'Bobby';");

在大型应用程序中进行了很多之后,您的代码与 MySQL 完全密不可分,您无法实现另一个数据库系统,如 PostgreSQL 或其他任何东西。相反,如果你写:

DataBase db = new MySQL();
int results = db.getCount("names", "firstname = 'Bobby'");

您可以轻松地将第一行更改为

DataBase db  = new PostgreSQL();

只需一个简单的更改,您的代码就可以很好地工作。这就是多态的力量:不依赖于单一的实现。

于 2013-02-21T05:53:46.597 回答