日期:2014-05-20  浏览次数:20673 次

equals() 万物为对象?
public   class   Dog
{
String   name;
String   says;
public   static   void   main   (String   []   arg){
Dog   D1   =   new   Dog();
Dog   D2   =   new   Dog();
D1.name   =   "spot ";
D1.says   =   "Ruff! ";
D2.name   =   "scruffy ";
D2.says   =   "wurf! ";
System.out.println( "D1.name: "   +   D1.name);
System.out.println( "D1.says: "   +   D1.says);
System.out.println( "D2.name: "   +   D2.name);
System.out.println( "D2.says: "   +   D2.says);
System.out.println(D1.name   ==   D2.name);
System.out.println(D1.name.equals(D2.name));
System.out.println(D1.says   ==   D2.says);
System.out.println(D1.says.equals(D2.says));
}
};

按照API中:
equals
public   boolean   equals(Object   obj)指示其他某个对象是否与此对象“相等”。
这样的话,那么
System.out.println(D1.name.equals(D2.name));的D1.name属性和D2.Name属性也是被看作对象来使用的?
这样说来的话,那么JAVA中真的到处是对象了。

PS:我也没搞清楚我在说什么。。迷糊了。。因为think   in   java   中说到。一切都是对象。。。

------解决方案--------------------
偶认为这个问题时这样的;java中的变量有两种,一种是基本的数据类型 比如int,double,float,char..其他的就属于引用类型。虾米是引用类型呢,好吧 你比较一下
(1)int x =2;
System.out.println(x);他会打印出2 是不是
(2)int[] y = {2};
System.out.println(y);你认为它会打印出什么呢,是2吗?不是,是一串数字,这串数字是什么呢?是地址,是y数组这个对象在虚拟机中的地址。所有的java对象都是用引用类型,比如String,数组阿什么的
那么 == 与 equals()的区别在哪里呢?当你这样做 String s1 = "123 "; String s2 = "123 ";你想比较两个字符串是否相等,那很理所当然的你使用了==, 判断 s1 == s2 的结果?结果是什么呢,true?当然不是,为什么不是,前面说了它们都是引用类型,保存的都是地址,那么除非他们两个对象指向同一个地址那么s1 == s2的结果就是true了,在这里,他们指向同一个地址吗?不是的,这里创建了两个字符串对象,他们两个的地址当然不会相同,所以是false,那么我们要怎么判断两个字符串是否相同呢?用equals()方法, s1.equals(s2);他会依次比较两个字符串相应位置的字符是否相等。
如果你自己创建了对象,比如MyObject m1,m2 你要比较m1和m2是否相等,你需要覆盖实现equals()方法,如果你要判断m1是否和m2是同一个对象就用==
------解决方案--------------------
那么 == 与 equals()的区别在哪里呢?当你这样做 String s1 = "123 "; String s2 = "123 ";你想比较两个字符串是否相等,那很理所当然的你使用了==, 判断 s1 == s2 的结果?结果是什么呢,true?当然不是,为什么不是,前面说了它们都是引用类型,保存的都是地址,那么除非他们两个对象指向同一个地址那么s1 == s2的结果就是true了,在这里,他们指向同一个地址吗?不是的,这里创建了两个字符串对象,他们两个的地址当然不会相同,所以是false,那么我们要怎么判断两个字符串是否相同呢?
——————————————————————

楼上的你说的都对,非常的对,但是,我只是不明白String s1 = "123 "; String s2 = "123 ";为什么不是同一个对象呢?
------解决方案--------------------
s1= "123 "
s2= "123 "
"123 "是同一个对象 s1 s2是对他的引用 s1==s2为true
java 专门开辟了字符串存储区 不会为相同的 "xxx "开辟新的空间
所以两个 "123 "具有同一个地址 是同一个对象
------解决方案--------------------
String s1 = "123 "; String s2 = "123 ";
System.out.println(s1 == s2);

会打印true的
------解决方案--------------------
String s1 = "123 "; String s2 = "123 ";

s1==s2 时返回的 true,因为它们的值是存放在常量池中的,在池中如有该值就引用这个值,没有的话,再在常量池中新建一个。所以对于 String 而言它们的指针地址是相等的。
------解决方案--------------------

初学 Java 有段时间了,感觉似乎开始入了门,有了点儿感觉
但是发现很多困惑和疑问而且均来自于最基础的知识
折腾了一阵子又查了查书,终于对 String 这个特殊的对象有了点感悟

大家先来看看一段奇怪的程序:
public class TestString {
public static void main(String[] args) {
String s1 = "Monday ";
String s2 = "Monday ";
}
}
这个程序真是简单啊!可是有什么问题呢?