父类和子类对象的引用

时间:2013-02-21 05:19:55

标签: java core

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

2 个答案:

答案 0 :(得分:1)

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

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

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

int sum(List<Integer> input);

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

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

答案 1 :(得分: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()将接受PriorityQueue,就像接受ArrayList一样快乐。如果您停止依赖任何子类的特定实现细节,您可以非常快速地更改批次。

正如评论中所提到的,一旦你打破了非常简单的例子,它就会变得更加强大。 假设我们有一个与数据库接口的应用程序。如果我们的数据库是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();

只需进行一次简单的更改,您的代码就可以正常运行。这就是多态的力量:不依赖于单个实现。