zoukankan      html  css  js  c++  java
  • java ClassLoader static

    package init;
    
    class Person {
    
        private static Person person = new Person();
        public static int count2 = 5;
        public static int count1;
    
        private Person() {
            count1++;
            count2++;
        }
    
        public static Person getInstance()
        {
            return person;
        }
    
    }
    
    public class Testsingleton {
        public static void main(String[] args) {
            System.out.println("count1: " + Person.count1);
            System.out.println("count2: " + Person.count2);
        }
    
    }


    Output:
    count1: 1
    count2: 5

    原因:
    ClassLoader

    类在执行之前会执行三个步骤:

    1.类的加载:查找并加载类的二进制数据,把对应的class文件加载到内存

    2.连接

         2.1. 验证:确保被加载的类的正确性(主要防止恶心的class文件被加载)

         2.2. 准备:为类的静态变量分配内存,并将其初始化为默认值

         2.3. 解析:把类中的符合引用转换为直接引用

    3.初始化:为类的静态变量赋予正确的初始值

    发现其中步骤2.2和3提到了关键字静态变量,重点关注这两步,2.2的结果会导致为静态变量

    person,count1,count2分配内存并赋值(默认值)

    person=null;

    count1=count2=0

    到步骤3,初始化时会为静态变量赋予正确的值,那么什么时候才会进行初始化呢?

         所有的java虚拟机实现必须在每一个类或接口被java程序“首次主动使用”时才初始化 

    java对类的使用方式分为:主动使用,被动使用

    主动使用有六种:(除这6种外,其他都是被动使用)

    1、创建类的实例
    2、访问某个类或接口的静态变量或对该静态变量赋值
    3、调用类的静态方法
    4、反射
    5、初始化类的子类
    6、java虚拟机启动时被标注位启动类的类

    即在执行main方法时会为静态变量赋值,如果有多个静态变量,按照自上而下的顺序(编译器会优化,与代码书写的顺序会不一致)
    为person变量初始化时后count1=1;count2=1;

    public static int count2 = 5;执行后,count2=5

    验证:

    package init;
    
    class Person {
    
        public static int count2 = 5;
        private static Person person = new Person();
        public static int count1;
    
        private Person() {
            count1++;
            count2++;
        }
    
        public static Person getInstance()
        {
            return person;
        }
    
    }
    
    public class Testsingleton {
        public static void main(String[] args) {
            System.out.println("count1: " + Person.count1);
            System.out.println("count2: " + Person.count2);
        }
    
    }

    Output:
    count1: 1
    count2: 6

    http://longpo.iteye.com/blog/2217113







  • 相关阅读:
    2018年3月20日java
    2018年3月19日Java
    浏览器执行js代码的机制--对于我们深入了解js有很大的帮助,同时面试时候也都能用得到。
    如果用css的border属性画一个三角形
    js事件(event)的运行原理
    如何通过源生js获取一个元素的具体样式值 /* getCss:获取指定元素的具体样式的属性值 curElement:[dom对象] attr:[string] */
    js创建对象的高级模式
    查看release的SHA1
    集成百度地图定位和导航功能时出现包冲突
    【十次方基础教程(后台)】MongoDB相关
  • 原文地址:https://www.cnblogs.com/softidea/p/4556402.html
Copyright © 2011-2022 走看看