黑马程序员技术交流社区

标题: String s = "java"; [打印本页]

作者: hmjava520    时间: 2015-12-11 15:06
标题: String s = "java";
为什么字符串赋值给一个String类型的变量就可以调用String类的方法了?
调用的方法是从方法区中直接过去栈区里的吗?
作者: TG·小强    时间: 2015-12-11 20:33
字符串是一特殊的对象。对象当然能调用自身的方法啊。
作者: songjianzaina    时间: 2015-12-11 21:39
String s="java"; 在java语言中,String类型比较特殊,它不属于基本数据类型,它是一个类。
类类型的变量一定指向对象,因此“java”是一个对象,对象一旦创建,自然就能调用该类的方法了
作者: 马赛    时间: 2015-12-11 21:48
字符串自面子也可以看做是String类的一个对象,一旦被创建不能被改变
String s = "java";是在方法区中的常量池,s的地址指向的就是常量池中java字符串的地址
作者: 魏志林    时间: 2015-12-11 22:16
字符串类,有自身的方法,当有字符串的时候就可以直接调用它里面的方法了
作者: hmjava520    时间: 2015-12-11 22:36
马赛 发表于 2015-12-11 21:48
字符串自面子也可以看做是String类的一个对象,一旦被创建不能被改变
String s = "java";是在方法区中的常 ...

那这个对象是被创建在了栈里面还是在堆里面还是在方法区里面呢?
作者: 马赛    时间: 2015-12-11 23:06
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”。

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

难道所谓的“对象”就只是栈指向方法区的地址值吗?
作者: 牛德阳    时间: 2015-12-12 18:09
我也想发这个问题来着
作者: hmjava520    时间: 2015-12-15 21:03
牛德阳 发表于 2015-12-12 18:09
我也想发这个问题来着

哦  那看看7楼的解释吧,应该差不多是那意思!
作者: hmjava520    时间: 2015-12-15 21:04
牛德阳 发表于 2015-12-12 18:09
我也想发这个问题来着

哦  那看看7楼的解释吧,应该差不多是那意思!
作者: anuo    时间: 2015-12-16 22:24
专业水哥...不过别人的答案倒是看懂了




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2