【由一行平常代码想到的】


个人学习整理,如有不足之处,请不吝指教。转载请注明: @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()方法。这个很简单的,开始学面向对象的时候应该都了解过。
 
好了,就讲到这吧,就是从一个简单的小东西胡乱想的一些,哈哈。






评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值