ArrayList无参构初始化
@Test
public void testArrayList(){
ArrayList<Integer> arrayList = new ArrayList<>();
ArrayList<Integer> list = new ArrayList<>();
}
先来到:ClassLoader这个类加载器:
private void checkPackageAccess(Class<?> cls, ProtectionDomain pd) {
final SecurityManager sm = System.getSecurityManager();
/*SecurityManager方法在System类:
public static SecurityManager getSecurityManager() {
return security;-----> private static volatile SecurityManager security = null;
}
*/
if (sm != null) {//发现这个为null,那么就跳过了
if (ReflectUtil.isNonPublicProxyClass(cls)) {
for (Class<?> intf: cls.getInterfaces()) {
checkPackageAccess(intf, pd);
}
return;
}
final String name = cls.getName();
final int i = name.lastIndexOf('.');
if (i != -1) {
AccessController.doPrivileged(new PrivilegedAction<Void>() {
public Void run() {
sm.checkPackageAccess(name.substring(0, i));
return null;
}
}, new AccessControlContext(new ProtectionDomain[] {pd}));
}
}
}
上面的操作应该是看看有没有类对象被初始化过了
因为sm是null于是直接skip了,回到ArrayList的初始化进程里了。
正片:
1、来new一个模拟一下
List<Integer> arrayList = new ArrayList<>();
2、进入到ArrayList无参构造器:
public ArrayList() {
this.elementData = DEFAULTCAPACITY_EMPTY_ELEMENTDATA;
}
3、进入到AbstractList构造器
protected AbstractList() {
}
4、进入到AbstractCollection构造器
protected AbstractCollection() {
}
5、来到Object
在Object类中没有看到构造器,为什么?其实不是没有构造器,而是没看到构造器函数,因为默认无参构造器可以不写。
6、这里初始化object后就回到AbstractCollection类的无参构造器函数进行实例化
7、回到AbstractList对transient修饰的modCount进行初始化,再完成AbstractList的实例化。
8、回到ArrayList对this.elementData对象初始化,然后就初始化ArrayList对象。
对于另一个ArrayList对象就直接不走类加载器了,直接和变量arrayList的2-8步一样。