个人学习整理,如有不足之处,请不吝指教。转载请注明:
@CSU-Max
我们在编写代码的过程中,经常会见到以下的代码:
List list = new ArrayList();
List<Person> persons = new ArrayList<Person>();
似乎我们这样已经写习惯了,似乎也有一点感觉,但为什么不是直接用ArrayList呢?
根据面向对象设计原则的依赖倒转原则,要面向抽象层编程,而非具体类。
List是接口,ArrayList是实现。
看一下JDK和API中的说明:
实现List接口的有ArrayList. LinkedList. Vector等,所以在使用的时候,声明为List, new 的却是具体的实现类,这样就很好的符合了依赖倒转原则。
那既然这样,为什么不直接声明为具体类呢?
对于这一点,我个人认为:
如果我们可以可以确定一定使用ArrayList的话,那么我们完全可以直接声明为ArrayList类型,这样就成了最常见的情况了。
但是,如果我们不确定使用的ArrayList的话,如果声明成ArrayList类型的对象,则在使用时调用的是ArrayList的特有方法,而此时如果我们要将对象改成List类型对象的时候,可能就会出现错误,此时我们就要加入复杂的判断了。因为List中方法有很多种实现,实现它的类ArrayList. LinkedList等中实现方法是不一样的,而一开始声明为 ArrayList导致我们使用的都是ArrayList实现式的,而ArrayList实现的不仅仅是List接口,还有 Cloneable等等,所以可能会有一些List接口中没有声明的方法,而是其他接口中的方法,而改成List的时候,若是之前使用了不是List中的方法,这样转换过来就会出现错误。
ArraryList list = new ArrayList();
//do something
/*修改类型后
List list = new ArrayList();
if(list.instanceOf(ArrayList)){
//do something
}else if(list.instanceOf(LinkedList)){
//error
}else if(list.instanceOf(Vector)){
//error
}else{
//error
}
*/
可见,此时我们所做的工作会很繁琐,倒不如在直接来List来的简单。
但是,是不是在所有的情况下都适合声明父类类型对象,new子类类型对象呢?
答案当然是否定的,因为Java的思想是万事万物皆对象,Object类型是Java中所有类的父类,而我们在编码的时候是不会将所有的对象都声明为Object类型的对象。
以上仅是举个例子,这个例子可能不是很准确,毕竟一个是实现关系,一个是继承关系。
若是继承关系,则不能声明为基类类型,new 的子类类型,这样就有可能出错,这个在刚开始学习Java的时候都应该了解过。
public class Person {
public void eat(){
System.out.println("人吃饭");
}
}
public class Student extends Person {
public void study(){
System.out.println("学生学习");
}
}
public static void main(String[] args) {
Person person = new Person();
Student student = new Student();
Person stu = new Student();
person.eat();
student.eat();
student.study();
stu.eat();
}
stu对象是Person类型,在调用其方法时只能调用Person类的eat()方法,不能调用Student类的study()方法。这个很简单的,开始学面向对象的时候应该都了解过。
好了,就讲到这吧,就是从一个简单的小东西胡乱想的一些,哈哈。