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对象,即反序列化。

posted @ 2017-02-26 20:44  哈洛加斯  阅读(801)  评论(0编辑  收藏  举报