java ClassLoader static

简介: package init; class Person { private static Person person = new Person(); public static int count2 = 5; public static int cou...

 

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







 

相关文章
|
15小时前
|
Java 数据安全/隐私保护
Java基础手册二(类和对象 对象创建和使用 面向对象封装性 构造方法与参数传递 this关键字 static关键字 继承 多态 方法覆盖 final关键字 访问控制权限修饰符)
Java基础手册二(类和对象 对象创建和使用 面向对象封装性 构造方法与参数传递 this关键字 static关键字 继承 多态 方法覆盖 final关键字 访问控制权限修饰符)
4 0
|
4天前
|
Java
Java的static关键字详解
Java的static关键字详解
|
11天前
|
存储 Java 程序员
Java中的static关键字
Java中的static关键字
17 3
Java中的static关键字
|
30天前
|
存储 Java 编译器
【Java探索之旅】静态关键字static与代码块的奥秘
【Java探索之旅】静态关键字static与代码块的奥秘
20 0
|
1月前
|
Java
Java static关键字
`static`关键字用于修饰成员变量和方法,表示它们属于类而非对象。静态成员变量在内存中只有一份,可被所有对象共享,建议通过类名访问。实例变量每个对象独有,需通过对象访问。静态成员方法与类关联,可直接调用,不依赖对象,而实例方法需要对象来调用并能访问实例成员。在方法中,类方法不能直接访问实例成员,但实例方法可以访问类和实例成员。记得在适当时候使用`this`关键字。
22 1
|
1月前
|
设计模式 Java 开发者
Java中的static关键字
Java中的static关键字
27 0
|
1月前
|
Java
【JAVA学习之路 | 基础篇】static静态方法(类方法)
【JAVA学习之路 | 基础篇】static静态方法(类方法)
|
1月前
|
Java
【JAVA面试题】static的作用是什么?详细介绍
【JAVA面试题】static的作用是什么?详细介绍
|
1月前
|
Java
详解static关键字在Java中的各种适应场景,这个很重要!
详解static关键字在Java中的各种适应场景,这个很重要!
25 0
|
1月前
|
Java
Java基础—笔记—static篇
`static`关键字用于声明静态变量和方法,在类加载时初始化,只有一份共享内存。静态变量可通过类名或对象访问,但推荐使用类名。静态方法无`this`,不能访问实例成员,常用于工具类。静态代码块在类加载时执行一次,用于初始化静态成员。
17 0