笔者最近在软考复习的过程中,对于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;而采用后者的写法,没有此好处,要进行大量修改。)
02-15
822
![](https://csdnimg.cn/release/blogv2/dist/pc/img/readCountWhite.png)
“相关推荐”对你有帮助么?
-
非常没帮助
-
没帮助
-
一般
-
有帮助
-
非常有帮助
提交