java 大神们,求指教

baidu_33235629 2016-05-12 10:12:45
java里
String b=new String("asdf");

b在栈中,new的string对象在堆中,请问b在栈中是否分配内存,若分配其内存里的值是这个new出来对象的地址吗,若是为什么System.out.print(b);输出的值不是这个地址,而是asdf
求各路大神前来讨论
...全文
136 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
baidu_33235629 2016-05-12
  • 打赏
  • 举报
回复
引用 2 楼 huoxin4415 的回复:
首先,System.out.print方法说明如下: public void print(String s) 打印字符串。如果参数为 null,则打印字符串 "null"。否则,按照平台的默认字符编码将字符串的字符转换为字节,并完全以 write(int) 方法的方式写入这些字节。 写入的目标就是System.out,就是标准输出流。也就是将字符串转换成字节,并写入到标准输出流。所以楼主提到的为什么输出的不是地址这个取决于System.out.print方法的实现。 其次,JAVA没有指针,虽然内部实现都是对象地址的引用,但是JAVA隐藏了这些细节来保持其简单与安全。
2楼首先感谢你的回帖 我是想问对象的引用b,在栈里是保存了堆里new的那个对象的内存吗,如果是可否认为b在栈里的内存中的值就是new的那个对象在堆里的地址
baidu_33235629 2016-05-12
  • 打赏
  • 举报
回复
引用 1 楼 ch1240249252 的回复:
new 就是存储在内存中,内存会给他分配一个位置,但是java暂时还不支持获取内存地址,只能借助工具 所以你是 绝对打印不出来地址的 再说System.out.print(b);打印的是 b这个 对象,应该是设计java语言的那个人就已经规定了,对象默认显示的就是它的值,而不是他的内存位置 hashCode也不是内存地址,也没有方法可以获取到,因为也没有意义啊 也是 挺有意思的,也挺无聊的 楼下 跟上
1楼谢谢你的回贴, string b=new String('asdf"),b是对象的引用,真正的对象是new的那个临时对象他的内存在堆里,有一段话不是说基本类型和类引用类型的分配在栈里,其它的都分配在堆里,我想问下b如果真的在栈里分配内存,那他在栈中的内存里的值是什么
baidu_33235629 2016-05-12
  • 打赏
  • 举报
回复
1楼谢谢你的回贴, string b=new String('asdf"),b是对象的引用,真正的对象是new的那个临时对象他的内存在堆里,有一段话不是说基本类型和类引用类型的分配在栈里,其它的都分配在堆里,我想问下b如果真的在栈里分配内存,那他在栈中的内存里的值是什么
奄灬苟且偷生 2016-05-12
  • 打赏
  • 举报
回复
new 就是存储在内存中,内存会给他分配一个位置,但是java暂时还不支持获取内存地址,只能借助工具 所以你是 绝对打印不出来地址的 再说System.out.print(b);打印的是 b这个 对象,应该是设计java语言的那个人就已经规定了,对象默认显示的就是它的值,而不是他的内存位置 hashCode也不是内存地址,也没有方法可以获取到,因为也没有意义啊 也是 挺有意思的,也挺无聊的 楼下 跟上
huoxin4415 2016-05-12
  • 打赏
  • 举报
回复
首先,System.out.print方法说明如下: public void print(String s) 打印字符串。如果参数为 null,则打印字符串 "null"。否则,按照平台的默认字符编码将字符串的字符转换为字节,并完全以 write(int) 方法的方式写入这些字节。 写入的目标就是System.out,就是标准输出流。也就是将字符串转换成字节,并写入到标准输出流。所以楼主提到的为什么输出的不是地址这个取决于System.out.print方法的实现。 其次,JAVA没有指针,虽然内部实现都是对象地址的引用,但是JAVA隐藏了这些细节来保持其简单与安全。

50,526

社区成员

发帖
与我相关
我的任务
社区描述
Java相关技术讨论
javaspring bootspring cloud 技术论坛(原bbs)
社区管理员
  • Java相关社区
  • 小虚竹
  • 谙忆
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