aspose file tools*
The moose likes Programmer Certification (SCJP/OCPJP) and the fly likes Hi Big Moose Saloon
  Search | Java FAQ | Recent Topics | Flagged Topics | Hot Topics | Zero Replies
Register / Login
JavaRanch » Java Forums » Certification » Programmer Certification (SCJP/OCPJP)
Bookmark "Hi" Watch "Hi" New topic
Author

Hi

rajani adapa
Ranch Hand

Joined: Jan 24, 2001
Posts: 54
class MyClass
{
int maxElements;
MyClass()
{
System.out.println("true");
}

MyClass(int maxElements)
{
this.maxElements = maxElements;
}

}

public class Q19 extends MyClass
{
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");
}
}
output bjects have different values
my expected output bjects have same values
Son Le
Greenhorn

Joined: Jan 15, 2001
Posts: 21
Rajani,
When you call the equals() method, you're actually calling the equals() method from class Object. You need to override this method then your code should be ok.
Here's an example:

Hungson Le
[This message has been edited by Son Le (edited January 24, 2001).]
[This message has been edited by Son Le (edited January 24, 2001).]


-LHS
Golam Newaz
Ranch Hand

Joined: Jan 08, 2001
Posts: 64
Hi,
I did a little modify on your program. Nothing just assign
your b reference value into a then i got the result of
the "Objects have the same values". Look, you make the
different memory location for a and for b reference. Both a
and b are not in the same memory location whether object name
is the same i.e. MyClass.Look if you use the following statement
it would give the same effect.
myClass a= new myClass(100);
myClass b= a; // Because you are assigning
the copy of referece a to b
Whether object is same.
Also your Constructor a and b are replacing default
constructor of Myclass i.e. without parameters constructor.
It is no relationship with Constructor having int parameters.
class myClass{
myClass(){}
int maxElements;
myClass( int maxElements){
maxElements=maxElements;
}
}
public class ChildClass{
public static void main( String argv[] ) {
myClass a= new myClass(100);
myClass b= new myClass();
a=b;
if (a.equals(b))
System.out.println("Objects have the same values");
else
System.out.println("This is the different values");
}
}
rajani adapa
Ranch Hand

Joined: Jan 24, 2001
Posts: 54
Thank u guys sanle and golam,
but can u tell me the reason y my code is not working
Golam Newaz
Ranch Hand

Joined: Jan 08, 2001
Posts: 64
The things you are looking for, you will get it at the following
example.
1. Given the following classes defined in separate files:
If you run this program, you would get answer n. 3 :
Vehicle drive.
Car drive.
Car drive.

As same i gave you the before example.
class Vehicle {
public void drive() {
System.out.println("Vehicle: drive");
}
}

class Car extends Vehicle {
public void drive() {
System.out.println("Car: drive");
}
}

public class Test {
public static void main (String args []) {
Vehicle v;
Car c;
v = new Vehicle();
c = new Car();
v.drive();
c.drive();
v = c;
v.drive();
}
}

What will be the effect of compiling and running this class Test?
1.Generates a Compiler error on the statement v= c;
2. Generates runtime error on the statement v= c;
3. Prints out:
Vehicle: drive
Car: drive
Car: drive
4. Prints out:
Vehicle: drive
Car: drive
Vehicle: drive
Select the most appropriate answer.
Thanks,
Golam Sayeed
Shikha Sood
Greenhorn

Joined: Jan 24, 2001
Posts: 9
Hello rajani adapa
U r getting the output as different because u r making two obejcts of the same class which are two different reference
so when u will
compare they will refer to different address locations.
That's why the output is different values
But as u see the Goalm exm. When u assign one object reference to another object refernce then both becomes alias and refer to same address location.
so if u will do a = b or b = a then u 'll get the output as sames values
Hope this clears ur doubt.
Thanx
rajani adapa
Ranch Hand

Joined: Jan 24, 2001
Posts: 54
o.k.
Then how come this results true.
Double d1=new Double(12.0);
Double d2=new Double(12.0);
and d1.equals(d2)=true;
Latha Kalaga
Ranch Hand

Joined: Nov 13, 2000
Posts: 96
Hi! Rajani
The reason the answer is "true" is because you are :
1. Comparing two Objects belonging to the same wrapper class
i.e both are Double's
2. And both these Objects contain the same value 12.0.
When comparing two Objects with equals, Java first ensures that you are comparing Objects of the same type, if that is true then it verifies the actual contents in the objects.
Hope this helps.
Latha
Manfred Leonhardt
Ranch Hand

