Pregunta

Si tengo:

class foo implements Cloneable

y luego haz:

bar = new foo();
bar.clone();

Obtengo una copia superficial sin necesidad de escribir ninguna bar.clone() código como normalmente necesitaría hacer cuando implemento una interfaz.

Tengo entendido que las funciones de una interfaz deben ser completadas por la clase que la implementa, y Object.clone() no tiene implementación (según los documentos, "La clase Objeto no implementa por sí misma la interfaz Clonable")

Entonces, ¿de dónde viene mi clon superficial?¿Dónde está el código que implementa? bar.clone() si Object.clone() ¿No tiene implementación?Estoy confundido.

¿Fue útil?

Solución

ser muy cuidadoso usando clon. De hecho, yo evitaría por completo. Tengo no lo necesitaba. PERO ... dicho esto, la mejor discusión del tema que he leído es por Joshua Bloch, en Java eficaz. Leer artículo 11:. "Anular clon juiciosamente"

Por favor, hágase un favor y leer ese artículo. De hecho, me recomiendo leer todo ese capítulo (y el resto del libro). Todo lo que necesita saber acerca de clon y por qué le advierto de esto es en ese país.

Espero que esto ayude.

Otros consejos

Object.clone () tiene una aplicación:

http: // java.sun.com/j2se/1.5.0/docs/api/java/lang/Object.html#clone ()

Este enlace explica la interfaz Cloneable: http://java.sun.com/j2se /1.5.0/docs/api/java/lang/Cloneable.html

Un objeto debe implementar la interfaz Cloneable con el fin de llamar al método clone (), de lo contrario, se lanza una CloneNotSupportedException.

Por definición, todas las clases de Java extender la clase de objeto de base, y la clase de objeto tiene un método clone () por defecto, aunque sí del objeto no implementa Cloneable. El método de la clase Object clone () será llamado si no se sobreescribe por sí mismo.

Si tengo:"La clase Foo implementa clonable"

y luego haz:barra = nueva foo();barra.clon();

Obtengo una copia superficial sin necesidad de escribir ningún código Bar.Clone () como normalmente debería hacer cuando implemento una interfaz.

Eso sólo funcionaría si lo llamas dentro de la clase "foo", porque el método .clone() hereda de Object esta protegido.

Tengo entendido que las funciones de una interfaz deben ser completadas por la clase que lo implementa, y Object.Clone () no tiene implementación (según los documentos, "el objeto de clase no implementa la interfaz clonable")

(1) Object.clone() tiene una implementación.Hace una copia superficial del objeto si el objeto implementa Cloneable.(2) El .clone() El método no forma parte de ninguna interfaz.(3) Tener un .clone() método e implementación del Cloneable La interfaz son cosas completamente separadas.Sólo necesitas implementar el Cloneable interfaz si tiene la intención de hacer uso de Object's clone método;sin embargo, esta es la forma recomendada de escribir un clone método para su clase - para obtener su copia de la superclase clone método, que eventualmente llega hasta Object's clone método.

Tengo entendido que las funciones de una interfaz deben ser completadas por la clase que las implementa, y Object.clone() no tiene implementación (según los documentos, "La clase Objeto no implementa por sí misma la interfaz Clonable")

hay una diferencia entre decir Object.Clone () no tiene implementación y el objeto de clase no implementa la interfaz clonable

El método de clonación del objeto tiene implementación, realiza una copia en memoria del objeto que llamó al método de clonación.

Tienes razón, la clase Objeto no implementa clonable, todo lo que hace es verificar que el objeto sea clonable o no.

El punto de respuesta anterior es que lea algún libro, creo que puedo dar una solución rápida, así que para responder a su pregunta

Entonces, ¿de dónde viene mi clon superficial?Método de clonación de objetos

¿Dónde está el código que implementa bar.clone() si Object.clone() no tiene implementación?Tiene implementación, escrita en código nativo.

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