橙子lovesun
2016-05-23 08:52
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()。这是为什么啊?
谢谢。
不需要重写equals,因为String类里面已经帮我们写好了比较内容的equals,你直接调用就可以了
一旦一个字符串在内存中创建,则这个字符串将不可改变。
多次出现的字符常量,编译器程序只创建一个
注意这里是常量哦
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修饰的 静态方法中 不能直接访问非静态成员变量和方法 只可直接访问静态变量和方法 所以出现这个问题 加个就好了
希望有所帮助
不相同是应该的,相同才是因为多次优化的结果。我这里编译器允许重写equals啊。
在我的代码中,定义S3中love后面是没加空格的,s4有,所以会指向不同的单元,你可以去在确认以下,运行一下。在重写equals()时 ,提示非静态字段可以在重写方法中加入静态关键字,或者尝试下在方法前加入一个@override,希望对你有帮助
Java入门第三季
409792 学习 · 4340 问题
相似问题