Joined: Jan 09, 2001
Posts: 1492
Rajani,
Short answer:
In your first example you are calling the Object equals method (MyClass doesn't override equals). It checks to see if both references are pointing to same memory location. Yours are not because you created two separate objects.
In your Double you are calling the Double equals method which has overridden the Object one. It checks to see if the value contained in each object is the same. Yours are: both 12.0!
Regards,
Manfred.
Golam Newaz
Ranch Hand

Joined: Jan 08, 2001
Posts: 64
Now it is very tricky question to me.
1. Note that in most cases, for two instances of class Double,
d1 and d2, the value of d1.equals(d2) is true
if and only if
d1.doubleValue() == d2.doubleValue()

also has the value true. However, there are two exceptions:
If d1 and d2 both represent Double.NaN, then the equals
method returns true, even though
Double.NaN==Double.NaN has the value false.

If d1 represents +0.0 while d2 represents -0.0, or vice versa,
the equal test has the value false,even though +0.0==-0.0 has
the value true. This allows hashtables to operate properly.
2. Double is a final type class object. So as per jdk1.2 , final
classes can't Sub classes, in where your myClass is not final
so it can be Subclass i.e. you can extend your myClass. Kindly
check your program changing like final class myClass{} and
make two instance in another class, it would give "objects
have the same values" without assigning a copy of reference.
3. Your Class is not primitive type Object class, where Double,
Integer, Float are primitve double, int , float type Object
class.
I hope it would be hlpeful for you,
Thanks,
Golam Sayeed Newaz
rajani adapa
Ranch Hand

Joined: Jan 24, 2001
Posts: 54
Thanks for all for a great explanation
Golam Newaz
Ranch Hand

Joined: Jan 08, 2001
Posts: 64
Hi,
I came up again with nice example about equal problem.
Kindly notice display which is the output of TestEqual.java.
QUOTE:
public class TestEqual
{
public static void main (String[] args) {
// Long and Integer classes has overided the equals method
Long l1 = new Long(7);
Long l2 = new Long(7);

if (l1 == l2)
System.out.println("l1 == l2");
else
System.out.println("l1 != l2"); // display

if (l1.equals(l2))
System.out.println("l1.equals(l2)"); // display
else
System.out.println("NOT l1.equals(l2)");

Integer i = new Integer(7);

// Not compilable
// Incompatible type for java.lang.Integer
// cannot convert Integer to Long
//if (i == l1)
// System.out.println("i == l1");

// Using the equals method on a diff type always produces
// false, regardless of content
if (i.equals(l1))
System.out.println("i.equals(l1)");
else
System.out.println("NOT i.equals(l1)");// display


// String class has overrided the equals method
String s1 = new String("700");
String s2 = "700";
String s3 = "700";
String s4 = new String("700");

// different object references
if (s4 == s1)
System.out.println("s4 == s1");
else
System.out.println("s4 != s1");// display

if (s4.equals(s1))
System.out.println("s4.equals(s1)");// display
else
System.out.println("NOT s4.equals(s1)");

// s2 and s3 are actually pointing to the same literal
if (s3 == s2)
System.out.println("s3 == s2");// display
else
System.out.println("s3 != s2");

if (s1.equals(s2))
System.out.println("s1.equals(s2)");// display
else
System.out.println("NOT s1.equals(s2)");


// User defined class extends Objects
// Override equals methods will make a difference
NotOverrideEquals noe1 = new NotOverrideEquals(3);
NotOverrideEquals noe2 = new NotOverrideEquals(3);

// default implementation is compare the obj reference
if (noe1.equals(noe2))
System.out.println("noe1.equals(noe2)");
else
System.out.println("NOT noe1.equals(noe2)");// display


OverrideEquals oe1 = new OverrideEquals(3);
OverrideEquals oe2 = new OverrideEquals(3);

// the default behavior is overrided
if (oe1.equals(oe2))
System.out.println("oe1.equals(oe2)"); // display
else
System.out.println("NOT oe1.equals(oe2)");
}
}
class NotOverrideEquals {
int nn;
NotOverrideEquals(int n) {nn = n;}
}
class OverrideEquals {
int nn;
OverrideEquals(int n) {nn = n;}

// override the Object equal method
public boolean equals(Object obj) {
if ( !(obj instanceof OverrideEquals) )
return false;

OverrideEquals o = (OverrideEquals)obj;
return (nn == o.nn);
}
}
UNQUOTE:
Thanks,
Golam Sayeed Newaz
 
 
subject: Hi