黑马程序员——Java类变量和成员变量初始化过程
来源:互联网 发布:js 拖动方框 流程图 编辑:程序博客网 时间:2024/04/30 03:56
------- android培训、java培训、期待与您交流! ----------
一、类的初始化
对于类的初始化:类的初始化一般只初始化一次,类的初始化主要是初始化静态成员变量。
类的编译决定了类的初始化过程。
编译器生成的class文件主要对定义在源文件中的类进行了如下的更改:
1) 先按照静态成员变量的定义顺序在类内部声明成员变量。
2) 再按照原java类中对成员变量的初始化顺序进行初始化。
一个java类和编译后的class对应的转换如下:
源文件:
- public class Person{
- public static String name="张三";
- public static int age;
- static{
- age=20;
- System.out.println("初始化age");
- }
- public static String address;
- static{
- address="北京市";
- age=34;
- }
- public static void main(String[] args) {
- System.out.println(name);
- System.out.println(age);
- System.out.println(address);
- }
- }
当java源代码转换成一个class文件后,其转换成类似下面的代码:
- public class Person{
- public static String name;
- public static int age;
- public static String address;
- static{
- name="张三";
- age=20;
- System.out.println("初始化age");
- address="北京市";
- age=34;
- }
- public static void main(String[] args) {
- System.out.println(name);
- System.out.println(age);
- System.out.println(address);
- }
- }
初始化顺序依据转换后对应的class类成员变量的初始化顺序依次执行,所以所有的静态成员变量都是先声明,后执行赋值的,而且赋值的顺序也是依照源代码对静态成员变量初始化的顺序进行的,注意:定义一个成员变量并直接初始化与在静态代码块中进行初始化是等价的,都是依据它们在源代码中定义的顺序进行的。
二、对象的生成
对于对象的生成其初始化过程与类的初始化过程类似,但会增加构造函数阶段,源代码如下:
- public class Person{
- {
- name="李四";
- age=56;
- System.out.println("初始化age");
- address="上海";
- }
- public String name="张三";
- public int age=29;
- public String address="北京市";
- public Person(){
- name="赵六";
- age=23;
- address="上海市";
- }
- }
编译器转换成class文件后,会转换成类似下面的代码:
- public class Person{
- public String name;
- public int age;
- public String address;
- public Person(){
- name="李四";
- age=56;
- System.out.println("初始化age");
- address="上海";
- name="张三";
- age=29;
- address="北京市";
- name="赵六";
- age=23;
- address="上海市";
- }
- }
可以看到,对于类中对成员变量的初始化和代码块中的代码全部都挪到了构造函数中,并且是按照java源文件的初始化顺序依次对成员变量进行初始化的,而原构造函数中的代码则移到了构造函数的最后执行。本人以前一直对类初始化过程一直没有一个深刻的理解,就是搞不清到底是怎么初始化的,只能按照书上所说的记住了初始化顺序,但是过一段时间有给忘了,所以这次总算给弄清楚了,还是按照一个模型来解释初始化机制比较好啊,不用再背了,只有理解了才能不易忘。
------- android培训、java培训、期待与您交流! ----------
- 黑马程序员——Java类变量和成员变量初始化过程
- Java类变量和成员变量初始化过程
- Java类变量和成员变量初始化过程
- java 类变量和成员变量初始化过程
- Java类变量和成员变量初始化过程
- Java类变量和成员变量初始化过程
- Java类变量和成员变量初始化过程
- 黑马程序员——基础知识-成员方法和成员变量
- 黑马程序员---JAVA中成员变量初始化规则
- “黑马程序员” java成员变量和局部变量
- 黑马程序员--局部变量和成员变量
- 黑马程序员--成员变量和局部变量
- 黑马程序员——JAVA变量初始化的默认值
- 黑马程序员——java语言加强部分——反射之成员变量和数组
- 黑马程序员——Java基础——面向对象——局部变量和成员变量
- Java中成员变量的初始化过程
- 黑马程序员——反射之Field类 成员变量
- 黑马程序员——JAVA基础_01(类和对象的关系、成员变量和局部变量、构造函数、构造代码块)
- 黑马程序员——Java中的Enum的使用与分析
- python实现简单的登陆验证
- Linux cd切换目录命令
- 1、002 Collection介绍
- git 使用指南
- 黑马程序员——Java类变量和成员变量初始化过程
- Java类的初始化
- COCOS-3.X事件分发机制-原理
- 1、003 Collection用老式的方法遍历得出元素长度
- Java定时任务(Timer、Quartz、Spring、LinuxCron)
- Android 刮刮卡原理
- Java 单例模式详解
- 2、 001 Iterator迭代器介绍
- WAITEVENT: "latch free" Reference Note (文档 ID 34576.1)