Pregunta

Estoy tratando de clonar un objeto de clase entero, que implementa el Inteface clonable.

Integer a = new Integer(4);  
Integer b = a.clone();

Sé que hay trabajo para esto, pero debo implementarlo así. Por qué recibo este error =clone() ha protegido el acceso en java.lang.Object

¿Por qué diría esto? ¿No es el método clon un método público abstracto de interfaz clonable, qué tiene que ver con el objeto? Gracias por adelantado :-)

¿Fue útil?

Solución

Claro, todos los métodos en Object son heredados. los clone Sin embargo, el método es protected, por lo tanto, solo accesible desde las subclases.

El modificador protegido especifica que el miembro solo se puede acceder dentro de su propio paquete (como con el paquete-privado) y, además, por una subclase de su clase en otro paquete.

La razón por la que puedes llamar clone() En la mayoría de las otras circunstancias, la subclase "lo abre" al anularlo con el public Modificador de acceso.

Otros consejos

java.lang.Integers son inmutables. No hay razón para clonar uno. Si tu eres difícil Para desperdiciar la memoria, intente Integer.valueOf(myInteger.intValue()).

El error viene porque clone El método de java.lang.object no es visible públicamente.

Como señala Amit y Aioobe, Integer es inmutable, por lo que no es necesario clonarlo.

Pero para responder a tu pregunta. El método clone () no es parte de la interfaz clonable ver: http://download.oracle.com/javase/6/docs/api/java/lang/clonable.html Como te dice Aioobe.

El método de clon se declara protegido en el objeto, y debe sobrescribirlo con un método público para usarlo. Ver http://download.oracle.com/javase/6/docs/api/java/lang/object.html#clone()

En resumen, la razón de esto es que para clonar un objeto, podría o no ser necesario hacer un "clon profundo", por ejemplo. Campos de clones y sus sub elementos. O puede no tener sentido clonar un objeto, como el caso es con entero (porque es inmutable)

En primer lugar, obtener una copia a través de la clonación que necesitaba cuando no desea que otros cambien su copia. Ahora Integer es una clase de envoltura como cadena y doble que son Inmutable. Eso significa que no puedes cambiar las partes internas de ello. Entonces, siempre que tenga la referencia original, su objeto está intacto.

decir

Integer a = new Integer(4); // a referencing to this newly Created Integer
    b = a;  // b is referencing to..
    b = new Integer(8) // b no longer references to 4. 
                      //We changed the reference not the internals of it which is impossible.

Puede ser difícil de creer, pero su error es correcto: Clone () tiene acceso protegido en java.lang.object

Sí, porque el método clone () es protegido Solo puede ser heredado, pero no puede llamarlo al objeto de otra clase. Cada clase hereda objeto, por lo que puede llamar a clon ().

Pero en el método (predeterminado/nativo) clone () tiene un if () {} en el que si su clase no se implementa clonable, lanzará una excepción ClonenotSupportedException. Dije nativo porque el método clone () es nativo, cuando lo llamas, en la parte posterior se llama otro método escribido en C ++.

Aquí hay una pequeña parte del código que se llama cuando llama a Clone ().

if (!klass->is_cloneable()) {
    ResourceMark rm(THREAD);
    THROW_MSG_0(vmSymbols::java_lang_CloneNotSupportedException(), klass->external_name());
  }

Gracias ¿Es posible encontrar la fuente para un método nativo de Java?

Puede usar la reflexión para llamar al método de clon sin anularlo en su objeto.

public class Main{
    public static void main(String[] args) throws CloneNotSupportedException {
        A a = new A();
        Object o = new Object();
        Method method = null;
        try {
            method = o.getClass().getDeclaredMethod("clone");
        } catch (NoSuchMethodException e) {
            e.printStackTrace();
        }
        method.setAccessible(true);
        try {
            System.out.println(method.invoke(a));
        } catch (IllegalAccessException | InvocationTargetException e) {
            e.printStackTrace();
        }
    }
}

class A implements Cloneable {
}

y method.invoke(a) instanceof A se evalúa como verdadero

sin implementar clonables obtendrás

Caused by: java.lang.CloneNotSupportedException: defaultPackage.A
    at java.lang.Object.clone(Native Method)

Y debido a que el entero no implementa clonable, el método Clone () arrojará java.lang.clonenotsupportedException.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top