Java Quiz of The Day - same private field instance for two classes
What is the smallest change to main method that makes it sysout "true"?
You are allowed to change ONLY the main method! Of course changing sysout line is out of question.
You can leave your answer in comments and I'll publish/approve them together with the solution.
I'll post the correct answer in 24h :)
UPDATE: Was not that hard afterall! :) ~45 correct answers.
Yes, clone() was the answer I was looking for:
-
MyClass cl2 = (MyClass) cl1.clone();
Ed Merks surprised with a nice solution:
-
//Add this line as the first line of main.
-
class MyClass extends InstanceDemo.MyClass {
-
Object ocl = null;
-
}
And a lot of people took the hard-core way:
-
field.setAccessible(true);
-
field.set(cl2,cl1.ocl);
:)
49 Comments »
RSS feed for comments on this post.







The most obvious answer would be:
- MyClass cl2 = new MyClass();
+ MyClass cl2 = cl1.clone();
Comment by Roland Tepp — December 1, 2008 @ Monday, December 1, 12:43 pm
My 0.02 are on "cl2=(MyClass)cl1.clone();" right before the println.
dominikg
Comment by dominikg — December 1, 2008 @ Monday, December 1, 12:43 pm
is it the good answer ?
MyClass cl2 = (MyClass) cl1.clone();
Comment by Tristan — December 1, 2008 @ Monday, December 1, 12:45 pm
MyClass cl2 = (MyClass) cl1.clone();
Gilles QUERRET
Comment by Gilles QUERRET — December 1, 2008 @ Monday, December 1, 12:57 pm
change line 2 in main to
MyClass cl2 = (MyClass)cl1.clone();
Comment by fillg1 — December 1, 2008 @ Monday, December 1, 1:12 pm
public static void main(String[] args)
{
final MyClass cl1 = new MyClass();
MyClass cl2 = new MyClass()
{
{
try
{
Field firstNameField = MyClass.class.getDeclaredField("ocl");
firstNameField.setAccessible(true);
firstNameField.set(this, cl1.ocl);
}
catch (Exception e)
{
// ignore
}
}
};
System.out.println(cl1.ocl == cl2.ocl && cl1 != cl2);
}
Comment by Sergiy — December 1, 2008 @ Monday, December 1, 1:16 pm
From the master hackers of dow.ngra.de:
------------------------------------------
public static void main(String[] args) throws Exception {
class MyClass { Object ocl = null;}
MyClass cl1 = new MyClass();
MyClass cl2 = new MyClass();
System.out.println(cl1.ocl == cl2.ocl && cl1 != cl2);
}
------------------------------------------
Comment by Toomas Römer — December 1, 2008 @ Monday, December 1, 1:26 pm
My first guess was to break into MyClass with reflection and to change the ocl attribute. But it actually is much easier: Instead of
MyClass cl2 = new MyClass();Say
MyClass cl2 = (MyClass) cl1.clone();I was sure that the "extends ArrayList" was there for a reason, it just took me a moment to figure it out. :-)
Nice.
Comment by marko schulz — December 1, 2008 @ Monday, December 1, 1:33 pm
Add this line as the first line of main.
class MyClass extends InstanceDemo.MyClass {
Object ocl = null;
}
Comment by Ed Merks — December 1, 2008 @ Monday, December 1, 1:35 pm
Hi here is an answer :
MyClass cl1 = new MyClass();
MyClass cl2 = (MyClass) cl1.clone();
System.out.println(cl1.ocl == cl2.ocl && cl1 != cl2);
Is there any practical case where this can be useful ?
Manu
Comment by Manuel Selva — December 1, 2008 @ Monday, December 1, 2:19 pm
Make cl2 a clone of cl1:
MyClass cl2 = (MyClass)cl1.clone();
Comment by Ancuta — December 1, 2008 @ Monday, December 1, 2:21 pm
package de.tutorials;
public class InstanceDemo {
public static void main(String[] args) {
MyClass cl1 = new MyClass();
//MyClass cl2 = new MyClass();
MyClass cl2 = (MyClass)cl1.clone();
System.out.println(cl1.ocl == cl2.ocl && cl1 != cl2);
}
private static class MyClass extends java.util.ArrayList {
private final Object ocl = new Object();
}
}
Comment by Thomas Darimont — December 1, 2008 @ Monday, December 1, 2:51 pm
public class InstanceDemo {public static void main(String[] args){
MyClass cl1 = new MyClass();
MyClass cl2 = (MyClass) cl1.clone();
System.out.println(cl1.ocl==cl2.ocl && cl1!=cl2);
}
private static class MyClass extends java.util.ArrayList {
private final Object ocl = new Object();
}
}
Nice touch on extends ArrayList!
Robert
Comment by Robert Munteanu — December 1, 2008 @ Monday, December 1, 3:44 pm
MyClass cl2 = (MyClass) cl1.clone();
Comment by DrMastaP — December 1, 2008 @ Monday, December 1, 3:46 pm
public class InstanceDemo {
public static void main(String[] args){
MyClass cl1 = new MyClass();
MyClass cl2 = (MyClass) cl1.clone();
System.out.println(cl1.ocl==cl2.ocl && cl1!=cl2);
}
private static class MyClass extends java.util.ArrayList {
private final Object ocl = new Object();
}
}
Simplest I could think of...
Comment by koala — December 1, 2008 @ Monday, December 1, 3:54 pm
public class InstanceDemo
{
public static void main(String[] args)
{
MyClass cl1 = new MyClass();
MyClass cl2 = (MyClass)cl1.clone();
System.out.println(cl1.ocl == cl2.ocl && cl1 != cl2);
}
private static class MyClass extends java.util.ArrayList
{
private final Object ocl = new Object();
}
}
Comment by Daniel — December 1, 2008 @ Monday, December 1, 4:00 pm
How about this:
public static void main(String[] args) throws Exception
{
MyClass cl1 = new MyClass();
MyClass cl2 = new MyClass();
Field f = MyClass.class.getDeclaredField("ocl");
f.setAccessible(true);
f.set(cl2, cl1.ocl);
System.out.println(cl1.ocl == cl2.ocl && cl1 != cl2);
}
Regards,
Johan
Comment by Johan — December 1, 2008 @ Monday, December 1, 4:24 pm
MyClass cl2 = (MyClass)cl1.clone();
Comment by kmast — December 1, 2008 @ Monday, December 1, 4:29 pm
public class InstanceDemo {
public static void main(String[] args){
MyClass cl1 = new MyClass();
MyClass cl2 = (MyClass) cl1.clone();
System.out.println(cl1.ocl==cl2.ocl && cl1!=cl2);
}
private static class MyClass extends java.util.ArrayList {
private final Object ocl = new Object();
}
}
Comment by Yuriy — December 1, 2008 @ Monday, December 1, 4:41 pm
MyClass cl2 = (MyClass) cl1.clone();
Comment by Boris Bokowski — December 1, 2008 @ Monday, December 1, 5:00 pm
Off the top of my head (it's been a while I haven't done some java)
Replace
MyClass cl2 = new MyClass();
by
MyClass cl2 = (MyClass)cl1.clone();
Comment by Guillaume Mouron — December 1, 2008 @ Monday, December 1, 5:11 pm
public static void main(String[] args){
MyClass cl1 = new MyClass();
MyClass cl2 = (MyClass)cl1.clone();
System.out.println(cl1.ocl==cl2.ocl && cl1!=cl2);
}
Comment by Balázs Grill — December 1, 2008 @ Monday, December 1, 5:29 pm
// In diff format.
- MyClass cl2 = new MyClass();
+ MyClass cl2 = (MyClass) cl1.clone();
Comment by Joakim E — December 1, 2008 @ Monday, December 1, 5:38 pm
One more reason why I try to avoid the clone method.
MyClass cl1 = new MyClass();
MyClass cl2 = (MyClass)cl1.clone();
Comment by Cole — December 1, 2008 @ Monday, December 1, 6:00 pm
public class InstanceDemo {
public static void main(String[] args){
MyClass cl1 = new MyClass();
MyClass cl2 = new MyClass();
System.out.println(cl1.ocl!=cl2.ocl && cl1!=cl2);
}
private static class MyClass extends java.util.ArrayList {
private final Object ocl = new Object();
}
}
I changed 1 character, but I bet this is not what you expected :-)
Comment by Jerome Lanneluc — December 1, 2008 @ Monday, December 1, 6:01 pm
Oops, I changed the sysout line. So much to play the smart guy :-)
Comment by Jerome Lanneluc — December 1, 2008 @ Monday, December 1, 6:03 pm
Something like MyClass cl2 = cl1.clone();
Comment by Jean Palies — December 1, 2008 @ Monday, December 1, 6:08 pm
Change line 4 to:
MyClass cl2 = (MyClass)cl1.clone();
Is there a smaller change? I can see no other way without editing MyClass...
Comment by Holger — December 1, 2008 @ Monday, December 1, 6:18 pm
How about
public class InstanceDemo {
public static void main(String[] args){
MyClass cl1 = new MyClass();
MyClass cl2 = (MyClass) cl1.clone();
System.out.println(cl1.ocl==cl2.ocl && cl1!=cl2);
}
private static class MyClass extends java.util.ArrayList {
private final Object ocl = new Object();
}
}
??
Cheers,
Daniel
Comment by Daniel — December 1, 2008 @ Monday, December 1, 6:54 pm
...
private final Object ocl = "aString";
...
Comment by André Dietisheim — December 1, 2008 @ Monday, December 1, 7:12 pm
MyClass cl2 = (MyClass) cl1.clone();
Comment by Phillipus — December 1, 2008 @ Monday, December 1, 7:53 pm
public class InstanceDemo {
public static void main(String[] args) {
MyClass cl1 = new MyClass();
MyClass cl2 = (MyClass) cl1.clone();
System.out.println(cl1.ocl == cl2.ocl && cl1 != cl2);
}
private static class MyClass extends java.util.ArrayList {
private final Object ocl = new Object();
}
}
Comment by Andy Maleh — December 1, 2008 @ Monday, December 1, 8:58 pm
I would change the line that reads, "MyClass cl2 = new MyClass();" to be MyClass cl2 = (MyClass) cl1.clone();"
Comment by Chris — December 1, 2008 @ Monday, December 1, 9:12 pm
public class InstanceDemo {
public static void main(String[] args) {
MyClass cl1 = new MyClass();
MyClass cl2 = (MyClass) cl1.clone();
System.out.println(cl1.ocl == cl2.ocl && cl1 != cl2);
}
private static class MyClass extends java.util.ArrayList {
private final Object ocl = new Object();
}
}
Comment by Kiril Mitov — December 1, 2008 @ Monday, December 1, 10:18 pm
Adding a "throws Exception" and
Field field = cl1.getClass().getDeclaredField( "ocl" );
field.setAccessible( true );
field.set( cl2, cl1.ocl );
works, unless you have a restrictive SecurityManager, but is certainly no small change and very ugly.
Smaller but still rather mad and ugly is using a method private class, by adding this as the first line in main:
class MyClass{Object ocl;}
I just learned about this very recently on stackoverflow...
Comment by Michael — December 1, 2008 @ Monday, December 1, 10:32 pm
Change:
MyClass cl2 = new MyClass();
to:
MyClass cl2 = (MyClass)cl1.clone();
Comment by H — December 1, 2008 @ Monday, December 1, 10:57 pm
MyClass cl2 = (MyClass) cl1.clone();
Comment by mhaller — December 1, 2008 @ Monday, December 1, 11:46 pm
My solution is using reflection, but I suppose this is not what you mean by "the correct answer". :)
public static void main(String[] args) throws Exception {
MyClass cl1 = new MyClass();
MyClass cl2 = new MyClass();
Field ocl = MyClass.class.getDeclaredField("ocl");
ocl.setAccessible(true);
ocl.set(cl1, null);
ocl.set(cl2, null);
System.out.println(cl1.ocl == cl2.ocl && cl1 != cl2);
}
Comment by Radoslaw Jozwik — December 2, 2008 @ Tuesday, December 2, 12:09 am
Replace the 4th non-blank line with this:
MyClass cl2 = (MyClass)cl1.clone();
Do I win???
Comment by Dave Weatherford — December 2, 2008 @ Tuesday, December 2, 1:21 am
public class InstanceDemo {
public static void main(String[] args) {
MyClass cl1 = new MyClass();
MyClass cl2 = (MyClass)(cl1.clone());
System.out.println(cl1.ocl == cl2.ocl && cl1 != cl2);
}
private static class MyClass extends java.util.ArrayList {
private final Object ocl = new Object();
}
}
Comment by Stephen Egan — December 2, 2008 @ Tuesday, December 2, 1:52 am
Changing to
MyClass cl2 = (MyClass)cl1.clone();
Should make a trick. Can you publish the statistics about this question? Just wondering.
Thanks,
Alex.
Comment by Alex Smirnoff — December 2, 2008 @ Tuesday, December 2, 2:24 am
Change "MyClass cl2 = new MyClass();" to:
MyClass cl2 = (MyClass)cl1.clone();
:-)
Comment by Brendan Bates — December 2, 2008 @ Tuesday, December 2, 6:44 am
public static void main(String[] args) throws Exception {
MyClass cl1 = new MyClass();
MyClass cl2 = new MyClass();
Field field = cl1.getClass().getDeclaredField("ocl");
field.setAccessible(true);
field.set(cl2,cl1.ocl);
System.out.println(cl1.ocl == cl2.ocl && cl1 != cl2);
}
Comment by Patrick — December 2, 2008 @ Tuesday, December 2, 6:57 am
MyClass cl2 = (MyClass) cl1.clone();
Comment by Yuri Schimke — December 2, 2008 @ Tuesday, December 2, 8:11 am
public class InstanceDemo {
public static void main(final String[] args) {
MyClass cl1 = new MyClass();
MyClass cl2 = (MyClass)cl1.clone();
System.out.println(cl1.ocl == cl2.ocl && cl1 != cl2);
}
private static class MyClass extends java.util.ArrayList {
private final Object ocl = new Object();
}
}
Comment by Andreas Groll, Michael Fürstenberg — December 2, 2008 @ Tuesday, December 2, 10:20 am
private static final Object ocl = new Object();
not that hard compared to some SCJP questions :)
Comment by shamaz — December 2, 2008 @ Tuesday, December 2, 10:32 am
I'll give it a try...
public class InstanceDemo {
public static void main(String[] args){
MyClass cl1 = new MyClass();
MyClass cl2 = (MyClass) cl1.clone();
System.out.println(cl1.ocl==cl2.ocl && cl1!=cl2);
}
private static class MyClass extends java.util.ArrayList {
private final Object ocl = new Object();
}
}
Comment by Christoph — December 2, 2008 @ Tuesday, December 2, 10:35 am
shamaz,
"private static final Object ocl = new Object();"
is not correct because you are allowed to change ONLY main method.
Comment by Ahti — December 2, 2008 @ Tuesday, December 2, 11:24 am
The idea of using a method private class is sweet and can be shortend by a few more characters, if you use an int instead of an object:
class MyClass {int ocl;}in the beginning of main() does the trick.Comment by marko schulz — December 2, 2008 @ Tuesday, December 2, 2:44 pm