Java语句为什么一般不直接写成“private ArrayList<BackGround> allBg=new ArrayList<>();”?

    笔者最近在软考复习的过程中,对于Java语句“private List<BackGround> allBg=new ArrayList<>();”(以下统称为“前者”)为什么不直接写成“private ArrayList<BackGround> allBg=new ArrayList<>();”(以下统称为“后者”)产生了疑惑。
    两者的不同点在于前者allBg声明为List接口类型的变量,而后者则直接声明allBg为ArrayList实现类类型的变量,但两者赋予变量的对象都为ArrayList类对象,两者在语法上都是没有问题的,而且在本程序中的作用应该也不会有太大差别,但笔者主观认为后者这种声明为ArrayList类类型的变量,然后赋予ArrayList类的对象这种写法更加简单、更加明确,没有转弯抹角。但笔者查阅了许多范例后发现,大多数范例都如前者所写,为什么这么写呢?这样写是有什么用途或者好处吗?带着这样的问题,笔者翻阅了许多资料,尝试得出答案。以下是笔者结合了多方资料得出的个人理解与总结:
    (1)设计模式中有对依赖倒置原则。程序要尽量依赖于抽象,不依赖于具体。从Java语法上,前者这种方式是使用接口引用指向具体实现,符合依赖倒置原则。
    (2)ArrayList不是继承List接口,是实现了List接口。如果写成后者,也不会有问题。前后者的区别在于,后者被声明为ArrayList类类型的对象,它可以使用ArrayList的所有方法。前者中,List是接口,是个抽象类,是不能被实例化的,所以必须被它的实现类实例化,List接口类型变量虽然被实例化为ArrayList,但实际仍为List接口类型对象,只能使用ArrayList中已经实现了的List接口中的方法,ArrayList中那些没有重写List中的方法的方法、自己添加的方法是不可以被访问到的。
    (3)使用前者的写法,是用了多态的思想,是有好处的。把不同的子类对象都当作父类来看,可以屏蔽不同子类对象之间的差异,写出通用的代码,做出通用的编程,以适应需求的不断变化。赋值之后,父类型的引用就可以根据当前赋值给它的子对象的特性以不同的方式运作。(比如说,如果后续实际开发需要,则可以随时将ArrayList换成LinkedList;而采用后者的写法,没有此好处,要进行大量修改。)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值