我对创建对象的不同方式感到困惑,我在java文档和其他编程书籍中看到过这种情况。例如
假设存在base class
和derived class
1-我有一个Base
类型的变量,它指的是Derived
类型的对象
List<String> list = new ArrayList<String>();
2-我有一个类型为Derived
的变量,它指的是类型为Derived
的对象
ArrayList<String> arrList = new ArrayList<String>();
我的问题是,在1和2之间进行选择时,我应该怎么想?它是为了在一般的基础衍生场景中利用Polymorphism
吗?
在1和2之间选择时是否存在我不知道的better practice
,或者它只是personal decision
?
编辑:
抱歉,列表是一个界面。另一个问题:如果我使用Type参数,我的决定会改变吗?
ArrayList<T> list = new ArrayList<T>();
更新答案:这实际上被称为"Programming to the interface"
。谢谢代码大师。我所寻找的正是这个问题的答案之一——它对";程序到接口";?
-
List
不是基类,而是interface
,因此应尽可能使用。使用类实现的接口可以使用实现该接口的所有类,而不仅仅是特定的类。
-
String
是一个具体的类,因此直接使用它要清楚得多。然而,有时即使
String
实现了CharSequence
接口,也没有必要使用CharSequence
,因为这会让人感到困惑。然而,看看StringBuilder
,它几乎完全使用CharSequence
。
总之,没有更好的,只有合适的
选择基类型可以在将来的某个时候在使用ArrayList(比如LinkedList)之间进行更改,而不更改其余代码。这为您以后的重构提供了更大的灵活性。同样,出于同样的原因,您的公共方法应该返回List而不是特定类型的List实现,这样您就可以更改内部实现以优化性能,而不会破坏与调用方的约定。
在List是一个类的情况下(只是为了回答您的问题而假设-"我们应该使用表示子类的Parent类的对象还是使用派生类类型的对象(actula类)?"
1) 你是对的,这只是为了多态性。
2) 它主要用于围绕不同的类方法传递对象。其他类的方法可能接受父类的输入。你必须在那些地方使用铸造。