文档章节

图解new

jaffa
 jaffa
发布于 2016/03/30 15:42
字数 571
阅读 96
收藏 4

今天在问题区中有同学在咨询和讨论new String("xyz")创建了几个String实例的问题,这类的解答网上确实有很多,大都是说两个String实例,其实没有错的,我想以此为扩展来了解一下声明类型与创建实例等各有什么不同,画了个图来更加直观的反应声明、new的过程,如下图


(1)声明一个str1变量,只在当前栈帧中分配了引用类型的空间,并没有值和在堆中分配了空间;

(2)代码的前段在同栈帧中分配了引用类型的空间,同时在堆中也分配了String实例的空间,并把实例在堆中的地址赋于栈帧中,所以这行代码可以归纳成这两个步骤,

(3)str3赋"abc"时,这时第一次出abc字面量,虚拟机对字符串的特殊处理,会在静态池中分配空间并创建实例abc,接着赋于str3。而在定义str4字面量时,已经存在abc直接赋于str4;(常量池不一定在堆中)

(4)new String("abc"),也归纳为分两步来执行,一是new在堆中分配一个String类型的空间,二将"abc"字面量赋于刚刚分配的String空间上(可以查看String源码的构造函数,内部又是一个引用),所以虽然在堆中没有再产一个abc的内存空间,但是还是有产生一个String类型实例的空间,只是内容指向同一个。所以用==的情况str3和str4是true,str4和str5是false,从创建的实例个数在有str3的情况下执行str5是新增一个,在没有str3和str4的情况下,执行str5是两个。

最后总结一个new:

1、遇到new时,先会根据new后面的类类型去计算出产生这个类实例所需要的空间;

2、根据计算的大小分配堆中内存区域;

3、new关键字不会去调用构造函数,真正构造函数的调用是后面出现的类型,如String();

 

 

© 著作权归作者所有

jaffa
粉丝 27
博文 10
码字总数 9735
作品 0
福州
程序员
私信 提问
加载中

评论(1)

chenssy89
chenssy89
顶!!
java基础重点讲解,看了还不会找我(五)

视频下载地址:https://download.csdn.net/download/xxfisgirlgad/10886817 ###05.01_Java语言基础(数组概述和定义格式说明)(了解) * A:为什么要有数组(容器) * 为了存储同种数据类型的多个值...

谢小芳是女神
2018/12/30
0
0
前端面试之理解原型/构造函数/实例(JavaScript篇)

图解 概念 构造函数 构造函数:用来初始化新创建的对象的函数是构造函数。 每一个构造函数都有一个原型对象即prototype(指针)指向的对象。 而原型对象也有一个属性constructor(构造器)指向构...

小诺哥
04/20
0
0
javascript instanceof

javascript中的instanceof http://stackoverflow.com/questions/2449254/what-is-the-instanceof-operator-in-javascript 万能的instanceof公式: function instance_of(V, F) {var O = F.pr......

cyper
2014/05/08
158
1
各种Linux操作系统版本安装图解教程下载

现在提供目前较多数人用的Linux版本图解安装方法,你可以下载到你机子上细心阅读,做为安装参考。 以下链接如一时无法下载到请稍候再连接。 一般情况下都永久有效,保证能下载的。 红旗Linux...

zt371
2009/05/08
700
0
[译] JavaScript — 继承、委托模式和对象链接

原文地址: JavaScript — Inheritance, delegation patterns and Object linking 作者: NC Patro 学习 JavaScript (原型继承) 中的继承,行为/对象委托模式和关联到其它对象的对象 什么是继...

Jeremygo
01/02
0
0

没有更多内容

加载失败,请刷新页面

加载更多

PostgreSQL 11.3 locking

rudi
今天
5
0
Mybatis Plus sql注入器

一、继承AbstractMethod /** * @author beth * @data 2019-10-23 20:39 */public class DeleteAllMethod extends AbstractMethod { @Override public MappedStatement injectMap......

一个yuanbeth
今天
13
1
一次写shell脚本的经历记录——特殊字符惹的祸

本文首发于微信公众号“我的小碗汤”,扫码文末二维码即可关注,欢迎一起交流! redis在容器化的过程中,涉及到纵向扩pod实例cpu、内存以及redis实例的maxmemory值,statefulset管理的pod需要...

码农实战
今天
4
0
为什么阿里巴巴Java开发手册中不建议在循环体中使用+进行字符串拼接?

之前在阅读《阿里巴巴Java开发手册》时,发现有一条是关于循环体中字符串拼接的建议,具体内容如下: 那么我们首先来用例子来看看在循环体中用 + 或者用 StringBuilder 进行字符串拼接的效率...

武培轩
今天
9
0
队列-链式(c/c++实现)

队列是在线性表功能稍作修改形成的,在生活中排队是不能插队的吧,先排队先得到对待,慢来得排在最后面,这样来就形成了”先进先出“的队列。作用就是通过伟大的程序员来实现算法解决现实生活...

白客C
今天
87
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部