代码如图,用equals()方法比较s1,s2,s3,s4,结果都是相等,没有重写的equals()比较的不是内存地址吗?应该和==一样才对啊?
public class Test {
public static void main(String[] args) {
// TODO Auto-generated method stub
String s1="imooc";
String s2="imooc";
String s3=new String("imooc");
String s4=new String("imooc");
System.out.println(s1==s2);
System.out.println(s1==s3);
System.out.println(s3==s4);
if(s1.equals(s3)){
System.out.println("equal.");
}else{
System.out.println("not equal.");
}
s1="Welcome to "+s1;
System.out.println(s1);
}
}并且,当我想重写equals()方法的时候,eclipse提示说不能重写,这又是为什么呢?
5 回答
已采纳
haooooo
TA贡献2条经验 获得超3个赞
1.Object类里面,equal方法默认是比较内存地址。Object源码:
public boolean equals(Object obj) { return (this == obj); }
String类里面重写了equals方法,比较的是字符串的值。因此值一样就返回true。
2.String类是final类型的,不能继承,不能重写。不能重写的并不是equals方法,而是String这个类本身就不能被继承
public final class String
妖精づ凯文
TA贡献5条经验 获得超0个赞
String类 内部已经重写了equals()方法,因而提示不能重写,只要两个字符串的字符内容相同,就返回true,不必关心内存地址。而==就要保证内存地址也得一样。
qq电子时代
TA贡献5条经验 获得超2个赞
String s2="imooc"; 与 String s3=new String("imooc");
这两个是不一样的,new 的存在就是分配地址用的,而后一种是放在常量池中的
你一下次再用这种方法去创建的时候,就会去常量池里面找,所以
String s1="imooc"; 与 String s2="imooc";
这两个是相同的,指向常量池中的"imooc"
String s3=new String("imooc"); 与 String s4=new String("imooc");
这两个是不同的地址,尽管他们的内容是一样的。
就像有两个人,他们的名字都是imooc,但是并不是一个人。
添加回答
举报
0/150
提交
取消