java对象的创建过程

(1)用new 语句创建对象,这是最常用的创建对象方法。

下面用一个简单的存在继承关系的实例的创建,来叙述对象创建过程中的细节

    概括如下:

    执行顺序:(优先级从高到低。)静态代码块>main方法>构造代码块>构造方法。

     1.静态代码块:

         * 在类中方法外出现,并加上static修饰;

       * 用于给类进行初始化,为类的属性初始化.一般用于加载驱动

       * 在类加载的时候就执行,并且只执行一次。

       * 如果类中包含多个静态代码块,那么将按照"先定义的代码先执行,后定义的代码后执行"
        
       * 静态代码块不能直接访问静态实例变量和实例方法,需要通过类的实例对象来访问。
 
    2.构造代码块:
    *直接在类中定义且没有加static关键字的代码块称为{}构造代码块。
    *构造代码块在创建对象时被调用,每次创建对象都会被调用,并且构造代码块的执行次序优先于类构造函数。
     
 class Test2_Extends {
public static void main(String[] args) {
Zi z = new Zi();
}
/*
1. jvm调用了main方法,main方法进栈,因为存在继承关系,所以父类要先加载
2. new Zi();会先将Fu.class和Zi.class分别加载进内存,再创建对象.当Fu.class加载进内存,父类的静态代码块会随着Fu.class一起加载,
当Zi.class加载进内存,子类的静态代码块会随着Zi.class一起加载
--> 第一个输出,静态代码块Fu,第二个输出静态代码块Zi
3,走Zi类的构造方法,因为java中是分层初始化的,先初始化父类,再初始化子类,所以先走的父类构造,
但是在执行父类构造时,发现父类有构造代码块,构造代码块是优先于构造方法执行的
-->所以第三个输出构造代码块Fu,第四个输出构造方法Fu
4,Fu类初始化结束,子类初始化,第五个输出的是构造代码块Zi,构造方法Zi
*/
}
class Fu {
static {
System.out.println("静态代码块Fu");
}
{
System.out.println("构造代码块Fu");
}
public Fu() {
System.out.println("构造方法Fu");
}
}
class Zi extends Fu {
static {
System.out.println("静态代码块Zi");
}
{
System.out.println("构造代码块Zi");
}
public Zi() {
System.out.println("构造方法Zi");
}
}

  (2)运用反射手段,调用java.lang.Class或者java.lang.reflect.Constructor类的newInstance()实例方法。

  以上两种方式都会显示地调用类的构造方法

 

(3)调用对象的clone()方法

(4)运用反序列化手段,调用java.io.ObjectInputStream对象的readObject()方法。

  序列化:将对象状态转化为可保持或传输的格式的过程,被序列化的对象必须implments Serializable

  反序列化:将流转化成对象的过程

  当两个进程在进行远程通信时,彼此可以发送各种类型的数据。无论是何种类型的数据,都会以二进制序列的形式在网络上传送。

  发送方需要把这个Java对象转换为字节序列,即java对象序列,才能在网络上传送,即序列化过程;接收方则需要把字节序列再恢复为java对象,即反序列化。

