File APIs for Java Developers
Manipulate DOC, XLS, PPT, PDF and many others from your application.
http://aspose.com/file-tools
The moose likes Programmer Certification (SCJP/OCPJP) and the fly likes loops Big Moose Saloon
  Search | Java FAQ | Recent Topics | Flagged Topics | Hot Topics | Zero Replies
Register / Login


Win a copy of EJB 3 in Action this week in the EJB and other Java EE Technologies forum!
JavaRanch » Java Forums » Certification » Programmer Certification (SCJP/OCPJP)
Bookmark "loops" Watch "loops" New topic
Author

loops

aparna rudra
Greenhorn

Joined: Apr 06, 2004
Posts: 14
here are the two questions which i am not able to get. they are from the mock exams taken from certification4career.com.
Double a=new Double(Double.NAN)
Double b= new Double(Double.NAN);
if (a.equals(b))
System.out.println("true);
System.out.println("false");
here the out put is true.
wht abt this question
class MyClass
{
int maxElements;

MyClass(int maxElements)
{
this.maxElements = maxElements;
}
}
public class Q19
{
public static void main(String[] args)
{
MyClass a = new MyClass(100);
MyClass b = new MyClass(100);
if(a.equals(b))
System.out.println("Objects have the same values");
else
System.out.println("Objects have different values");
}
}
the output is objects have different values.
why is this so. whether i declare it as static or not the ouput is same. why is this?
Warren Dew
blacksmith
Ranch Hand

Joined: Mar 04, 2004
Posts: 1332
    
    1
Because in the latter case, no equals() function had been written, so it defaults to ==. You might want to read up on when and how == differs from equals(), and when they are the same.
Serghei Jelauc
Ranch Hand

Joined: Jul 24, 2002
Posts: 128
Hi.
In the second case you did not override the "public boolean equals(Object o)" method so in this case you use method wich was inherited from Object, but this method in Object class compare two objects using ==. So you have two references wich refer to two different objects and becase of it the answer is false.
In the first case a and b both represent Double.NaN and equals method returns true, even though Double.NaN == Double.NaN returns false.
[ April 06, 2004: Message edited by: Serghei Jelauc ]

SCJP 1.4 <br />SCBCD 1.3<br />SCWCD 1.4
Vishal Bhatiya
Ranch Hand

Joined: Mar 20, 2004
Posts: 32
Hi,
The equals method is inherited from the Object class which is the parent of all classes in Java. The default activity performed by this method is to check the hanles of the specified objects using == operator. This is same as using if (a == b) in your case (which won't be equal).
For this purpose, you need to overide the equals method in order to provide your own implementation.
Regarding the first example that you provided, it seems that you are getting output of true. I think this should in fact be false because you are comparing two objects having value Double.NaN. But Double.NaN.equals(Double.NaN) will always be false. Please verify this.
pallavi utukuri
Ranch Hand

Joined: Feb 10, 2004
Posts: 182
First thing we have to know is that equals() belongs to Object class�
Secondly all wrapper classes override Object.equals() now comes what does it mean to override equals() and what makes equals() return true or false�.
If Object.equals() if overridden the contents of the objects are compared the references are not compared , but both objects must be of same type. Applying this to your first question you can c Double being a wrapper class, the contents of the objects are only compared references are not�.therefore it returns true.
In your second question MyClass does not override Object.equals()�..
When Object.equals() is not overridden, references are compared the contents are not compared. Therefore objects a and b of MyClass refer to two different references so a.equals(b) returns false thought their contents are same�..i hope u got it�
To make you more confused lets c how can we override Object.equals() in MyClass

class MyClass
{
int maxElements;
MyClass(int maxElements)
{
this.maxElements = maxElements;
}
public int getValue(){
return maxElements;
}
public boolean equals(Object o){
if((o instanceof MyClass)&&(((MyClass)o).getValue()==this.maxElements)){
return true;
}
else{
return false;
}
}
}
public class Q19
{
public static void main(String[] args)
{
MyClass a = new MyClass(101);
MyClass b = new MyClass(101);
if(a.equals(b))
System.out.println("Objects have the same values");
else
System.out.println("Objects have different values");
}
}
(o instanceof MyClass) this is not necessary but to be sure that the objects being tested are of the same type this is suggested.
((MyClass)o).getValue() we are casting o to MyClass to avoid compiler error as Object class does not have get Value() method but MyClass does.
this.maxElements this returns the value of object from which the equals method was invoked��.
Now by combining all
(((MyClass)o).getValue()==this.maxElements)){
we r checking if the value if the object passes in equals() is equal to the value of the object on which equals() was invoked.
This returns Objects have the same values as now MyClass overrides Object.equals() and only the contents are compared not the references�.i hope I didn�t confuse you too much but as this is very vital for the exam u might just want to glance�..and if I am wrong anyone plz accurate me! Thanks


Thanks,<br />Pallavi
 
I agree. Here's the link: http://aspose.com/file-tools
 
subject: loops
 
Similar Threads
equivalence
equals method
overriding Object.equals()
Equals
hii