ArrayList无参构初始化

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步一样。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值