8

I always thought that clone() creates an object without calling a constructor.

But, while reading Effective Java Item 11: Override clone judiciously, I found a statement which says that

The provision that “no constructors are called” is too strong. A well-behaved clone method can call constructors to create objects internal to the clone under construction. If the class is final, clone can even return an object created by a constructor.

Can someone please explain this to me?

1
  • 1
    clone() method not calls constructor, its default behavior is it will perform shallow copy. but if we want to perform deep copy we need to override clone() method , from which we can return new Object. Commented Jul 31, 2013 at 7:52

2 Answers 2

13

I always thought that clone() creates an object without calling a constructor.

The implementation in Object.clone() doesn't call a constructor.

There's nothing to stop you from implementing it yourself in a way which does. For example, this is a perfectly valid clone() implementation:

public final class Foo implements Cloneable { private final int bar; public Foo(int bar) { this.bar = bar; } @Override public Object clone() { return new Foo(bar); } } 

You can only do this (unconditionally) if the class is final, because then you can guarantee to be returning an object of the same type as the original.

If the class isn't final, I guess you could check whether the instance was "just" an instance of the type overriding clone() and handle it differently in different cases... it would be odd to do so though.

Sign up to request clarification or add additional context in comments.

2 Comments

Why can I only do this if the class is final? If i do this in non-final class, will there be any kind of impact?
@Anand: clone() has to return an instance of the same type as the original. If the class is non-final, you have to consider the possibility that this will refer to an instance of a subclass.
0

I think below part of code always create the new object and supply to the other class (i.e. helpfull in singleton).

 @Override public Object clone() { return new Foo(bar); } 

I think this can be supply for the purpose:

public MyObject clone() { return new MyObject(this); } 

Comments

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.