我是一个JAVA初学者,现在遇到一个关于两个对象相等的问题,代码如下,请问各位,为什么它们的值不相等?谢谢!class object1{
private double a;
public object1(double objecta){
a = objecta ;
}
}class object2{
private double b ;
public object2(double objectb){
b = objectb;
}
}
public class TwoObjects { public static void main(String[] args) {
object1 ob1 = new object1(100.00);
object2 ob2 = new object2(100.00);
if(ob1.equals(ob2)){
System.out.println("They're equal !");
}
}

}

解决方案 »

  1.   


    因为你的object1与object2是两个不同类的对象~~
      

  2.   

    equals方法判断相等时,是看两个对象的地址是否指向同一个,如果是同一个地址,则相等,否则不相等,你object1 ob1 = new object1(100.00);
            object2 ob2 = new object2(100.00);是开辟了两个不同的内存地址,所以不相等。但用equals判断String、Date类型除外,它们只要值相等,地址不相同,也认为是相等的。
    ==用来判断基本数据类型的值相等,也可以用来判断引用数据类型,但两个引用数据类型的地址必须是同一个。
      

  3.   

    所有类的equals方法都继承自Object类(前提是你没有覆盖此方法)
    打开API看看Object类的equals方法
    Object 类的 x.equals(y) 方法,对于任何非空引用值 x 和 y,当且仅当 x 和 y 引用同一个对象时,此方法才返回 true(x == y 具有值 true)。 
    注意:当此方法被重写时,通常有必要重写 hashCode 方法,以维护 hashCode 方法的常规协定,该协定声明相等对象必须具有相等的哈希码。 在你这段代码中         object1 ob1 = new object1(100.00);
                        object2 ob2 = new object2(100.00);
    ob1和ob2没有应用自同一个对象(也不可能引用同一个对象)-他们是不同类型的变量一个object1类型,一个object2类型,所以对两个不是同一种类型的引用变量使用equals方法是没有意义的,当然二者肯定不相等
      

  4.   

    楼主遇到这个问题是没理解"==" 和 equals 的区别==是java内置的,可以理解为"相同"。
    对于简单类型来说,a=3,b=3,我们可以说a和b相同,也可以说a和b相等,都没什么问题。 
      
      .equals()是Object的方法,可以理解为"相等"。显然两个object相等并不意味着相同;但是需要注意的是,也并不意味着他们对应内存区域的所有字节都相等,比如(但不限于这个原因)他们内部可能还有自己的引用。所以,两个对象是否相等,只有这个对象自己才知道如何判断,java并不知道。所以就需要该类自己提供一个equals方法由于JAVA中除基本数据类型外其它一切都是对象,而对象变量存储的都是引用,相当于C中的指针,所以在比较对象时如String,用==是比较两个变量是否指向同一个对象,而用equals才是比较两个String的内容是否相等
      

  5.   

    eqauls 与 = =之异同1)比较方式角度:= =是面向过程的操作符;equals是面向对象的操作符= =不属于任何类,equals则是任何类(在Java中)的一个方法;我们可以1)Primitive1 (基本类型)= = Primitive2(基本类型);         2)Object Reference1(对象引用)= = Object Reference2(对象引用)         3)Object Reference1 (对象引用) .equals(Object Reference2 (对象引用))           这三种比较           但却不能Primitive1 (基本类型).equals( Primitive2(基本类型)); 对于基本类型,没有面向对象中发送消息一说,自然也不会有方法成员。 2)比较目的角度:1)    如果要比较两个基本类型是否相等,请用= =;2)    如果要比较两个对象引用是否相等,请用= =;3)    如果要比较两个对象(逻辑上)是否一致,请用equals; 对两个对象(逻辑上)是否一致的阐释:   有人会问:在C++中, 比较两个对象相等不是也可以用==吗?我知道您是指运算符重载,但是很遗憾,Java中不支持运算符重载(java中亦有重载过运算符,他们是“+”,“+=”,不过也仅此两个,而且是内置实现的);所以,对象的是否相等的比较这份责任就交由  equals()来实现 。    这个“逻辑上”其实就取决于人类的看法,实际开发中,就取决于用户的需求;有人会有看法:“取决于人类的看法”太过宽泛和不严肃,如果某人要两件风牛马不相及的事物也相等,equals是否也能作出这样的比较呢?我们说可以的下面这个例子说明了这一点:class Horse {       String Type;       int Legs;  //相等的标准:腿的数目相等       public boolean equals(Object o){          if(this.Legs==((Cattle)o).Legs){             return true;          }       return false;}public Horse(String Type,int legs){           this.Type=Type;        this.Legs=legs;}       }  class Cattle{    String Type;       int  Legs;     //相等的标准:腿的数目相等        public Cattle(String Type,int legs){           this.Type=Type;        this.Legs=legs;       }       public boolean equals(Object o){          if(this.Legs==((Horse)o).Legs){             return true;          }       return false;       } }  public class EqualsTest{public static void main(String[] args)        {              Cattle c=new Cattle("I'm the Cattle",4);            Horse h=new Horse("I'm the Horse",4);           if(c.equals(h)){                 System.out.println(c.Type);                 System.out.println(h.Type);                System.out.println("Cattle Equals Horse");            }       }} 输出结果:"I'm the Cattle"          "I'm the Horse"          "Cattle Equals Horse"
      

  6.   

    也就是说:欲比较栈中数据是否相等,请用= =;                      欲比较堆中数据是否相等,请用equals; 因为(根)基本类型,(根)对象引用都在栈中; 而对象本身在堆中;         这句话又对又不对,问题出在哪,就是“数据”二字,先看栈中,数据或为基本类型,或为对象引用,用==比较当然没错;但是堆中呢?对象不是堆中吗?不是应该用equals比较吗?可是,我们比较的是堆中“数据”,堆中有对象,对象由什么构成呢?可能是对象引用,可能是基本类型,或两者兼而有之。如果我们要比较他们,该用什么呢,用”equals()”?不对吧,只能是”= =”!所以正确的结论是:欲比较栈中数据是否相等,请用= =; 欲比较堆中数据是否相等,请用equals;因为(根)基本类型,(根)对象引用都在栈中(所谓“根”,指未被任何其他对象所包含); 而对象本身在堆中。
      

  7.   

    这里你要注意一点,就是自己写的每一个类默认都继承Object类,你之所以能够用equals方法就是这个原因。而像String等类是重写了equals方法,使他们在做equals方法的时候比较的是内容,你可以查看JDK这些方法
    Object:
    equals(Object obj) 
              指示某个其他对象是否与此对象“相等”。
    这里的相等指的是对象存放的地址是否相等,你既然new了两个对象,那就是不同的地址了String:
    public boolean equals(Object anObject)比较此字符串与指定的对象。当且仅当该参数不为 null,并且是表示与此对象相同的字符序列的 String 对象时,结果才为 true。继续努力!
      

  8.   

    你给ob1和ob2的值打印出来就知道了,这两个的值是两个内存地址如果用equal比较应该是这样 (ob1.a).equals(ob2.b)这样就是相等的,因为a和b才是值,ob1和ob2是对象.
    这里面你的a和b是private的应该改public或者创建一个get方法。
      

  9.   

    这是API中Object类中的解释:
    equals
    public boolean equals(Object obj)指示某个其他对象是否与此对象“相等”。 
    equals 方法在非空对象引用上实现相等关系: 自反性:对于任何非空引用值 x,x.equals(x) 都应返回 true。 
    对称性:对于任何非空引用值 x 和 y,当且仅当 y.equals(x) 返回 true 时,x.equals(y) 才应返回 true。 
    传递性:对于任何非空引用值 x、y 和 z,如果 x.equals(y) 返回 true,并且 y.equals(z) 返回 true,那么 x.equals(z) 应返回 true。 
    一致性:对于任何非空引用值 x 和 y,多次调用 x.equals(y) 始终返回 true 或始终返回 false,前提是对象上 equals 比较中所用的信息没有被修改。 
    对于任何非空引用值 x,x.equals(null) 都应返回 false。 
    Object 类的 equals 方法实现对象上差别可能性最大的相等关系;即,对于任何非空引用值 x 和 y,当且仅当 x 和 y 引用同一个对象时,此方法才返回 true(x == y 具有值 true)。 注意:当此方法被重写时,通常有必要重写 hashCode 方法,以维护 hashCode 方法的常规协定,该协定声明相等对象必须具有相等的哈希码。 
    参数:
    obj - 要与之比较的引用对象。 
    返回:
    如果此对象与 obj 参数相同,则返回 true;否则返回 false。
    (在Object中的equals方法在比较两个对象时其实和“==”是相同的结果,除非你重写)
      

  10.   

    class object1{ 
        private double a; 
        public object1(double objecta){ 
            a = objecta ; 
        }     public double getA(){
           return a;
     }
    } class object2{ 
        private double b ; 
        public object2(double objectb){ 
            b = objectb; 
        }     public double getB(){
           return b;
     }} 
    public class TwoObjects {     public static void main(String[] args) { 
            object1 ob1 = new object1(100.00); 
            object2 ob2 = new object2(100.00); 
            if(ob1.equals(ob2)){ 
                System.out.println("They're equal !"); 
            }        System.out.println(obj1.getA()==obj2.getB());
        } 
        
      

  11.   

    Sharpen your code-java高级群:78455879欢迎您的加入...
      

  12.   

    Sharpen your code-java高级群:78455879欢迎您的加入...