{"id":523,"date":"2021-01-07T17:51:48","date_gmt":"2021-01-07T17:51:48","guid":{"rendered":"https:\/\/bhiggs.x10hosting.com\/PracticalJavaProgramming\/?page_id=523"},"modified":"2021-01-07T18:13:56","modified_gmt":"2021-01-07T18:13:56","slug":"cloning-objects","status":"publish","type":"page","link":"https:\/\/bhiggs.x10hosting.com\/PracticalJavaProgramming\/course-topics\/inheritance-polymorphism\/cloning-objects\/","title":{"rendered":"Cloning Objects"},"content":{"rendered":"<div id=\"ez-toc-container\" class=\"ez-toc-v2_0_84 counter-hierarchy ez-toc-counter ez-toc-grey ez-toc-container-direction\">\n<p class=\"ez-toc-title\" style=\"cursor:inherit\">Table of Contents<\/p>\n<label for=\"ez-toc-cssicon-toggle-item-6a21c3150bd54\" class=\"ez-toc-cssicon-toggle-label\"><span class=\"\"><span class=\"eztoc-hide\" style=\"display:none;\">Toggle<\/span><span class=\"ez-toc-icon-toggle-span\"><svg style=\"fill: #999;color:#999\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" class=\"list-377408\" width=\"20px\" height=\"20px\" viewBox=\"0 0 24 24\" fill=\"none\"><path d=\"M6 6H4v2h2V6zm14 0H8v2h12V6zM4 11h2v2H4v-2zm16 0H8v2h12v-2zM4 16h2v2H4v-2zm16 0H8v2h12v-2z\" fill=\"currentColor\"><\/path><\/svg><svg style=\"fill: #999;color:#999\" class=\"arrow-unsorted-368013\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"10px\" height=\"10px\" viewBox=\"0 0 24 24\" version=\"1.2\" baseProfile=\"tiny\"><path d=\"M18.2 9.3l-6.2-6.3-6.2 6.3c-.2.2-.3.4-.3.7s.1.5.3.7c.2.2.4.3.7.3h11c.3 0 .5-.1.7-.3.2-.2.3-.5.3-.7s-.1-.5-.3-.7zM5.8 14.7l6.2 6.3 6.2-6.3c.2-.2.3-.5.3-.7s-.1-.5-.3-.7c-.2-.2-.4-.3-.7-.3h-11c-.3 0-.5.1-.7.3-.2.2-.3.5-.3.7s.1.5.3.7z\"\/><\/svg><\/span><\/span><\/label><input type=\"checkbox\"  id=\"ez-toc-cssicon-toggle-item-6a21c3150bd54\"  aria-label=\"Toggle\" \/><nav><ul class='ez-toc-list ez-toc-list-level-1 ' ><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-1\" href=\"https:\/\/bhiggs.x10hosting.com\/PracticalJavaProgramming\/course-topics\/inheritance-polymorphism\/cloning-objects\/#The_clone_method\" >The clone() method<\/a><ul class='ez-toc-list-level-4' ><li class='ez-toc-heading-level-4'><a class=\"ez-toc-link ez-toc-heading-2\" href=\"https:\/\/bhiggs.x10hosting.com\/PracticalJavaProgramming\/course-topics\/inheritance-polymorphism\/cloning-objects\/#Making_a_Class_Cloneable\" >Making a Class Cloneable<\/a><\/li><\/ul><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-3\" href=\"https:\/\/bhiggs.x10hosting.com\/PracticalJavaProgramming\/course-topics\/inheritance-polymorphism\/cloning-objects\/#Implementing_clone\" >Implementing clone()<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-4\" href=\"https:\/\/bhiggs.x10hosting.com\/PracticalJavaProgramming\/course-topics\/inheritance-polymorphism\/cloning-objects\/#The_Cloneable_Interface\" >The Cloneable Interface<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-5\" href=\"https:\/\/bhiggs.x10hosting.com\/PracticalJavaProgramming\/course-topics\/inheritance-polymorphism\/cloning-objects\/#Fixing_Shallow_Copies\" >Fixing Shallow Copies<\/a><\/li><\/ul><\/nav><\/div>\n\n<p class=\"wp-block-paragraph\">Sometimes, you&#8217;ll find it convenient to make an exact copy of an object instance.&nbsp; That is, produce another independent object of the same datatype, with all the attributes having the same values as the original.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">This is called&nbsp;<strong><em>cloning an object<\/em><\/strong>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">You might think that this would be simple to do.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">You&#8217;d be wrong!<\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"The_clone_method\"><\/span>The clone() method<span class=\"ez-toc-section-end\"><\/span><\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">In principle, you can clone an object by calling the object&#8217;s&nbsp;<strong>clone()<\/strong>&nbsp;method.&nbsp;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">There is a&nbsp;<strong>clone()<\/strong>&nbsp;method defined in the&nbsp;<strong>Object<\/strong>&nbsp;class, from which every other class extends.&nbsp;&nbsp; Its signature is basically:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\"><strong>Object clone()<\/strong><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">It returns a reference to the cloned&nbsp;<strong>Object<\/strong>.&nbsp; It can&#8217;t return anything more specific, because it doesn&#8217;t know, <em>a priori,<\/em> what kind of object it&#8217;s dealing with.<\/p>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\"><p><strong><em><u>Note:<\/u><\/em><\/strong>&nbsp;Using the&nbsp;<strong>clone()<\/strong>&nbsp;method is a way of creating an object&nbsp;<em><strong>without using a constructor<\/strong><\/em>.&nbsp; You need to be aware of this, because if you place code to perform sanity checks in your class constructors, using clone will bypass those checks!<\/p><\/blockquote>\n\n\n\n<h4 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"Making_a_Class_Cloneable\"><\/span>Making a Class Cloneable<span class=\"ez-toc-section-end\"><\/span><\/h4>\n\n\n\n<p class=\"wp-block-paragraph\">Let&#8217;s imagine we have a class that we want to be able to clone itself.&nbsp; Let&#8217;s call it&nbsp;<strong>CloneMe<\/strong>:<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: java; auto-links: false; title: ; quick-code: false; notranslate\" title=\"\">\npublic class CloneMe\n{\n  \/\/ Constructor\n  public CloneMe(Object object, int value)\n  {\n    m_object = object;\n    m_value = value;\n  }\n  \n  public void print()\n  {\n    System.out.println(&quot;---CloneMe object---\\n&quot; + \n                       &quot;Object:  &quot; + m_object + \n                       &quot;Value:   &quot; + m_value);\n  }\n  \n  \/\/\/\/\/ Private data \/\/\/\/\/\n  private Object m_object;\n  private int m_value;\n}\n<\/pre><\/div>\n\n\n<p class=\"wp-block-paragraph\">This compiles fine, so let&#8217;s see what happens when we try to clone it:<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: java; auto-links: false; highlight: [25]; title: ; quick-code: false; notranslate\" title=\"\">\nclass MyObject\n{\n  public MyObject(String name)\n  {\n    m_name = name;\n  }\n\n  public String toString()\n  {\n    return &quot;HashId: &quot; + super.toString() + &quot;\\n&quot; +\n           &quot;Name: &quot; + m_name + &quot;\\n&quot;;\n  }\n\n  \/\/\/\/ Data \/\/\/\/\n  private String m_name;\n}\n\npublic class CloneMeTest\n{\n  public static void main(String&#x5B;] args)\n  {\n    MyObject mo1 = new MyObject(&quot;Monkeys&quot;);\n    CloneMe cm1 = new CloneMe(mo1, 27);\n    cm1.print();\n    CloneMe cm2 = (CloneMe) cm1.clone();\n    cm2.print();\n  }\n}\n<\/pre><\/div>\n\n\n<p class=\"wp-block-paragraph\">When we try to compile the above source file, Java refuses to compile it. It produces the following compile-time error message:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\"><strong>\"CloneMeTest.java\": clone() has protected access \n     in java.lang.Object at line 25, column 33<\/strong><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">I&#8217;ve highlighted the offending piece of code, above.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">The reason is exactly as described in the error message:&nbsp; the clone method defined in class&nbsp;<strong>Object<\/strong>&nbsp;has protected access, which means that only subclasses of&nbsp;<strong>Object<\/strong>&nbsp;may call that method.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Why is it implemented this way?<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Because the&nbsp;<strong>Object<\/strong>&nbsp;class doesn&#8217;t know anything about your class, so it doesn&#8217;t really know how to clone an object of your class.&nbsp; The most it can do is do what&#8217;s known as a&nbsp;<em><strong>shallow copy<\/strong><\/em>&nbsp;of your class&#8217;s data members, which isn&#8217;t always appropriate, depending on what you class does.&nbsp; The implementers wanted to be sure that programmers would understand that a shallow copy isn&#8217;t sufficient in many cases.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">So what do we do?&nbsp; We have to explore a bit more&#8230;<\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"Implementing_clone\"><\/span>Implementing clone()<span class=\"ez-toc-section-end\"><\/span><\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Since you can&#8217;t call the&nbsp;<strong>Object<\/strong>&nbsp;class&#8217;s&nbsp;<strong>clone()<\/strong>&nbsp;method directly, you might think that you could implement your own <strong>clone() <\/strong>method in your class, and then have it call the&nbsp;<strong>Object<\/strong>&nbsp;class&#8217;s&nbsp;<strong>clone()<\/strong>&nbsp;method.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">So let&#8217;s try that:<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: java; auto-links: false; highlight: [17,18,19,20]; title: ; quick-code: false; notranslate\" title=\"\">\npublic class CloneMe\n{\n  \/\/ Constructor\n  public CloneMe(Object object, int value)\n  {\n    m_object = object;\n    m_value = value;\n  }\n  \n  public void print()\n  {\n    System.out.println(&quot;---CloneMe object---\\n&quot; + \n                       &quot;Object:  &quot; + m_object + \n                       &quot;Value:   &quot; + m_value);\n  }\n  \n  public Object clone()\n  {\n    return super.clone();\n  }\n  \n  \/\/\/\/\/ Private data \/\/\/\/\/\n  private Object m_object;\n  private int m_value;\n}\n<\/pre><\/div>\n\n\n<p class=\"wp-block-paragraph\">However, when we try to compile this code, the Java compiler produces the following compile-time error:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\"><strong>\"CloneMe.java\": unreported exception java.lang.CloneNotSupportedException; \n     must be caught or declared to be thrown at line 18, column 23<\/strong><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">It turns out that the clone method is declared as follows:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\"><strong>protected Object clone() throws CloneNotSupportedException<\/strong><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">So we have to modify our&nbsp;<strong>clone()<\/strong>&nbsp;method to conform to the&nbsp;<strong>Object<\/strong>&nbsp;class&#8217;s signature:<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: java; auto-links: false; highlight: [17]; title: ; quick-code: false; notranslate\" title=\"\">\npublic class CloneMe\n{\n  \/\/ Constructor\n  public CloneMe(Object object, int value)\n  {\n    m_object = object;\n    m_value = value;\n  }\n  \n  public void print()\n  {\n    System.out.println(&quot;---CloneMe object---\\n&quot; + \n                       &quot;Object:  &quot; + m_object + \n                       &quot;Value:   &quot; + m_value);\n  }\n  \n  public Object clone() throws CloneNotSupportedException\n  {\n    return super.clone();\n  }\n  \n  \/\/\/\/\/ Private data \/\/\/\/\/\n  private Object m_object;\n  private int m_value;\n}\n\n<\/pre><\/div>\n\n\n<p class=\"wp-block-paragraph\">Now it compiles!<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">So let&#8217;s test it:<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: java; auto-links: false; highlight: [21]; title: ; quick-code: false; notranslate\" title=\"\">\nclass MyObject\n{\n  public MyObject(String name)\n  {\n    m_name = name;\n  }\n\n  public String toString()\n  {\n    return &quot;HashId: &quot; + super.toString() + &quot;\\n&quot; +\n           &quot;Name: &quot; + m_name + &quot;\\n&quot;;\n  }\n\n  \/\/\/\/ Data \/\/\/\/\n  private String m_name;\n}\n\npublic class CloneMeTest\n{\n  public static void main(String&#x5B;] args) \n                  throws CloneNotSupportedException\n  {\n    MyObject mo1 = new MyObject(&quot;Monkeys&quot;);\n    CloneMe cm1 = new CloneMe(mo1, 27);\n    cm1.print();\n    CloneMe cm2 = (CloneMe) cm1.clone();\n    cm2.print();\n  }\n}\n<\/pre><\/div>\n\n\n<p class=\"wp-block-paragraph\">Note that I had to add the&nbsp;throws <strong>CloneNotSupportedException<\/strong>&nbsp;to get the above to compile.&nbsp; (This relates to the rules governing how exceptions are handled, which we haven&#8217;t talked about yet.&nbsp; Just take this change on faith, at least for the moment.)<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">OK, the above compiles.&nbsp; What happens when we run it?&nbsp; We get the following:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\"><strong>Exception in thread \"main\" java.lang.CloneNotSupportedException: CloneMe\n\tat java.lang.Object.clone(Native Method)\n\tat CloneMe.clone(CloneMe.java:18)\n\tat CloneMeTest.main(CloneMeTest.java:25)<\/strong><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">What&#8217;s wrong, now?<\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"The_Cloneable_Interface\"><\/span>The Cloneable Interface<span class=\"ez-toc-section-end\"><\/span><\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">It turns out that the&nbsp;<strong>Object<\/strong>&nbsp;class&#8217;s&nbsp;<strong>clone()<\/strong>&nbsp;method refuses to work if your class doesn&#8217;t implement the&nbsp;<strong>Cloneable&nbsp;<\/strong>interface.&nbsp;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">What&#8217;s the&nbsp;<strong>Cloneable&nbsp;<\/strong>interface?<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Java provides an interface&nbsp;<strong>Cloneable<\/strong>, in the package&nbsp;<strong>java.lang<\/strong>.&nbsp; Here is the code that defines it (with comments removed):<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\"><strong>package java.lang;\n\npublic interface Cloneable\n{\n}<\/strong><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">That is everything you need to know about interface&nbsp;<strong>Cloneable<\/strong>!<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Notice that it is a&nbsp;<em><strong>marker interface<\/strong><\/em>, because it contains absolutely no methods, nor anything else.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">The idea is that you can only call the&nbsp;<strong>Object<\/strong>&nbsp;class&#8217;s&nbsp;<strong>clone()<\/strong>&nbsp;method if your class implements this interface.&nbsp; So let&#8217;s do that:<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: java; auto-links: false; highlight: [1]; title: ; quick-code: false; notranslate\" title=\"\">\npublic class CloneMe implements Cloneable\n{\n  \/\/ Constructor\n  public CloneMe(Object object, int value)\n  {\n    m_object = object;\n    m_value = value;\n  }\n  \n  public void print()\n  {\n    System.out.println(&quot;---CloneMe object---\\n&quot; + \n                       &quot;Object:  &quot; + m_object + \n                       &quot;Value:   &quot; + m_value);\n  }\n  \n  public Object clone() throws CloneNotSupportedException\n  {\n    return super.clone();\n  }\n  \n  \/\/\/\/\/ Private data \/\/\/\/\/\n  private Object m_object;\n  private int m_value;\n}\n<\/pre><\/div>\n\n\n<p class=\"wp-block-paragraph\">Now, this compiles, and when you test it:<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: java; auto-links: false; title: ; quick-code: false; notranslate\" title=\"\">\nclass MyObject\n{\n  public MyObject(String name)\n  {\n    m_name = name;\n  }\n\n  public String toString()\n  {\n    return &quot;HashId: &quot; + super.toString() + &quot;\\n&quot; +\n           &quot;Name: &quot; + m_name + &quot;\\n&quot;;\n  }\n\n  \/\/\/\/ Data \/\/\/\/\n  private String m_name;\n}\n\npublic class CloneMeTest\n{\n  public static void main(String&#x5B;] args) \n                  throws CloneNotSupportedException\n  {\n    MyObject mo1 = new MyObject(&quot;Monkeys&quot;);\n    CloneMe cm1 = new CloneMe(mo1, 27);\n    cm1.print();\n    CloneMe cm2 = (CloneMe) cm1.clone();\n    cm2.print();\n  }\n}\n<\/pre><\/div>\n\n\n<p class=\"wp-block-paragraph\">it produces the following output:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\"><strong>---CloneMe object---\nObject: HashId: MyObject@923e30\nName: Monkeys\nValue: 27\n---CloneMe object---\nObject: HashId: MyObject@923e30\nName: Monkeys\nValue: 27<\/strong><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">We&#8217;ve finally succeeded in cloning the object!<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">So we&#8217;re done, right?<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Nope!&nbsp; Take a look at the output more carefully.&nbsp; While we actually have two distinct object instances of type&nbsp;<strong>CloneMe<\/strong>, each of those instances contain an&nbsp;<strong>Object<\/strong>&nbsp;reference which points to a&nbsp;<em><strong>single instance<\/strong><\/em>&nbsp;of&nbsp;<strong>MyObject<\/strong>.&nbsp; That&#8217;s what I meant by the&nbsp;<strong>Object<\/strong>&nbsp;class&#8217;s&nbsp;<strong>clone()<\/strong>&nbsp;method doing a shallow copy.&nbsp; It copied the reference, not what the reference referred to.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Depending on what our class is designed to do, this may be appropriate, or it may be completely wrong.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Under what circumstances can you think of where it might be incorrect?<\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"Fixing_Shallow_Copies\"><\/span>Fixing Shallow Copies<span class=\"ez-toc-section-end\"><\/span><\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">So what if your class requires something more sophisticated than a simple shallow copy?<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">You need to put more into your class&#8217;s clone method:<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: java; auto-links: false; highlight: [4,19,20,25]; title: ; quick-code: false; notranslate\" title=\"\">\npublic class CloneMe implements Cloneable\n{\n  \/\/ Constructor\n  public CloneMe(MyObject object, int value)\n  {\n    m_object = object;\n    m_value = value;\n  }\n  \n  public void print()\n  {\n    System.out.println(&quot;---CloneMe object---\\n&quot; + \n                       &quot;Object:  &quot; + m_object + \n                       &quot;Value:   &quot; + m_value);\n  }\n  \n  public Object clone() throws CloneNotSupportedException\n  {\n    CloneMe cloned = (CloneMe) super.clone();\n    cloned.m_object = (MyObject) m_object.clone();\n    return cloned;\n  }\n  \n  \/\/\/\/\/ Private data \/\/\/\/\/\n  private MyObject m_object;\n  private int m_value;\n}\n<\/pre><\/div>\n\n\n<p class=\"wp-block-paragraph\">We use the <strong>Object<\/strong> class&#8217;s <strong>clone()<\/strong> method to create our new object, and then add code that fixes up the shallow copy problems.&nbsp; In this case, I&#8217;ve changed the <strong>m_object<\/strong> instance variable to refer to a <strong>MyObject<\/strong>, which I clone to create a fresh instance of that object.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">This means that I had to change the implementation of <strong>MyObject<\/strong> to support cloning:<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: java; auto-links: false; highlight: [1,8,9,10,11]; title: ; quick-code: false; notranslate\" title=\"\">\nclass MyObject implements Cloneable\n{\n  public MyObject(String name)\n  {\n    m_name = name;\n  }\n  \n  public Object clone() throws CloneNotSupportedException\n  {\n    return super.clone();\n  }\n\n  public String toString()\n  {\n    return &quot;HashId: &quot; + super.toString() + &quot;\\n&quot; +\n           &quot;Name: &quot; + m_name + &quot;\\n&quot;;\n  }\n\n  \/\/\/\/ Data \/\/\/\/\n  private String m_name;\n}\n\npublic class CloneMeTest\n{\n  public static void main(String&#x5B;] args) \n                       throws CloneNotSupportedException\n  {\n    MyObject mo1 = new MyObject(&quot;Monkeys&quot;);\n    CloneMe cm1 = new CloneMe(mo1, 27);\n    cm1.print();\n    CloneMe cm2 = (CloneMe) cm1.clone();\n    cm2.print();\n  }\n}\n<\/pre><\/div>\n\n\n<p class=\"wp-block-paragraph\">This now produces the following output:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\"><strong>---CloneMe object---\nObject:  HashId: MyObject@923e30\nName: Monkeys\nValue:   27\n---CloneMe object---\nObject:  HashId: MyObject@130c19b\nName: Monkeys\nValue:   27<\/strong><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Which, as you can see, now has references to two different <strong>MyObject<\/strong> instances, one for each cloned <strong>CloneMe<\/strong> instance.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>WHEW!<\/strong><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Sometimes, you&#8217;ll find it convenient to make an exact copy of an object instance.&nbsp; That is, produce another independent object of the same datatype, with all the attributes having the same values as the original. This is called&nbsp;cloning an object. You might think that this would be simple to do. You&#8217;d be wrong! The clone() [&hellip;]<\/p>\n","protected":false},"author":2,"featured_media":0,"parent":61,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"_eb_attr":"","_uag_custom_page_level_css":"","ocean_post_layout":"left-sidebar","ocean_both_sidebars_style":"","ocean_both_sidebars_content_width":0,"ocean_both_sidebars_sidebars_width":0,"ocean_sidebar":"ocs-course-topics-sidebar","ocean_second_sidebar":"0","ocean_disable_margins":"enable","ocean_add_body_class":"","ocean_shortcode_before_top_bar":"","ocean_shortcode_after_top_bar":"","ocean_shortcode_before_header":"","ocean_shortcode_after_header":"","ocean_has_shortcode":"","ocean_shortcode_after_title":"","ocean_shortcode_before_footer_widgets":"","ocean_shortcode_after_footer_widgets":"","ocean_shortcode_before_footer_bottom":"","ocean_shortcode_after_footer_bottom":"","ocean_display_top_bar":"default","ocean_display_header":"default","ocean_header_style":"","ocean_center_header_left_menu":"0","ocean_custom_header_template":"0","ocean_custom_logo":0,"ocean_custom_retina_logo":0,"ocean_custom_logo_max_width":0,"ocean_custom_logo_tablet_max_width":0,"ocean_custom_logo_mobile_max_width":0,"ocean_custom_logo_max_height":0,"ocean_custom_logo_tablet_max_height":0,"ocean_custom_logo_mobile_max_height":0,"ocean_header_custom_menu":"0","ocean_menu_typo_font_family":"0","ocean_menu_typo_font_subset":"","ocean_menu_typo_font_size":0,"ocean_menu_typo_font_size_tablet":0,"ocean_menu_typo_font_size_mobile":0,"ocean_menu_typo_font_size_unit":"px","ocean_menu_typo_font_weight":"","ocean_menu_typo_font_weight_tablet":"","ocean_menu_typo_font_weight_mobile":"","ocean_menu_typo_transform":"","ocean_menu_typo_transform_tablet":"","ocean_menu_typo_transform_mobile":"","ocean_menu_typo_line_height":0,"ocean_menu_typo_line_height_tablet":0,"ocean_menu_typo_line_height_mobile":0,"ocean_menu_typo_line_height_unit":"","ocean_menu_typo_spacing":0,"ocean_menu_typo_spacing_tablet":0,"ocean_menu_typo_spacing_mobile":0,"ocean_menu_typo_spacing_unit":"","ocean_menu_link_color":"","ocean_menu_link_color_hover":"","ocean_menu_link_color_active":"","ocean_menu_link_background":"","ocean_menu_link_hover_background":"","ocean_menu_link_active_background":"","ocean_menu_social_links_bg":"","ocean_menu_social_hover_links_bg":"","ocean_menu_social_links_color":"","ocean_menu_social_hover_links_color":"","ocean_disable_title":"default","ocean_disable_heading":"default","ocean_post_title":"","ocean_post_subheading":"","ocean_post_title_style":"","ocean_post_title_background_color":"","ocean_post_title_background":0,"ocean_post_title_bg_image_position":"","ocean_post_title_bg_image_attachment":"","ocean_post_title_bg_image_repeat":"","ocean_post_title_bg_image_size":"","ocean_post_title_height":0,"ocean_post_title_bg_overlay":0.5,"ocean_post_title_bg_overlay_color":"","ocean_disable_breadcrumbs":"default","ocean_breadcrumbs_color":"","ocean_breadcrumbs_separator_color":"","ocean_breadcrumbs_links_color":"","ocean_breadcrumbs_links_hover_color":"","ocean_display_footer_widgets":"default","ocean_display_footer_bottom":"default","ocean_custom_footer_template":"0","footnotes":""},"class_list":["post-523","page","type-page","status-publish","hentry","entry"],"uagb_featured_image_src":{"full":false,"thumbnail":false,"medium":false,"medium_large":false,"large":false,"1536x1536":false,"2048x2048":false,"ocean-thumb-m":false,"ocean-thumb-ml":false,"ocean-thumb-l":false},"uagb_author_info":{"display_name":"Bryan Higgs","author_link":"https:\/\/bhiggs.x10hosting.com\/PracticalJavaProgramming\/author\/bryan\/"},"uagb_comment_info":0,"uagb_excerpt":"Sometimes, you&#8217;ll find it convenient to make an exact copy of an object instance.&nbsp; That is, produce another independent object of the same datatype, with all the attributes having the same values as the original. This is called&nbsp;cloning an object. You might think that this would be simple to do. You&#8217;d be wrong! The clone()&hellip;","_links":{"self":[{"href":"https:\/\/bhiggs.x10hosting.com\/PracticalJavaProgramming\/wp-json\/wp\/v2\/pages\/523","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/bhiggs.x10hosting.com\/PracticalJavaProgramming\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/bhiggs.x10hosting.com\/PracticalJavaProgramming\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/bhiggs.x10hosting.com\/PracticalJavaProgramming\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/bhiggs.x10hosting.com\/PracticalJavaProgramming\/wp-json\/wp\/v2\/comments?post=523"}],"version-history":[{"count":10,"href":"https:\/\/bhiggs.x10hosting.com\/PracticalJavaProgramming\/wp-json\/wp\/v2\/pages\/523\/revisions"}],"predecessor-version":[{"id":538,"href":"https:\/\/bhiggs.x10hosting.com\/PracticalJavaProgramming\/wp-json\/wp\/v2\/pages\/523\/revisions\/538"}],"up":[{"embeddable":true,"href":"https:\/\/bhiggs.x10hosting.com\/PracticalJavaProgramming\/wp-json\/wp\/v2\/pages\/61"}],"wp:attachment":[{"href":"https:\/\/bhiggs.x10hosting.com\/PracticalJavaProgramming\/wp-json\/wp\/v2\/media?parent=523"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}