为什么在Java中,我们需要创建父类的引用和子类的对象?我们用这个做了什么?明显的答案是多态性,但那么范围是什么?它如何实时帮助? 我在学习java时遇到过这个问题。
答案 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();
只需进行一次简单的更改,您的代码就可以正常运行。这就是多态的力量:不依赖于单个实现。