java对象的几种创建过程
java对象的创建过程
(1)用new 语句创建对象,这是最常用的创建对象方法。
下面用一个简单的存在继承关系的实例的创建,来叙述对象创建过程中的细节
概括如下:
执行顺序:(优先级从高到低。)静态代码块>main方法>构造代码块>构造方法。
1.静态代码块:
* 在类中方法外出现,并加上static修饰;
* 用于给类进行初始化,为类的属性初始化.一般用于加载驱动
* 在类加载的时候就执行,并且只执行一次。
* 如果类中包含多个静态代码块,那么将按照"先定义的代码先执行,后定义的代码后执行"
* 静态代码块不能直接访问静态实例变量和实例方法,需要通过类的实例对象来访问。
2.构造代码块:
*直接在类中定义且没有加static关键字的代码块称为{}构造代码块。
*构造代码块在创建对象时被调用,每次创建对象都会被调用,并且构造代码块的执行次序优先于类构造函数。
1 class Test2_Extends {
2 public static void main(String[] args) {
3 Zi z = new Zi();
4 }
5 /*
6 1. jvm调用了main方法,main方法进栈,因为存在继承关系,所以父类要先加载
7 2. new Zi();会先将Fu.class和Zi.class分别加载进内存,再创建对象.当Fu.class加载进内存,父类的静态代码块会随着Fu.class一起加载,
8 当Zi.class加载进内存,子类的静态代码块会随着Zi.class一起加载
9 --> 第一个输出,静态代码块Fu,第二个输出静态代码块Zi
10 3,走Zi类的构造方法,因为java中是分层初始化的,先初始化父类,再初始化子类,所以先走的父类构造,
11 但是在执行父类构造时,发现父类有构造代码块,构造代码块是优先于构造方法执行的
12 -->所以第三个输出构造代码块Fu,第四个输出构造方法Fu
13 4,Fu类初始化结束,子类初始化,第五个输出的是构造代码块Zi,构造方法Zi
14 */
15 }
16 class Fu {
17 static {
18 System.out.println("静态代码块Fu");
19 }
20 {
21 System.out.println("构造代码块Fu");
22 }
23 public Fu() {
24 System.out.println("构造方法Fu");
25 }
26 }
27 class Zi extends Fu {
28 static {
29 System.out.println("静态代码块Zi");
30 }
31 {
32 System.out.println("构造代码块Zi");
33 }
34 public Zi() {
35 System.out.println("构造方法Zi");
36 }
37 }
(2)运用反射手段,调用java.lang.Class或者java.lang.reflect.Constructor类的newInstance()实例方法。
以上两种方式都会显示地调用类的构造方法
(3)调用对象的clone()方法
(4)运用反序列化手段,调用java.io.ObjectInputStream对象的readObject()方法。
序列化:将对象状态转化为可保持或传输的格式的过程,被序列化的对象必须implments Serializable
反序列化:将流转化成对象的过程
当两个进程在进行远程通信时,彼此可以发送各种类型的数据。无论是何种类型的数据,都会以二进制序列的形式在网络上传送。
发送方需要把这个Java对象转换为字节序列,即java对象序列,才能在网络上传送,即序列化过程;接收方则需要把字节序列再恢复为java对象,即反序列化。