java对象的几种创建过程的更多相关文章

  1. 面向面试编程——javascript对象的几种创建方式

    javascript对象的几种创建方式 总共有以下几个模式: 1.工厂模式 2.构造函数模式 3.原型模式 4.混合构造函数和原型模式 5.动态原型模式 6.寄生构造函数模式 7.稳妥构造函数模式 1 ...

  2. 【Java 线程的深入研究1】Java 提供了三种创建线程的方法

    Java 提供了三种创建线程的方法: 通过实现 Runnable 接口: 通过继承 Thread 类本身: 通过 Callable 和 Future 创建线程. 1.通过实现 Runnable 接口来 ...

  3. Hibernate 系列 07 - Hibernate中Java对象的三种状态

    引导目录: Hibernate 系列教程 目录 1. Java对象的三种状态 当应用通过调用Hibernate API与框架发生交互时,需要从持久化的角度关注应用对象的生命周期. 持久化声明周期是Hi ...

  4. Hibernate中Java对象的三种状态

                                                                                     Hibernate中Java对象的三种 ...

  5. OID,主键生成策略,PO VO DTO,get和load区别,脏检查,快照,java对象的三种状态

    主键生成策略 sequence 数据库端 native 数据库端 uuid  程序端 自动赋值 生成的是一个32位的16进制数  实体类需把ID改成String 类型 assigned  程序端 需手 ...

  6. hibernate中的java对象有几种状态,其相互关系如何(区别和相互转换)。

    hibernate中的java对象有几种状态,其相互关系如何(区别和相互转换). 解答:在Hibernate中,对象有三种状态:临时状态.持久状态和游离状态. 临时状态:当new一个实体对象后,这个对 ...

  7. java对象的四种引用:强引用、软引用、弱引用和虚引用

    在JDK1.2之前,创建的对象只有在处于可触及(reachable)的状态下,才能被程序使用.也就是说,若一个对象不被任何变量引用,那么程序就无法再使用这个对象.垃圾回收器一旦发现这些无用对象,就会对 ...

  8. java多线程的两种创建方式

    方式一:继承Thread类 1.创建一个继承于Thread类的子类 2.重写Thread类的run()方法---> 将此线程执行的操作声明在run()中 3.创建Thread类的子类的对象 4. ...

  9. js对象的几种创建方式和js实现继承的方式[转]

    一.js对象的创建方式 1. 使用Object构造函数来创建一个对象,下面代码创建了一个person对象,并用两种方式打印出了Name的属性值. var person = new Object(); ...

随机推荐

  1. Padding Oracle 和 CBC字节翻转攻击学习

    以前一直没时间来好好研究下这两种攻击方式,虽然都是很老的点了= =! 0x01:Padding oracle CBC加密模式为分组加密,初始时有初始向量,密钥,以及明文,明文与初始向量异或以后得到中间 ...

  2. SpringBoot2.X 静态文件配置

    Spring Boot 默认会挨个从 META/resources > resources > static > public 里面找是否存在相应的资源,如果有则直接返回. 默认配置 ...

  3. websphere gc策略调整

    根据应用服务器处理的特性,适配不同的gc策略,验证程序最适合程序的gc策略: server.xml路径: xmlcells/PBOCCell/nodes/PBOCNode01/servers/PBOC ...

  4. Request.Params用法,后台接收httpget参数

    使用Request.Params["id"]来获取参数是一种比较有效的途径. request.params其实是一个集合,它依次包括request.querystring.requ ...

  5. js window事件解析(转载)

    js-window对象的方法和属性资料 hxpd 发表于 2007-05-08 21:58:18 熟练window对象的open.close.alert.confirm.prompt.setTimeo ...

  6. Tensorflow的gRPC编程(一)

    https://blog.csdn.net/langb2014/article/details/69559182 如何用TF Serving部署TensorFlow模型 https://www.jia ...

  7. JDBC的URL

    JDBC的URL=协议名+子协议名+数据源名. 协议名总是“jdbc”. 子协议名由JDBC驱动程序的编写者决定. 数据源名也可能包含用户与口令等信息:这些信息也可单独提供. 几种常见的数据库连接 o ...

  8. Spring-AOP简单实现方式

    AOP的专业术语: 1.创建Maven管理项目: pom.xml导入依赖 <properties> <!-- springframe 版本控制 --> <spring.v ...

  9. 小米监控--Open-Falcon

    #安装下载软件yum -y install wget #更换aliyun源mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Ba ...

  10. 六十:Flask.Cookie之flask设置cookie的有效域名

    设置cookie有效域名cookie默认只能在主域名下使用,如果要在子域名下使用,则应该给set_cookie设置属性domain='.主域名',此时,此cookie在此主域名下的所有子域名均有效 f ...