A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© hmjava520 中级黑马   /  2015-12-11 15:06  /  1546 人查看  /  14 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

为什么字符串赋值给一个String类型的变量就可以调用String类的方法了?
调用的方法是从方法区中直接过去栈区里的吗?

14 个回复

倒序浏览
字符串是一特殊的对象。对象当然能调用自身的方法啊。
回复 使用道具 举报
String s="java"; 在java语言中,String类型比较特殊,它不属于基本数据类型,它是一个类。
类类型的变量一定指向对象,因此“java”是一个对象,对象一旦创建,自然就能调用该类的方法了
回复 使用道具 举报
字符串自面子也可以看做是String类的一个对象,一旦被创建不能被改变
String s = "java";是在方法区中的常量池,s的地址指向的就是常量池中java字符串的地址
回复 使用道具 举报
字符串类,有自身的方法,当有字符串的时候就可以直接调用它里面的方法了
回复 使用道具 举报
马赛 发表于 2015-12-11 21:48
字符串自面子也可以看做是String类的一个对象,一旦被创建不能被改变
String s = "java";是在方法区中的常 ...

那这个对象是被创建在了栈里面还是在堆里面还是在方法区里面呢?
回复 使用道具 举报
马赛 中级黑马 2015-12-11 23:06:54
7#
hmjava520 发表于 2015-12-11 22:36
那这个对象是被创建在了栈里面还是在堆里面还是在方法区里面呢?

首先得知道创建对象是不会在栈内存里操作的。如果是new出来的对象会在堆内存里开辟空间。
String s = "java";是在方法区的常量池里,创建以后把地址传给栈内存中的s,如果再想给s赋值
比如 s = "hello"; 现在的操作就是在常量池里操作的,要判断常量池里有没有"hello"这个常量,如果有,
就把“hello”的地址传给s,如果没有会分配一块空间给"hello",再把地址值传给s

而String s = new String("java");会在堆内存中给new出来的对象开辟一个空间,同时在常量池中也给字符串
“java”开辟了空间,相当于创建了两个对象,栈内存中s接收到的是堆内存中对象的地址值,常量池中的对象相当于是new出来对象的模版,从模版取值。栈内存s指向堆内存new出来的对象,对象指向常量池中的“java”。

这是我自己的一些理解,可能会有理解上从错误,毕竟我也是新手
回复 使用道具 举报
字符串定义的功能是属于java.lang包下的,可以不用导包记就可以直接调用对象的功能。
回复 使用道具 举报
7楼答的好棒o(≧v≦)o~~
回复 使用道具 举报
七楼答的好棒~~~我虽然不太清楚,不过我凭记忆他说的应该很对~~~
回复 使用道具 举报
马赛 发表于 2015-12-11 23:06
首先得知道创建对象是不会在栈内存里操作的。如果是new出来的对象会在堆内存里开辟空间。
String s = "ja ...

难道所谓的“对象”就只是栈指向方法区的地址值吗?
回复 使用道具 举报
我也想发这个问题来着
回复 使用道具 举报
牛德阳 发表于 2015-12-12 18:09
我也想发这个问题来着

哦  那看看7楼的解释吧,应该差不多是那意思!
回复 使用道具 举报
牛德阳 发表于 2015-12-12 18:09
我也想发这个问题来着

哦  那看看7楼的解释吧,应该差不多是那意思!
回复 使用道具 举报
anuo 中级黑马 2015-12-16 22:24:12
15#
专业水哥...不过别人的答案倒是看懂了
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马