集合系列:第一篇-List常用方式

通常我们在使用列表的时候都是这样写的:

List list = new ArrayList();

(父类引用指向子类对象)

而不是

ArrayList list = new ArrayList();

第一种为什么比第二种好?

假设你用了二种方式声明一个列表,然后被其他人引用了(或者被你自己在其他地方用了)。

突然有一天,你发现用ArrayList不好,需要换成LinkedList,那么你肯定要把声明改成:

LinkedList list = new LinkedList();

这样以来,用到你的list的地方都得更改类型声明。更重要的是,用到你的list的人,他们写自己的代码的时候是基于“你的这个list是一个ArrayList ”这样的前提来写的,你突然把它改成了LinkedList,很可能导致他们的程序出错或者需要重写。

但是如果你一开始就用第一种声明方式,就不会有这个问题。你随时可以更换list的,引用你的list的其他人或其他地方不需要任何修改。例如:

List list = new LinkedList();

所以说,当你声明一个变量的时候,把它的类型声明得越笼统越好,越具体越糟糕。前者对修改是友好的,后者对修改不友好。

类似的,确定一个方法的可访问性(即public、protected、默认的、private)时,在可能的情况下,越小越好。

-------------------------------------------------------华丽的分割线----------------------------------------------------------------

“Person p = new Person();”

创建一个对象都在内存中做了什么事情?

1先将硬盘上指定位置的Person.class文件加载进内存。

2执行main方法时,在栈内存中开辟了main方法的空间(压栈-进栈),然后在main方法的栈区分配了一个变量p。

3在堆内存中开辟一个实体空间,分配了一个内存首地址值。new

4在该实体空间中进行属性的空间分配,并进行了默认初始化。

5对空间中的属性进行显示初始化。

6进行实体的构造代码块初始化。

7调用该实体对应的构造函数,进行构造函数初始化。()

8将首地址赋值给p ,p变量就引用了该实体。(指向了该对象)

阅读更多

没有更多推荐了,返回首页