我只是想知道为什么我们初始化父类的对象并使用子类实例化它而不是直接实例化子类对象。
示例:
List<String> sampleList=new ArrayList<String>();
而不是
ArrayList<String> sampleList=new ArrayList<String>();
答案 0 :(得分:4)
假设我创建了一个使用ArrayList
执行某些操作的方法:
public int sum(ArrayList<Integer> list){
int sum = 0;
for(Integer x : list){
sum += x;
}
return sum;
}
现在可以正常使用,ArrayList
的任何人都可以调用它。但是LinkedList
人呢?他们运气不好!
但我为什么要排除它们呢?我的函数实际上并没有使用ArrayList
特有的任何内容 - 我实际上并不是关心或需要知道该函数的List
类型正在给予。那么为什么不尽量使它尽可能一般,所以List
的任何人都可以调用我的函数?
public int sum(List<Integer> list){
int sum = 0;
for(Integer x : list){
sum += x;
}
return sum;
}
同样,如果我实际上并不关心它是什么类型的ArrayList
,为什么我应该将变量声明为List
?如果我想稍后将该变量更改为LinkedList
该怎么办?如果我将其声明为List
,那么这是一个单行更改。但是,如果我将其声明为ArrayList
,那么我必须更改每个引用它。在较大的项目中,这可能会变得非常烦人,因此通常最好保持变量尽可能通用。
答案 1 :(得分:1)
所有列表中的第一个是接口而不是类。 其次,这被称为Polymorphism,多态性是面向对象编程中的一个重要概念。
使用对父类(或类实现的接口)的引用的用例是,如果要使用该引用迭代该父类的不同子类。
您可能会对This主题感兴趣。
答案 2 :(得分:1)
至少在以下方面你的问题是错误的:
我们没有&#34;初始化父类的对象&#34;在List<String> sampleList
部分 - 那只是类型声明。
在实例化对象之前无法初始化对象。
实际上我们实例化类,而不是对象。类实例化的结果是一个对象。
List
不是&#34;父类&#34;,它是一个界面。接口根本无法实例化/初始化。
如果我们从您的问题中消除所有这些错误并将其改为&#34;为什么我们声明一般类型的变量&#34;,那么答案是它使代码更具可读性和可维护性:这是您承诺的方式您不会使用ArrayList
的任何细节,但会严格将其用作一般List
。当在方法参数中使用时,这变得更加重要:它允许您的方法与任何List
实现一起使用,从而使您的方法更有用。这实际上是多态性的全部内容。