2 qq 35950680 qq_35950680 于 2016.09.14 11:31 提问

java中的一个问题,求大神帮忙解决

图片说明

equals是一个类的方法,应该只有new出来的字符串才可以调用,为什么一个定义的字符串变量也可以调用,不明白,求高手指教。

11个回答

guwei4037
guwei4037   Ds   Rxr 2016.09.14 11:30

String就是一个类啊,所以你定义的String s1 = "hellow" 就相当于 String s1 = new String("hellow");

qq_29594393
qq_29594393   Ds   Rxr 2016.09.14 11:34

你没有new 定义的字符串对象就是不是对象?,定义对象的方法有很多,不要只局限于new ,
另外,Java中从来没有过字符串变量,只有字符串对象,

chen364567628
chen364567628   2016.09.14 13:02

只要是引用类型的变量都可以调用equals方法比较,对象只是引用中的一类。

u010174402
u010174402   2016.09.14 11:36

你声明的变量是一个字符串对象,该对象的类有这个方法,当然可以调用。请去学习一下java的存储机制。

qq_35950680
qq_35950680   2016.09.14 11:42

谢谢各位,初学java,非常感谢。

yzqtt
yzqtt   2016.09.14 11:43

String就是一个类啊,所以你定义的String s1 = "hellow" 就相当于 String s1 = new String("hellow");

yuekinger
yuekinger   2016.09.14 12:21

String s1 = "hellow"
String s2 = "hellow"
我认为 String s1 ="hellow" 是不等于 String s1 = new String("hellow");
因为 你可以试一下 上面的程序:
String s1 ="hellow"
String s2 = new String("hellow");
这时 s1 == s2 结果是 false
String s1 =new String("hellow");
String s2 = new String("hellow");
这时 s1 == s2 结果是 仍然false
可是
String s1 = "hellow"
String s2 = "hellow"
s1 == s2 结果竟然是 true
原因是:s1=new String("hellow") 和 s2 =new String("hellow")是申请一块内存 并且 里面放入 字符序列hellow 然后把 这个内存的地址(java中把内存地址叫做对象实例的引用)返回给s1,和s2
这时 s1 和 s2 分别用2个地址引用 s1 s2 里边分别存储着 "hellow"和 "hellow"
所以: equlas 方法比较 内存中存储的序列是 相同的 返回 true !
== 比较 两个内存引用是否是一个 内存引用这是 返回 false :原因 因为s1,s2 分别是2个引用地址

引起歧义的是:
String s1 = "hellow"
String s2 = "hellow"
s1 == s2 结果竟然是 true
原因是
这段代码行为是:
第一步 java 虚拟机 解析String s1 = “hellow”这段指令时 new String(“hellow”)一个内存地址保存对象实例存放“hellow”序列。 记录这个内存地址引用并且把 内存地址引用返回给 s1
第二步 java 虚拟机 解析String s2 = “hellow”这段指令时 并没有 发生new String(“hellow”) 而是直接把之前 存放“hellow”内存的地址引用返回给了 s2
所以这时候 s1 和 s2 指向同一内存地址的 一个String 实例
那么 == 运算 就成立了!
equals 当然就更没有问题了。

yimi34
yimi34 String s1="hellow",s2="hellow" 这个例子中,第二步,说是把之前存放“hellow”的内存地址引用返回给了s2,那这时,s1重新赋值为“hello”,这时要重新开辟内存存放“hello”并返回引用给s1么?为什么
大约一年之前 回复
qq_25666275
qq_25666275   2016.09.14 12:51

因为它是字面将,编译器会自动将它看作一个对象,所以当然可以调用!

linwenyu925
linwenyu925   2016.09.14 14:20

equals是一个类的方法,但不应该只有new出来的字符串才可以调用,因为字符串是一个类,类的实例对象是通过该类的引用来使用类的成员方法的,虽然你给的例子是通过字面量(常量)来关联String类型的引用,但从该引用上调用String的类成员方法是没有歧义的。

bsj716891
bsj716891   2016.09.14 14:33

equals是一个类的方法,但不应该只有new出来的字符串才可以调用,因为字符串是一个类,类的实例对象是通过该类的引用来使用类的成员方法的,虽然你给的例子是通过字面量(常量)来关联String类型的引用,但从该引用上调用String的类成员方法是没有歧义的。

共11条数据 1 尾页
Csdn user default icon
上传中...
上传图片
插入图片