在Java中,创建一个对象通常都用new关键字,并且需要创建一个引用来跟这个对象相关联,该引用就是实际操纵其相关联对象的标识符。如下:
String s;
在这里创建的仅仅是引用并不是对象(安全的做法:在创建一个引用的同时便对其进行初始化)
String s = "asdf";
Java对象的主要存储地方:
堆栈——简称"栈",用于存储对象的引用,基于堆栈指针存储、移除数据
【优势】存储速度快,仅次于寄存器,栈数据可以共享。
【不足】编译器必须知道存储在堆栈内所有数据的确切大小和生命周期,缺乏灵活性。
主要存储基本类型(boolean、char、byte、short、int、long、float、double)和对象句柄。
【
注意】
String不是基本类型,是类。不过String类在java中比较特殊,被设计成为不可改变(immutable)的类,封装了有关字符串的操作,字符串是创建后就不可改变的;可变的对应是StringBuffer类。
1.数据共享
/*
创建了一个对象变量为a的引用,编译器首先在栈中查找是否有3这个值
if(!has 3){
把3这值存储到栈中,并使引用a指向该值;
}
*/
int a = 3;
/*
接着创建一个对象变量为b的引用,同样先查找栈中是否有3这个值
if(has 3){
把引用b指向a所指向的值3;
}
*/
int b = 3;
System.out.println(a==b);//true
/*
根据以上情况,引用a和b在栈中指向同一值,故此这两个变量相等,同时也证明了栈中共享数据。如果此时改变变量a的值,那么其引用的指向也会随之改变。也就是说编译器会重新查找栈,检查数据。那么下面变量a的引用就指向新的地址,其引用的改变不会影响变量b的引用指向。
*/
a = 4;
System.out.println(a==b);//false
2.对象引用共享
/*
String是一个特殊的包装类数据,其包括两种创建方式:
1).在栈中创建一个对String类的对象引用变量str,然后查找栈中是否存放"abc"。没有,则将"abc"存放进栈,并令str指向”abc”;再创建另一个对String类的对象引用变量s1、s2指向str这同一引用对象,查找栈中是否存放"abc"。有"abc" 则直接令s1、s2指向"abc"。
*/
String str = "abc";
String s1 = str;
String s2 = str;
System.out.println(s1==s2);//true
System.out.println(s1.equals(s2));//true
//从上面可以看到,s1和s2指向同一对象。
【
注意】
数据的共享与两个对象的引用同时指向一个对象的这种共享是不同的,因为这种情况a的修改并不会影响到b,它是由编译器完成的,有利于节省空间;而一个对象引用变量修改了这个对象的内部状态,会影响到另一个对象引用变量。
堆——用于存储所有的Java对象
【优势】编译器不需要知道数据存储块内存分配大小和生命周期,具有很大的灵活性。可以动态分配内存大小,且Java垃圾收集器会自动收回无用的数据。
【不足】由于要在运行时动态分配内存,存储速度较慢。
/*
2).用关键字new来创建新对象,它会在存放于堆中。每调用一次就会创建一个新的对象。在堆中创建新对象时,都是不管其字符串值是否相等、是否有必要创建新对象,从而加重了程序的负担。
*/
String a = new String("abc");
String b = new String("abc");
System.out.println(a==b);//false
System.out.println(a.equals(b));//true
/*
故上述说明,存放在堆里不同内存块中的两个对象不能用"=="相比较。比较类里面的数值是否相等时,用equals()方法;当测试两个包装类的引用是否指向同一个对象时,用"=="。
*/
【
注意】
我们在使用诸如String str = "abc";的格式定义类时,总是想当然地认为创建了String类的对象str。担心陷阱!对象可能并没有被创建!而可能只是指向一个先前已经创建的对象。只有通过new()方法才能保证每次都创建一个新的对象。
分享到:
相关推荐
讲述了java对象创建的详细过程,涉及到内存中是如何存储的,以及垃圾回收方式
9.java学习第九章——对象的创建和使用+构造方法+方法重载——作业的形式:创建对象在JVM中的存储状态(内存图).pdf
本文主要对比Java与C++在创建对象时的不同,仅代表个人观点,如有不合理之处,望大家批评指正。闲话少说,直奔主题。 Java和C++都是面向对象的编程语言,然而Java和C++在创建对象时却存在不同的方式,由于方式的...
Java基于Kodo对象存储的模拟文件系统源代码 使用方法: 根据AK/SK 构造配置对象 创建文件系统对象并指明 Bucket 名称和配置对象 使用文件系统在路径 / 下以overwrite的方式创建文件 test.txt,并写入三字节数据 [1, ...
第2章 Java对象持久化技术概述 2.1 直接通过JDBC API来持久化实体域对象 2.2 ORM简介 2.2.1 对象-关系映射的概念 2.2.2 ORM中间件的基本使用方法 2.2.3 常用的ORM中间件 2.3 实体域对象的其他持久化模式...
根据官网和网上分享的代码自己整理了一个阿里云OSS工具类,自动创建标准公开权限的存储空间,支持上传图片,音频,视频,PDF各种文件,批量上传,上传后支持在线预览,文件路径处理,浏览器文件下载(支持源文件中文...
java面向对象开发学生信息管理系统。
这一约束限制了程序的灵活性,所以虽然某些java数据存储于堆栈中——特别是对象引用,但是java对象并不存储其中。 3) 堆 一种通用的内存池(也位于RAM区),用于存放所有的java对象。堆不同于堆栈的好处是:编译器...
在对象创建的过程中将被容器调用,onMessage函数方法接收消息参数,将其强制转型为合适的消息类型,同时打印出消息的内容。同时一个mail note将被发送给消息发送者,发送一个e-mail通知给由recipient参数确定的e-...
下面小编就为大家带来一篇java存储以及java对象创建的流程(详解)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
掌握String字符串对象的创建 掌握字符串对象的输入与输出 一般程序需要处理大量文本数据Java语言的文本数据被保存为字符或字符串类型。 若干个字符在计算机里面如何存储? 如何引用呢? 引入 例如 ...
基础小白
1) 创建一个只能容纳String对象名为names的ArrayList集合; 2)按顺序往集合中添加5个字符串对象:"张三"、"李四"、"王五"、"马六"、"赵七"; 3)对集合进行遍历,分别打印集合中的每个元素的位置与内容; 4)打印...
java.awt.geom 提供用于在与二维几何形状相关的对象上定义和执行操作的 Java 2D 类。 java.awt.im 提供输入方法框架所需的类和接口。 java.awt.im.spi 提供启用可以与 Java 运行时环境一起使用的输入方法开发的...
冲区分配、同步对象、栈、程序计数器等准备好以后,就会创建一个操作系统原生线程。 Java 线程结束,原生线程随之被回收。操作系统负责调度所有线程,并把它们分配到任何可 用的 CPU 上。当原生线程初始化完毕,就会...
在对象创建的过程中将被容器调用,onMessage函数方法接收消息参数,将其强制转型为合适的消息类型,同时打印出消息的内容。同时一个mail note将被发送给消息发送者,发送一个e-mail通知给由recipient参数确定的e-...
在对象创建的过程中将被容器调用,onMessage函数方法接收消息参数,将其强制转型为合适的消息类型,同时打印出消息的内容。同时一个mail note将被发送给消息发送者,发送一个e-mail通知给由recipient参数确定的e-...
在对象创建的过程中将被容器调用,onMessage函数方法接收消息参数,将其强制转型为合适的消息类型,同时打印出消息的内容。同时一个mail note将被发送给消息发送者,发送一个e-mail通知给由recipient参数确定的e-...
在对象创建的过程中将被容器调用,onMessage函数方法接收消息参数,将其强制转型为合适的消息类型,同时打印出消息的内容。同时一个mail note将被发送给消息发送者,发送一个e-mail通知给由recipient参数确定的e-...