学习Java的同学注意了!!!
学习进程中遇到甚么问题或想获得学习资源的话,欢迎加入Java学习交换群,群号码:183993990 我们1起学Java!
昨天看了1本叫做《突破程序员基本功的16课》的书,个人感觉还可以,主要对Java的技能进行了1些深入的讲授,让我对类的初始化和对象的创建有了新的认识。
1、类的初始化
对类的初始化:类的初始化1般只初始化1次,类的初始化主要是初始化静态成员变量。
类的编译决定了类的初始化进程。
编译器生成的class文件主要对定义在源文件中的类进行了以下的更改:
1) 先依照静态成员变量的定义顺序在类内部声明成员变量。
2) 再依照原java类中对成员变量的初始化顺序进行初始化。
1个java类和编译后的class对应的转换以下:
源文件:
public class Person{
public static String name="张3";
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源代码转换成1个class文件后,其转换成类似下面的代码:
public class Person{
public static String name;
public static int age;
public static String address;
static{
name="张3";
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类成员变量的初始化顺序顺次履行,所以所有的静态成员变量都是先声明,后履行赋值的,而且赋值的顺序也是依照源代码对静态成员变量初始化的顺序进行的,注意:定义1个成员变量并直接初始化与在静态代码块中进行初始化是等价的,都是根据它们在源代码中定义的顺序进行的。
2、对象的生成
对对象的生成其初始化进程与类的初始化进程类似,但会增加构造函数阶段,源代码以下:
1 public class Person{
2 {
3 name="李4";
4 age=56;
5 System.out.println("初始化age");
6 address="上海";
7 }
8 public String name="张3";
9 public int age=29;
10 public String address="北京市";
11 public Person(){
12 name="赵6";
13 age=23;
14 address="上海市";
15 }
16 }
编译器转换成class文件后,会转换成类似下面的代码:
1 public class Person{
2 public String name;
3 public int age;
4 public String address;
5 public Person(){
6 name="李4";
7 age=56;
8 System.out.println("初始化age");
9 address="上海";
10 name="张3";
11 age=29;
12 address="北京市";
13 name="赵6";
14 age=23;
15 address="上海市";
16 }
17 }
可以看到,对类中对成员变量的初始化和代码块中的代码全部都挪到了构造函数中,并且是依照java源文件的初始化顺序顺次对成员变量进行初始化的,而原构造函数中的代码则移到了构造函数的最后履行。本人之前1直对类初始化进程1直没有1个深入的理解,就是弄不清究竟是怎样初始化的,只能依照书上所说的记住了初始化顺序,但是过1段时间有给忘了,所以这次总算给弄清楚了,还是依照1个模型来解释初始化机制比较好啊,不用再背了,只有理解了才能不容易忘。
学习Java的同学注意了!!!
学习进程中遇到甚么问题或想获得学习资源的话,欢迎加入Java学习交换群,群号码:183993990 我们1起学Java!