`

[基础之 - 创建了几个对象]

    博客分类:
  • Java
 
阅读更多
String s = new String("abc");创建了几个String对象?
String s = new String("abc");创建了几个String对象?

引用变量与对象的区别;
字符串文字"abc"是一个String对象;
文字池(pool of literal strings)和堆(heap)中的字符串对象。

一、引用变量与对象:除了一些早期的Java书籍和现在的垃圾书籍,人们都可以从中比较清楚地学习到两者的区别。
A aa;
这个语句声明一个类A的引用变量aa[我们常常称之为句柄],而对象一般通过new创建。所以题目中s仅仅是一个引用变量,它不是对象。

二、Java中所有的字符串文字[字符串常量]都是一个String的对象。有人[特别是C程序员]在一些场合喜欢把字符串"当作/看成"字符数组,这也没有办法,因为字符串与字符数组存在一些内在的联系。事实上,它与字符数组是两种完全不同的对象。

System.out.println("Hello".length());
char[] cc={'H','i'};
System.out.println(cc.length);

三、字符串对象的创建:
由于字符串对象的大量使用(它是一个对象,一般而言对象总是在heap分配内存),Java中为了节省内存空间和运行时间(如比较字符串时,==比equals()快),在编译阶段就把所有的字符串文字放到一个文字池(pool of literal strings)中,而运行时文字池成为常量池的一部分。文字池的好处,就是该池中所有相同的字符串常量被合并,只占用一个空间。
我们知道,对两个引用变量,使用==判断它们的值(引用)是否相等,即指向同一个对象:

String s1 = "abc" ;
String s2 = "abc" ;
if( s1 == s2 ) System.out.println("s1,s2 refer to the same object");
else System.out.println("trouble");


这里的输出显示,两个字符串文字保存为一个对象。就是说,上面的代码只在pool中创建了一个String对象。

现在看String s = new String("abc");语句,这里"abc"本身就是pool中的一个对象,而在运行时执行new String()时,
将pool中的对象复制一份放到heap中,并且把heap中的这个对象的引用交给s持有。ok,这条语句就创建了2个String对象。


String s1 = new String("abc") ;
String s2 = new String("abc") ;
if( s1 == s2 ){ //不会执行的语句}


这时用==判断就可知,虽然两个对象的"内容"相同(equals()判断),但两个引用变量所持有的引用不同,

上面的代码创建了几个String Object? (三个,pool中一个,heap中2个。)

(引用某位仁兄引用某位仁兄的。。。。。)
分享到:
评论

相关推荐

    js面向对象之常见创建对象的几种方式(工厂模式、构造函数模式、原型模式)

    虽然使用 Object构造函数 或者使用 对象字面量 可以很方便的用来创建一个对象,但这种方式有一个明显的缺点:使用一个接口创建多个对象会产生很多冗余的代码。因此为了解决这个问题,人们开始使用以下几种方式来常见...

    设计模式:可复用面向对象软件的基础 书和源码

    《设计模式:可复用面向对象软件的基础》是引导读者走出软件设计迷宫的指路明灯,凝聚了软件开发界几十年设计经验的结晶。四位顶尖的面向对象领域专家精心 选取了最具价值的设计实践,加以分类整理和命名,并用简洁而...

    新版Android开发教程.rar

    ----------------------------------- Android 编程基础 1 封面----------------------------------- Android 编程基础 2 开放手机联盟 --Open --Open --Open --Open Handset Handset Handset Handset Alliance ...

    驱动程序设计基础专题-filedisk源码分析

    定义几个IoCtrl合并宏,并定义几个结构体:MRB结构体、分区参数表等。 NTSTATUS DriverEntry()从入口点出发,嘿嘿。 具体部分已经详细在源代码注释了。 typedef struct _DEVICE_EXTENSION { BOOLEAN media_in_...

    JS 5种遍历对象的方式

    几天前一个小伙伴问我 Object.getOwnPropertyNames() 是干什么用的 ...// 创建一个对象并指定其原型,bar 为原型上的属性 const obj = Object.create({ bar: 'bar' }) // foo 为对象自身的属性 obj.foo =

    Objective-C学习笔记(一)OC基础.md

    这篇笔记主要介绍了Objective-C的一些基础知识,包括以下几个方面: 1. Objective-C概述,介绍了Objective-C的来源、发展历史和作为面向对象的C语言的特点。 2. 第一个OC程序,讲解了如何创建一个OC项目,解释了一些OC...

    java 面对对象编程.pdf.zip

    创建一个对象用什么运算符?对象实体与对象引用有何不同? 对象的相等和引用相等的区别 类的构造方法的作用是什么? 如果一个类没有声明构造方法,该程序能正确执行吗? 构造方法有哪些特点?是否可被 override? 面向...

    java 面向对象面试题

    几个常见的java基础面试题,关于java面向对象思想基础的。

    最好的3d max教程!!

    创建和编辑三维对象 1.使用弯曲修改器 2.【编辑多边形】修改器使用 3.“网格平滑”修改器的使用 4.使用多边形制作水杯-1 4.使用多边形制作水杯-2 5.用布尔运算来创建桌子 6.多种建模方式创建电脑椅-1 6.多种建模方式...

    信息技术基础-数据库管理系统.pptx

    几个常用概念 1、数据库:是指有组织地、动态地存储在辅助存储器上的,能为多个用户共享的、与应用程序能彼此独立的一组相互联着的数据集合。 2、数据库管理系统:是为了建立、使用和维护数据库而设计的数据库管理...

    零基础学ASP.NET 2.0电子书&源代码绝对完整版1

    4-10.aspx Request对象几个属性的使用。 example.htm 创建表单。 example.aspx 处理表单。 4-11.aspx 使用Server对象来获取文件路径。 4-12.aspx 使用Server对象对字符进行编码。 ...

    Visual C++实践与提高-COM和COM+篇『PDF』

    6.5.3 几个重要的类 6.5.3.1 CComModule 6.5.3.2 CComObjectRoot/CComObjectRootEx 6.5.3.3 CComCoClass 6.5.3.4 CComObject 6.6 使用ATL开发COM组件——例程ATLSample 6.6.1 创建一个新的ATL工程 6.6.2 分析工程...

    全国计算机等级考试二级python的学习笔记

    全国计算机等级考试二级Python学习笔记可以从以下几个方面进行总结: 1. Python基础知识 - Python语法基础:变量、数据类型、运算符、流程控制语句等。 - Python常用内置数据结构:列表、元组、字典、集合的定义、...

    奥鹏北语14秋《计算机基础》作业2满分答案.doc

    在资源管理器右窗口中,已选定全部文件,若要取消其中几个文件的选定,正确的操作 是( )。 A. 用鼠标右键依次单击各个要取消选定的文件 B. 用鼠标左键依次单击各个要取消选定的文件 C. 按住Ctrl键,再用鼠标左键...

    基础深化和提高-网络编程

    Java的网络编程通常涉及以下几个方面: Socket编程:基于Socket套接字,通过TCP或UDP协议进行网络通信。通过创建Socket对象,程序可以在网络上进行数据传输和通信。 URL和URLConnection:Java提供了java.net.URL和...

    Java的反射机制讲解案例代码 Class类、 获取类的结构信息:构造函数、方法和字段,动态创建对象、调用方法和设置属性

    使用反射机制的典型场景包括以下几个方面: 在运行时动态加载和创建类对象。 通过反射调用对象的方法和访问对象的字段。 根据类的信息进行序列化和反序列化操作。 实现动态代理和AOP(面向切面编程)等高级特性。 ...

    第7章-大数据分析与挖掘技术---大数据基础.pptx

    (2)聚类分析:聚类分析是一种创建数据对象集合的方法,这种数据集合也称为簇(Cluster),聚类分析力求使得同簇成员尽可能相似,异簇成员尽可能相异 (3)关联分析:关联分析是指找出多个事物之间具有的规律性...

    基于Java实现的几个基础实验

    实验5:(使用日期类 Date)编写程序创建一个 Date 对象,设置它的流逝时间分别为 10000、100000、1000000、10000000、100000000、1000000000、10000000000、100000000000 ,然后使用 toString() 方法分别显示上述...

    动力节点Java基础301集_史上最全的Java基础教程

    3:String创建几个对象,这个可以说全网最牛,不过例子举的有点猥琐,总是讲小哥哥与小姐姐的故事。 4: 源码分析分析讲的特别到位,尤其是HashMap的工作原理和源码分析,真正的把jdk源码翻了一遍,要是拿着这个去面试...

    Java问题宝典2012版

    37、下面这条语句一共创建了多少个对象:String s="a"+"b"+"c"+"d"; 26 38、try {}里有一个return语句,那么紧跟在这个try后的finally {}里的code会不会被执行,什么时候被执行,在return前还是后? 27 39、下面的...

Global site tag (gtag.js) - Google Analytics