java类的实例化(instantiation)具有显性的和隐性的区别。
一般编程时,我们锁使用new的方法实例化,这是最简单直接的显性实例化。另外还有三种实例化,分别为反射机制中的newInstance()方法,类的clone()方法 和 解串行化使用的ObjecInputStream中的getObject()方法。
而隐性的实例化则出现在java程序的整个生命周期中,包括String 、 Class ,StringBuffer 或者StringBuilder的实例化。
详细内容如下:
显性的实例化:
1.直接使用new关键字创建新的对象。
调用相应的构造函数完成实例化。(类中的非静态成员变量如果有初始化语句,都会被隐式的加入到构造函数中)代码如下:
在eclipse中装了ASM bytecode插件后,观察.class文件中的构造函数对应的字节码如下:
其中L1 , L2 ,L3,L4为debug锁使用的源代码行号标记,最后两行为方法调用的栈大小申明,
LOCALVARIABLE也为方便调试的变量声明,不用理会。
关键在于LDC"xyz"这条指令,明显可以看出,这是用于strA初始化的字符串。
由此我们可以归纳出,在没有调用 本类中其他的构造函数的情况下,每次类的构造函数中都会按如下顺序进行:
a)隐式(或显性)的调用父类的构造函数,
b)然后执行写在构造函数外的成员变量的初始化赋值
c)最后再执行构造函数中的命令。
如果是有显性的调用本类其他构造函数(必须是放在构造函数第一步执行),那么对于这个构造函数,处理过程就简单些了:
a)调用那个构造函数。
b)执行之后的代码。
执行结果为
至于为什么一定要将另外一个构造函数放在构造函数的第一步:必须先处理好heap中的变量初始化后才能下一步执行。
2.利用java反射机制(这是java动态性中的关键之一),调用java.lang.reflect.Constructor的newInstance()方法。
3.调用已存在对象的clone()方法
4.利用序列化传输对象时,在解序列化时用java.io.ObjectInputStream中的getObject()方法。
代码如下:(clone和getObject()涉及到不少其知识,在此暂不举例)
在eclipse中装了ASM bytecode插件后,直接观察.class文件对应的字节码:
实际上,这里str1 和 str2合并的过程,是使用了StringBuilder来间接完成的,首先以str1的值构造一个StringBuilder,然后调用其中的append()方法,将str2串联上来。
(值得注意的是:老版本的java使用StringBuffer完成这一步,但StringBuffer是线程安全的,效率略低,于是在新版本java中出现了非线程安全的StringBuilder,这类似于Hashtable 和 hashset的关系)
分享到:
相关推荐
本书明确而详尽地阐述了Java平台安全性,探究了Java安全结构的内幕。本书首先概述了计算机和网络安全概念并解释了Java安全模型,并在此基础上,详细描述了Java 2平台中新增加的许多安全结构方面的措施,同时对Java...
Java客户端实现Kafka生产者与消费者实例 kafka的副本机制及选举原理剖析 基于kafka实现应用日志实时上报统计分析 RabbitMQ 初步认识RabbitMQ及高可用集群部署 详解RabbitMQ消息分发机制及主题消息分发 ...
对象实例化过程 类加载器类别 BootstrapClassLoader(启动类加载器) c++编写,加载java核心库 java.*,构造ExtClassLoader和AppClassLoader。由于引导类加载器涉及到虚拟机本地实现细节,开发者无法直接获取到启动类...
目录单例模式懒汉式单例模式未初始化问题解决Double Check 双重检查方案一:不让第二步和第三步重排序-DoubleCheck方案二:基于类初始化-静态内部类饿汉式饿汉式与懒汉式最大区别序列化破坏单例模式原理枚举单例基于...
市场上相应的检测平台诸如检测通、凡特网等皆为pc端检测网站,并且操作繁琐不够人性化,用户在实地使用中存在很多问题。昆山工业技术研究院着眼于为委托用户和质检机构搭建良好的沟通桥梁,免去目前市场业务中企业...
Pig(基础脚本服务) ⽤类sql语⾔保证mr执⾏顺畅 pig latin 的执⾏环境 Hive(数据仓库存储) 基础数据仓库(ods gdm dw app dim) 基础ETL的运⾏实例 OLAP的数据存储(kylin) 各种数据的hive外表⽤于查询 对⽐impala Druid...
第9章 扩充PHP 4.0:探究PHP内核 221 9.1 概述 221 9.2 什么是Zend?什么是PHP? 221 9.3 扩充可能性 222 9.3.1 外部模块 222 9.3.2 内嵌模块 223 9.3.3 Zend引擎 223 9.4 源代码格式 223 9.4.1 宏 224 9.4.2 内存...
第9章 扩充PHP 4.0:探究PHP内核 221 9.1 概述 221 9.2 什么是Zend?什么是PHP? 221 9.3 扩充可能性 222 9.3.1 外部模块 222 9.3.2 内嵌模块 223 9.3.3 Zend引擎 223 9.4 源代码格式 223 9.4.1 宏 224 9.4.2 内存...
7. HistoryService: HistoryService用于获取正在运行或已经完成的流程实例的信息,与RuntimeService中获取的流程信息不同,历史信息包含已经持久化存储的永久信息,并已经被针对查询优化。 现在至少要知道有这些对象...