Java常见问题之初始化步骤
发布时间:2021-12-11 09:49:32 所属栏目:PHP教程 来源:互联网
导读:假设有个名为Dog的类 对于静态字段: 1. 当Dog类的静态字段/静态方法首次被访问时(首次创建类型为Dog的对象时也会加载Dog.class文件,可以把构造器看做是static的),Java解释器会查找类路径,以定位Dog.class文件。 2. 载入Dog.class,此时初始化所有静态
假设有个名为Dog的类 对于静态字段: 1. 当Dog类的静态字段/静态方法首次被访问时(首次创建类型为Dog的对象时也会加载Dog.class文件,可以把构造器看做是static的),Java解释器会查找类路径,以定位Dog.class文件。 2. 载入Dog.class,此时初始化所有静态字段,如果没有对静态字段进行显示初始化,则默认将所有基本类型字段都设置成标准初值,而引用字段被设置成null。 对于非静态字段: 1. 当创建类型为Dog的对象时,首先将在堆上为该对象分配存储空间,且存储空间会被清零,这就将所有基本类型字段都设置成了标准初值,而引用字段被设置成了null。 2. 执行所有出现于字段定义处的初始化动作。 3. 执行构造器。 假设类Dog有一个父类Animal 对于静态字段: 1. 当Dog类的静态字段/静态方法首次被访问时(首次创建类型为Dog的对象时也会加载Dog.class文件,可以把构造器看做是static的),Java解释器会查找类路径,以定位Dog.class文件。 2. 当载入Dog.class时,编译器注意到它有一个父类Animal,于是继续加载Animal.class,此时首先初始化类Animal的所有静态字段,然后初始化类Dog的所有静态字段。如果没有对静态字段进行显示初始化,则默认将所有基本类型字段都设置成标准初值,而引用字段被设置成null。 对于非静态字段: 1. 当创建类型为Dog的对象时,首先将在堆上为该对象分配存储空间,且存储空间会被清零,这就将所有基本类型字段都设置成了标准初值,而引用字段被设置成了null。 2. 执行子类Dog的构造器中的super()语句来调用父类Animal的构造器,这个过程通常是隐含进行的,详情见Java常见问题之this()和super()的用法。父类Animal的构造器继续按照步骤2、3、4的顺序递归进行。 注意:如果父类的构造器中调用了被子类覆盖的方法,则此时实际调用的是子类的方法,即在对象完全创建好之间,多态就已经开始发挥作用了,而此时子类对象的某些字段还没有完成初始化,而如果该方法又使用了这些字段,则会出现逻辑错误,所以尽量不要在构造器中调用除final以外的方法。 3. 执行子类Dog中所有出现于字段定义处的初始化动作。 4. 执行子类Dog的构造器中的剩余部分。 注意: 静态字段只会在加载class文件时进行一次初始化操作。 每次创建类型为Dog的对象时,都会对非静态字段进行初始化操作。 静态字段由Dog类的所有对象共享,只占用一份存储区域。 非静态字段是与Dog类的对象相关联的,每个对象都有自己独立的存储区域。 当首次创建类型为Dog的对象时,会先初始化静态字段,再初始化非静态字段。 Dog类的静态字段/静态方法首次被访问时,只会初始化静态字段,不会初始化非静态字段。 (编辑:应用网_丽江站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |