2

汎用オブジェクトのクローンを作成しようとすると、コンパイル時エラーが発生します。なぜ?

    Object obj=new Object();
    obj.clone();  // Here compile time error "The method clone() from the type Object is not visible"

すべてのクラスはObjectクラスを拡張し、クローン メソッドはObjectクラスで保護されます。

protectedメソッドは、同じパッケージ内と by によってアクセスできsubclasses、すべてのクラスは の子ですjava.lang.Object

4

10 に答える 10

9

クラスで保護されているためcloneです。そうではありません。Objectpublic

オブジェクトのメソッドにアクセスする唯一のclone()方法は、パブリック メソッドを持つコンパイル時の型があることを知ることclone()です。

于 2012-07-05T12:57:38.187 に答える
3

これは、クローンを機能させるための最小値になります。

public class SubObj implements Cloneable {
  public Object clone() { return super.clone(); }
}
于 2012-07-05T13:01:25.157 に答える
3

Java SEドキュメントごと:

クラス Object 自体はインターフェイス Cloneable を実装していないため、クラスが Object であるオブジェクトで clone メソッドを呼び出すと、実行時に例外がスローされます。

于 2012-07-05T12:59:41.467 に答える
1

protectedフィールドは同じパッケージ内からのみアクセスできるため、クラスclone()のメソッドはパッケージ内にあるObjectクラスからのみアクセスできjava.langます。

于 2012-07-05T13:01:42.767 に答える
0

Java コンパイル エラーを回避できるように Groovy を使用すると、次のようになります。

Exception in thread "main" java.lang.CloneNotSupportedException: java.lang.Object
    at java.lang.Object.clone(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
    at java.lang.reflect.Method.invoke(Method.java:597)
    at org.codehaus.groovy.reflection.CachedMethod.invoke(CachedMethod.java:86)
    at groovy.lang.MetaMethod.doMethodInvoke(MetaMethod.java:230)
    at groovy.lang.MetaClassImpl.invokeMethod(MetaClassImpl.java:912)
    at groovy.lang.MetaClassImpl.invokeMethod(MetaClassImpl.java:756)
    at org.codehaus.groovy.runtime.InvokerHelper.invokePojoMethod(InvokerHelper.java:766)
    at org.codehaus.groovy.runtime.InvokerHelper.invokeMethod(InvokerHelper.java:754)
    at org.codehaus.groovy.runtime.ScriptBytecodeAdapter.invokeMethodN(ScriptBytecodeAdapter.java:170)
    at org.codehaus.groovy.runtime.ScriptBytecodeAdapter.invokeMethod0(ScriptBytecodeAdapter.java:198)
    at regexTests.main(regexTests.groovy:19)
ERROR: JDWP Unable to get JNI 1.2 environment, jvm->GetEnv() return code = -2
JDWP exit error AGENT_ERROR_NO_JNI_ENV(183):  [../../../src/share/back/util.c:820]

クローン API を読むと (リンクします)、インターフェイスが実装されていない場合、 *.clone() を呼び出すと .clone() がスローされると書かれていCloneNotSupportedExceptionます。

http://docs.oracle.com/javase/6/docs/api/java/lang/Object.html#clone%28%29のクローン API へのリンクjava.lang.Object

[編集] Original Question™ では、このメソッドがこのように表示される理由を尋ねました。これは、java.lang パッケージ内のメソッドにのみアクセスできるためです。プログラマーがObject. CloneNotSupportedExceptionOWN オブジェクトのクローンを作成したくない場合は 、 a を投げることがまさにあなたがやりたいことです。

于 2012-07-05T13:08:22.297 に答える
0
 void method() {

    Object obj=new Object(); //Object is a parent class, it's not inherit from any other class...     
    obj.clone();        //  compile time error   

}

クラス パッケージが (com.xxx.yyy) であり、オブジェクト クラス パッケージが (java.lang) であり、両方のクラスが異なるパッケージにあるため、別のパッケージから「Has A」関係の保護されたメソッドにアクセスできません。

保護されたメソッドは、同じパッケージ内およびサブクラスからアクセスできます (IS A 関係)

于 2014-08-12T07:00:21.087 に答える
0
import java.util.Scanner;
import java.util.jar.Attributes.Name;
import java.util.Arrays;
public class Main{
    public class man{
        protected void name() {
            System.out.println("hei");
        }
    }
    public class people extends man{
        public int age;

        public int getAge() {
            name();
            return age;
        }

        public void setAge(int age) {
            this.age = age;
        }

        @Override
        public String toString() {
            return "people [age=" + age + "]";
        }
        
        public Object myclone() throws CloneNotSupportedException {
            return this.clone();
        }
    }
    
    public void test() throws CloneNotSupportedException {
        
        people p1 = new people();
        p1.setAge(10);
        System.out.println(p1);
//      NG:
        people p2 = (people)p1.clone();
//      Ok
        people p3 = (people)p1.myclone();
        p1.setAge(10);
        System.out.println(p1);
        System.out.println(p2);
    }
    public static void main(String args[]) throws CloneNotSupportedException{
        new Main().test();
        
    }
}

NG コードと OK コードを参照してください。

//      NG for:The method clone() from the type Object is not visible
        people p2 = (people)p1.clone();
//      Ok
        people p3 = (people)p1.myclone();

なぜ?原因test()はサブクラスに属していません。clone()ですから、人の対象で呼んでも対象p1の場所ではありませんpeopelmyclone()まさにピープルオブジェクトの場所です。

于 2020-08-29T15:19:52.280 に答える
0

Cloneable インターフェースを明示的に実装する必要があります。説明を提供するこのスレッドを参照してください。

于 2012-07-05T12:58:26.447 に答える