• 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







  • 相关阅读:
    php多态简单示例
    php接口
    PHP的两种表单数据提交方式
    PHP操作数据库
    51nod 1575 Gcd and Lcm
    51 nod 1297 管理二叉树
    51 nod 1628 非波那契树
    51 nod 1211 数独 DLX
    51nod:1689 逛街
    51 nod 1203 JZPLCM
  • 原文地址:https://www.cnblogs.com/softidea/p/4556402.html
Copyright © 2020-2023  润新知