比如String a="你好"
a地址里保存的就是“你好”,还是保存的是“你好”的一个地址?而真正的“你好”值,在常量池里的某一个地址里保存?
String a=“你好”也是直接赋值 那和 int b=3;这个直接赋值 有什么区别?
为什么引用类型 一定要用地址引用下,不能像基本数据类型一样 直接赋值多省事?为什么还要保存个地址,然后在指向对象,不是很麻烦吗?
说的挺好的,对我很有帮助,还有点没明白,在问问,我个人理解是这样的,int a=3,因为是基本类型,不是引用类型,所以3没有常量池,在编译成class文件后,就变成32位的二进制3,此时在硬盘里躺着,当运行class文件时候,在内存开辟一个叫a的空间,然后直接把32位的3放进去,完成基本类型的赋值,这是我对基本类型赋值的理解,而且这也符合你说的保存的是值而不是引用地址!这个理解对吗?
追答你的理解有一点问题,简单数据类型都是直接存储在内存中的内存栈上的,数据本身的值就是存储在栈空间里面,而java语言里面只有这八种数据类型这种存储模型,引用则是存储在有序的内存栈上的,而对象本身的值存储在内存堆上的,它们都是在内存中,只是在内存的不同区域,本质上也都是二进制的,不会在硬盘中出现。
追问那我问你class文件如果不运行,是不是在硬盘上保存的?那里面都是编译后的二进制,不在硬盘上保存,你放哪保存?肯定是运行时候,从硬盘上加载文件到内存啊 所有程序都这么运行啊
对了,你说的栈是运行以后在真实内存上的栈内存吗?那class文件里有没有栈的说法?
class文件肯定是要存放在硬盘的,这个你说的没错,我刚才说的是运行起来以后的存放位置,class里没有栈,都是在计算机真实内存中的堆和栈等等。
追问那就对了,那就从运行class文件开始说,运行时候,你的3从哪里来,是不是肯定先在编译后的class文件里啊,而且还是32位的二进制3,运行的时候才是你说的,在计算机真实内存中的栈里开辟一个叫a的空间,然后把32位的二进制3放进去,我这么理解一点错也没有啊?你怎么说我我理解的有问题 咱先把这个搞明白,引用的就好理解了
追答不好意思,是我理解错了你的意思,你说的是在运行之前的东西,那这么理解的话是可以的,在运行以前class里所有的东西对于计算机来说都是一样的,全都是在硬盘中,然后在运行后再根据不同内容才有所区分,然后才是刚才说到的内存的东西。
追问听说栈内存的数据可以共享,比如int a=3;int b=3 ,b它是怎么个共享3?基本类型也不是引用,不可能指向地址的,难道说b指向的是a?那不就变成b保存的是a的地址了吗?那就不对了,那岂不是成引用类型了,搞不懂咋回事了
追答同志,干脆你加我qq跟你说吧,这么说太费劲了410782240
java里String类型可以直接赋值,保存的是值还是引用的地址?
首先告诉你,java里的String类型保存的就是引用地址,就像你下面说的,如果用String a="你好" 这种方式赋值的话,a里会保存一个地址,双引号字符串是常量字符串,在java文件编译的时候就放在虚拟机的常量池中,“你好”的真正位置也是在常量池中,另外还有一种方式:String a = new String("你好"),...
java里String类型可以直接赋值,保存的是值还是引用的地址?
回答通常是:一个String,内容是“Hello world!”。这样模糊的回答通常是概念不清的根源。如果要准确的回答,一半的人大概会回答错误。\\x0d\\x0a这个语句声明的是一个指向对象的引用,名为“s”,可以指向类型为String的任何对象,目前指向"Hello world!"这个String类型的对象。这就是真正发生的事情。...
java中String类型存储位置
在编译阶段会直接合并成语句String str=”JAVA”,于是会去常量池中查找是否存在”JAVA”,从而进行创建或引用。四、对于final字段,编译期直接进行了常量替换(而对于非final字段则是在运行期进行赋值处理的)。final String str1=”ja”;final String str2=”va”;String str3=str1+str2;在编译时,...
java到底是值传递还是引用传递?
首先,要明确基本类型与引用类型的区别。基本类型如 int、double、boolean 等值直接存储在变量中,而引用类型如 String、Object 等则在变量中存储实际对象的内存地址。这里的"引用"是变量指向对象实例的指针,而非传递对象本身。当使用赋值运算符 "=" 对变量进行赋值时,对于基本类型,它会直接改变变量的值...
java中String new和直接赋值的区别
Java中String new和直接赋值的区别 对于字符串:其对象的引用都是存储在栈中的,如果是编译期已经创建好(直接用双引号定义的)的就存储在常量池中,如果是运行期(new出来的)才能确定的就存储在堆中。对于equals相等的字符串,在常量池中永远只有一份,在堆中有多份。例如:String str1="ABC"; 和...
Java中String直接赋值和使用new的区别
直接赋值的String是以常量的形式存放在推中的,在同一个程序中 String a="abc";String b="abc";a==b返回的结果是true 他们指向的地址是同一个 而new会重新分配内存给每个String分配不同的内存空间 String a=new String("abc");String b=new String("abc");a==b返回的结果是false,他们...
String的比较
1、直接赋值:在常量池中创建实例,指向相同的内存地址。2、使用new关键字:在堆内存中创建实例,每个实例拥有独立的内存地址。在比较String实例时,"Java"在常量池中已有实例,因此"Java"的地址只有一份。s1和s2都保存了"Java"的地址,因此使用"=="比较返回的是true。而equals方法同样返回true,因为它...
String类及字符串常量池的学习
String 是Java编程中基础类之一,用于表示字符串类型。它与字符串常量池(String Pool)关系密切,这是JVM规范中方法区上存储字符串的一种特殊区域,用于优化字符串存储。在JDK7及以后版本,字符串常量池被移到了堆空间。String的创建有直接字面量赋值和通过new关键字两种方式。字面量赋值方式下,编译后...
java中的string是什么意思?
在Java中,String是一种预定义的数据类型,也是最常用的数据类型之一。它表示一串字符序列,包括字母、数字、符号等,以及可以为空的字符串。String可以用于存储和操作文本信息,比如用户名、密码、电子邮件地址等。String类型的变量通常用来存储字符串的值,并可以进行字符串的连接、替换、截取等操作。Java中...
java中的字符串到底是在方法区的常量池里还是new出来的对象里?
然后在内存堆中开辟一块空间存放new出来的String实例,在栈中开辟一块空间,命名为“s1”,存放的值为堆中String实例的内存地址,这个过程就是将引用s1指向new出来的String实例 第二种方式直接定义过程:在程序编译期,编译程序先去字符串常量池检查,是否存在“myString”,如果不存在,则在常量池中开辟...