java 类变量和成员变量初始化过程
2014-07-14 22:34
375 查看
昨天看了一本叫做《突破程序员基本功的16课》的书,个人感觉还可以,主要对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源文件的初始化顺序依次对成员变量进行初始化的,而原构造函数中的代码则移到了构造函数的最后执行。本人以前一直对类初始化过程一直没有一个深刻的理解,就是搞不清到底是怎么初始化的,只能按照书上所说的记住了初始化顺序,但是过一段时间有给忘了,所以这次总算给弄清楚了,还是按照一个模型来解释初始化机制比较好啊,不用再背了,只有理解了才能不易忘
转载自:http://www.cnblogs.com/lmtoo/archive/2012/04/08/2437918.html
实例参考(包含其余知识点):http://blog.csdn.net/macheng365/article/details/6403050
一、类的初始化
对于类的初始化:类的初始化一般只初始化一次,类的初始化主要是初始化静态成员变量。
类的编译决定了类的初始化过程。
编译器生成的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源文件的初始化顺序依次对成员变量进行初始化的,而原构造函数中的代码则移到了构造函数的最后执行。本人以前一直对类初始化过程一直没有一个深刻的理解,就是搞不清到底是怎么初始化的,只能按照书上所说的记住了初始化顺序,但是过一段时间有给忘了,所以这次总算给弄清楚了,还是按照一个模型来解释初始化机制比较好啊,不用再背了,只有理解了才能不易忘
转载自:http://www.cnblogs.com/lmtoo/archive/2012/04/08/2437918.html
实例参考(包含其余知识点):http://blog.csdn.net/macheng365/article/details/6403050
相关文章推荐
- Java中成员变量的初始化过程
- Java类加载过程后,成员变量的初始化。
- java初始化过程中成员变量
- Java初始化顺序总结及其程序执行过程图- 静态变量、静态代码块、成员变量、构造函数
- java基础:类变量与实例变量的初始化过程
- (已解决一部分)哪位对类的构造函数内的成员变量的初始化过程比较熟悉~帮忙看个问题
- Java类变量和成员变量初始化过程
- Java中的成员初始化顺序和内存分配过程
- Java中创建对象时,初始化成员变量的代码的执行顺序
- 深度思考Java成员变量的初始化
- Java基础——Static修饰符+静态相关+帮助文档制作+对象初始化_调用成员过程+单例设计
- JAVA实例变量的初始化过程
- java 中的 成员变量、局部变量、静态变量、类变量、非静态变量、实例变量、向前引用、非法向前引用、静态代码块、非静态代码块 执行时机
- java 类变量和实例变量的初始化
- Java初始化顺序总结 - 静态变量、静态代码块、成员变量、构造函数
- java中一个值得注意的问题---类成员初始化与变量初始化的区别
- java成员变量的初始化顺序
- java 中的 成员变量、局部变量、静态变量、类变量、非静态变量、实例变量、向前引用、非法向前引用、静态代码块、非静态代码块 执行时机
- java---面向对象vs面向过程,局部变量vs成员变量
- Java类变量和成员变量初始化过程