为了账号安全,请及时绑定邮箱和手机立即绑定

有关练习中s3,s4的以及equals()方法的使用

String s1 = "imooc";

String s2 = "imooc";

String s3= "I love "+ s1; 

String s4 = "I love " + s1;

代码中的定义,并没有用到new,不应该同s1,s2的理解(多次出现的字符常量,编译器程序只创建一个)一样么?s3,s4为什么是指向的不同单元啊?


因(s3==s4)比较的是s3和s4引用所指向的内存单元的地址,如需比较s3,s4的值重写equals()方法。可是为什么编译器不允许重写?提示:此类中没有非静态字段,不能重写equals()。这是为什么啊?


谢谢。


正在回答

4 回答

不需要重写equals,因为String类里面已经帮我们写好了比较内容的equals,你直接调用就可以了

0 回复 有任何疑惑可以回复我~

一旦一个字符串在内存中创建,则这个字符串将不可改变。

多次出现的字符常量,编译器程序只创建一个

注意这里是常量哦

String s1 = "imooc";
String s2 = "imooc";
//String s3 = "I love " + s1;
//String s4 = "I love " + s1;

String s3 = "I love " + s1;
s1 = "Mary";
String s4 = "I love " + s1;

通过 String s3="I love"+s1; ,其实质是根据s1创建了字符串对象,变量 s3 指向了创建的字符串对象。

通过 String s4="I love"+s1; ,其实质是根据s1创建了新的字符串对象,变量 s4 指向了新创建的字符串对象。

这是两个不同的对象 上面的代码 帮助理解一下


此类中没有非静态字段,不能重写equals()。

上次碰到这个问题 是在主方法里进行调试的时候 main()方法是static修饰的 静态方法中 不能直接访问非静态成员变量和方法 只可直接访问静态变量和方法 所以出现这个问题 加个就好了

希望有所帮助

1 回复 有任何疑惑可以回复我~

不相同是应该的,相同才是因为多次优化的结果。我这里编译器允许重写equals啊。

0 回复 有任何疑惑可以回复我~

在我的代码中,定义S3中love后面是没加空格的,s4有,所以会指向不同的单元,你可以去在确认以下,运行一下。在重写equals()时 ,提示非静态字段可以在重写方法中加入静态关键字,或者尝试下在方法前加入一个@override,希望对你有帮助

0 回复 有任何疑惑可以回复我~

举报

0/150
提交
取消
Java入门第三季
  • 参与学习       409792    人
  • 解答问题       4340    个

Java中你必须懂得常用技能,不容错过的精彩,快来加入吧

进入课程

有关练习中s3,s4的以及equals()方法的使用

我要回答 关注问题
意见反馈 帮助中心 APP下载
官方微信