15

クローン オブジェクトが必要なクラスでクローン メソッドをオーバーライドすることに関して混乱しています。

オブジェクトクラスには保護されたオブジェクトメソッドがあり、メソッドが保護されている場合の保護された動作に従って、クラス自体、クラスのサブクラス、またはクラスと同じパッケージ内のクラスのみがアクセスできます

Java のすべてのクラスは Object から拡張されるため、clone メソッドが必要ですが、それでも clone をオーバーライドする必要があります。なぜそれが必要なのですか?

また、クローンオブジェクトをオーバーライドして公開するためにいくつかの場所を読みました。なぜそうなのだろうか?

すべての回答を歓迎します。

4

5 に答える 5

13

Java のすべてのクラスは Object から拡張されるため、clone メソッドが必要ですが、それでも clone をオーバーライドする必要があります。

cloneいいえ、メソッドをオーバーライドする必要はありません。継承では、クラスを継承するときに、そのメソッドをオーバーライドする必要はありません。その修飾子が public または protected であっても、大きな違いはありません。superただし、クラス参照でメソッドを直接呼び出す場合、そのメソッドはpublic. 保護されたメソッドは、継承によってのみアクセスできます。つまり、subclass参照を介してのみアクセスできます。superまたは、メソッドをオーバーライドすると、キーワードでアクセスできます。

cloneそうは言っても、そのままではメソッドをオーバーライドしないでくださいbrokenCloneableクラスを複製するには、インターフェースを実装する必要があるためです。そして、あなたのクラスは代わりにクラスのcloneメソッドを使用します。Objectなぜなら、Cloneableインターフェイスには正確にはcloning. Copy Constructor代わりに使用する方が良いオプションです。

public class A {
   private int data;
   public A() {
   }

   public A(A a) {
      this.data = a.data;
   }
}

詳細については、Joshua Bloch'sEffective Javaのこの章を参照することをお勧めします。この章では、cloneメソッドの使用のすべての側面をカバーしています。

効果的な Java- 項目 11 - 慎重にクローンをオーバーライドする

于 2012-10-26T18:11:55.737 に答える
5

Joshua Bloch の『Effective Java 2nd edition』を読むことをお勧めします。クローンについて説明する良い章があります。

これを行うことはお勧めしません。これはJDK 1.0の間違いだと思います。この本はそれをより明確にしてくれます。

必要なものを取得する代わりに、コピー コンストラクターを作成することをお勧めします。

public class Foo {
    private String name;
    public Foo(String name) { this.name = name; }
    public Foo(Foo f) { this.name = f.name; }  // copy ctor here.
}
于 2012-10-26T18:12:03.727 に答える
3

多くの場合、複製されたオブジェクトがどうあるべきか、どのように動作するべきかは明確ではありません。そのため、クラスを複製可能にしたい場合は、複製をオーバーライドして公開することで明示的に指定する必要があります。

クローンが意味をなさない場合には、ネットワーク接続や同期ロックなどのリソースを表すクラスが含まれます。これらのオブジェクトを複製できる場合、複製がどのように動作するかは明確ではありません。たとえば、ネットワーク接続のクローンには独自の TCP/IP 接続がありますか、それとも既存の接続を何らかの方法で使用しますか?

于 2012-10-26T18:14:38.560 に答える
2

クローンはクラス内のProtectedメソッドでObjectあるため、クラス内でアクセスできます。

アクセスについて - メソッドが保護されている場合、クラス自体、クラスのサブクラス、またはクラスと同じパッケージ内のクラスのみがアクセスできます。

clone メソッドに関するいくつかの誤解がある

  1. clone()メソッドはクラスprotected内にあるため、クラス外でObject呼び出すことはできません 。clone()たとえばchild.clone()、オーバーライドしてアクセスしない限りpublic
  2. Cloneableマーカーインターフェイスであり、クラスをマークしない場合、メソッドを呼び出すCloneableと取得されますCloneNotSupportedExceptionclone()
  3. クラスにプリミティブ フィールドまたは不変オブジェクトへの参照のみが含まれる場合、通常は、によって返されるオブジェクトのフィールドをsuper.clone変更する必要はありません。
  4. 慣例により、返されるオブジェクトは を呼び出して取得する必要がありますsuper.clone。クラスとそのすべてがsuperclasses (except Object)この規則に従う場合、x.clone().getClass() == x.getClass().

メソッドのシグネチャは以下のとおりです

@Override
public Object clone() throws CloneNotSupportedException {
    return super.clone();
}

参考文献:

  1. オブジェクト#クローン()
  2. クローン可能
于 2012-10-26T18:30:28.147 に答える
-1
    Why we do override clone() in cloning process?
    //clone() in Object class is protected
    package java.lang;


    protected native Object clone()
            throws CloneNotSupportedException;

    java.lang is default import in our java applications.

Note: If parent and sub class are both in same package then the methods in parent class are directly accessible. If they are in different package,then in subclass we have to override the parent class methods to use.

    Note:Object class is in java.lang package,we are using it in different package,so we have to override the clone() which is protected in Object class


first we will look into Protected method behavior.here is sample program to understand this
    //this class is in com.anusha.clonetrial
    package com.anusha.clonetrial;

    public class A {

        public A()
        {

        }
        protected void disp1()
        {
            System.out.println("class a");
        }
        protected void disp2()
        {
            System.out.println("class a");
        }
    }
    //below classes are in com.anusha.Test
    package com.anusha.Test;
    import com.anusha.clonetrial.A;


    class AA {


        protected void disp1()
        {
            System.out.println("class aa");
        }

        protected void disp2()
        {
            System.out.println("class aa");
        }
    }

    //class B derived from AA which is present in the same package
    class B extends AA
    {

        void show()
        {


            System.out.println("class b");
        }
    }

    //class C derived from A which is present in the different package

    class C extends A
    {

        @Override
        protected void disp1()
        {
            super.disp1();
        }
        void show()
        { 
            System.out.println("class c");
        }
    }

    package com.anusha.Test;




    public class CloneTest {


        public static void main(String[] args) {
            B b=new B();
            C c=new C();
            b.disp1();
            b.disp2();
            c.disp1();
            c.disp2();//gives error because it is not overridden.


        }

    }
于 2013-09-22T03:42:47.857 に答える