equals() 万物为对象?该怎么处理

equals() 万物为对象?publicclassDog{StringnameStringsayspublicstaticvoidmain(String[]arg){DogD1ne

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 ";
}
}
这个程序真是简单啊!可是有什么问题呢?



1. 来自 String 的忧虑
上面这段程序中,到底有几个对象呢?
可能很多人脱口而出:两个,s1 和 s2
为什么?
String 是 final 类,它的值不可变。
看起来似乎很有道理,那么来检测一下吧,稍微改动一下程序
就可以看到结果了:

public class TestString {
public static void main(String[] args) {
String s1 = "Monday ";
String s2 = "Monday ";
if (s1 == s2)
System.out.println( "s1 == s2 ");
else
System.out.println( "s1 != s2 ");
}
}
呵呵,很多人都会说已经不止两个对象了
编译并运行程序,输出:s1 == s2
啊!
为什么 s1 == s2 ?
== 分明是在说:s1 与 s2 引用同一个 String 对象 -- "Monday "!

2. 千变万化的 String
再稍微改动一下程序,会有更奇怪的发现:
public class TestString {
public static void main(String[] args) {
String s1 = "Monday ";
String s2 = new String( "Monday ");
if (s1 == s2)
System.out.println( "s1 == s2 ");
else
System.out.println( "s1 != s2 ");
if (s1.equals(s2))
System.out.println( "s1 equals s2 ");
else
System.out.println( "s1 not equals s2 ");
}
}
我们将 s2 用 new 操作符创建
程序输出:
s1 != s2
s1 equals s2
嗯,很明显嘛
s1 s2分别引用了两个 "Monday "String对象
可是为什么两段程序不一样呢?

3. 在 String 的游泳池中游泳
哈哈,翻了翻书终于找到了答案:
原来,程序在运行的时候会创建一个字符串缓冲池
当使用 s2 = "Monday " 这样的表达是创建字符串的时候,程序首先会
在这个String缓冲池中寻找相同值的对象,在第一个程序中,s1先被
放到了池中,所以在s2被创建的时候,程序找到了具有相同值的 s1
将 s2 引用 s1 所引用的对象 "Monday "

第二段程序中,使用了 new 操作符,他明白的告诉程序:
“我要一个新的!不要旧的!”与是一个新的 "Monday "Sting对象被创
建在内存中。他们的值相同,但是位置不同,一个在池中游泳
一个在岸边休息。哎呀,真是资源浪费,明明是一样的非要分开做什么呢?