Java类的初始化是什么时候?
展开全部
我们知道一个类(class)要被使用必须经过装载,连接,初始化这样的过程。下面先对这三阶段做一个简单的描述,之后会结合一个简单的例子来说明java中类的初始化过程。
在装载阶段,类装载器(Bootstrap ClassLoader 或者用户自定义的ClassLoader) 把编译形成的class文件载入内存,创建类相关的Class对象,这个Class对象封装了我们要使用的类的类型信息。
连接阶段又可以分为三个子步骤:验证、准备和解析。
验证就是要确保java类型数据格式 的正确性,并适于JVM使用。
准备阶段,JVM为静态变量分配内存空间,并设置默认值,注意,这里是设置默认值,比如说int型的变量会被赋予默认值0 。在这个阶段,JVM可能还会为一些数据结构分配内存,目的 是提高运行程序的性能,比如说方法表。
解析过程就是在类型的常量池中寻找类、接口、字段和方法的符号引用,把这些符号引用替换成直接引用。这个阶段可以被推迟到初始化之后,当程序运行的过程中真正使用某个符号引用的时候 再去解析它。
类会在首次被“主动使用”时执行初始化,为类(静态)变量赋予正确的初始值。在Java代码中,一个正确的初始值是通过类变量初始化语句或者静态初始化块给出的。而我们这里所说的主动使用 包括:
1. 创建类的实例
2. 调用类的静态方法
3. 使用类的非常量静态字段
4. 调用Java API中的某些反射方法
5. 初始化某个类的子类
6. 含有main()方法的类启动时
初始化一个类包括两个步骤:
1、 如果类存在直接父类的话,且直接父类还没有被初始化,则先初始化其直接父类
2、 如果类存在一个初始化方法,就执行此方法
注:初始化接口并不需要初始化它的父接口。
在装载阶段,类装载器(Bootstrap ClassLoader 或者用户自定义的ClassLoader) 把编译形成的class文件载入内存,创建类相关的Class对象,这个Class对象封装了我们要使用的类的类型信息。
连接阶段又可以分为三个子步骤:验证、准备和解析。
验证就是要确保java类型数据格式 的正确性,并适于JVM使用。
准备阶段,JVM为静态变量分配内存空间,并设置默认值,注意,这里是设置默认值,比如说int型的变量会被赋予默认值0 。在这个阶段,JVM可能还会为一些数据结构分配内存,目的 是提高运行程序的性能,比如说方法表。
解析过程就是在类型的常量池中寻找类、接口、字段和方法的符号引用,把这些符号引用替换成直接引用。这个阶段可以被推迟到初始化之后,当程序运行的过程中真正使用某个符号引用的时候 再去解析它。
类会在首次被“主动使用”时执行初始化,为类(静态)变量赋予正确的初始值。在Java代码中,一个正确的初始值是通过类变量初始化语句或者静态初始化块给出的。而我们这里所说的主动使用 包括:
1. 创建类的实例
2. 调用类的静态方法
3. 使用类的非常量静态字段
4. 调用Java API中的某些反射方法
5. 初始化某个类的子类
6. 含有main()方法的类启动时
初始化一个类包括两个步骤:
1、 如果类存在直接父类的话,且直接父类还没有被初始化,则先初始化其直接父类
2、 如果类存在一个初始化方法,就执行此方法
注:初始化接口并不需要初始化它的父接口。
追问
你这不是初始化实例么
展开全部
1.new一个Person对象,系统回去寻找Person.class文件,并把这个文件加载到内存中。
2.我们知道,类成员和类方法可以分为静态的和非静态的,静态的成员与方法优先存在于内存,因为静态成员,方法是属于类的,非静态成员,方法是属于对象的,所以第二步 会将类中声明的静态方法,成员加载到共享内存中。处于静态代码块(即static{...}中的语句)的代码会被执行。
3.新建Person对象,在堆内存中开辟一块空间用于存放这个Person对象。
4.在分配到的Person所在位置的内存中创建类的特有属性(即非静态成员),并进行默认的初始化工作。
5.对类的特有属性进行显示初始化操作(即声明属性时就给他赋上默认的值private String name = "lisi")。
6.执行初始化代码块中的语句(即{...}中的语句)。
7.根据传入的参数选择合适的构造函数,对对象进行初始化操作。
8.在栈中开辟一段空间,存放引用变量p,并将Person对象所在的内存地址赋给引用变量p。
可以看一下我写的日志http://blog.csdn.net/hua583999775/article/details/20008795
2.我们知道,类成员和类方法可以分为静态的和非静态的,静态的成员与方法优先存在于内存,因为静态成员,方法是属于类的,非静态成员,方法是属于对象的,所以第二步 会将类中声明的静态方法,成员加载到共享内存中。处于静态代码块(即static{...}中的语句)的代码会被执行。
3.新建Person对象,在堆内存中开辟一块空间用于存放这个Person对象。
4.在分配到的Person所在位置的内存中创建类的特有属性(即非静态成员),并进行默认的初始化工作。
5.对类的特有属性进行显示初始化操作(即声明属性时就给他赋上默认的值private String name = "lisi")。
6.执行初始化代码块中的语句(即{...}中的语句)。
7.根据传入的参数选择合适的构造函数,对对象进行初始化操作。
8.在栈中开辟一段空间,存放引用变量p,并将Person对象所在的内存地址赋给引用变量p。
可以看一下我写的日志http://blog.csdn.net/hua583999775/article/details/20008795
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
创建对象 new的时候
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询
广告 您可能关注的内容 |