Pregunta

doc dice Java -

  

La clase Object en sí no lo hace   implementar la interfaz Cloneable, por lo   llamar al método clon en un objeto   cuya clase es objeto dará lugar a   lanzar una excepción en tiempo de ejecución.

razón por la cual se protege método clone en la clase de objeto? Es así?

Es decir, cualquier clase, que no implementa cloneable lanzará CloneNotSupported excepción cuando se invoca el método clone.

Me corrió un programa de prueba

public class Test extends ABC implements Cloneable{

    @Override
    public Object clone() throws CloneNotSupportedException {
        System.out.println("calling super.clone");
            return super.clone();
    }

    public static void main(String[] args) {
        Test t = new Test();
        try{
        t.clone();
        }
        catch (Exception e) {
            e.printStackTrace();
        }
    }
}
class ABC{

}

Desde se invoca super.clone método clone de prueba Clase?

¿Por qué no lanzar una excepción?

¿Fue útil?

Solución

árbol de herencia de las miradas ejemplo Test t como

Object
  ABC
    Test

Test también implementa Cloneable lo que significa que cuando se llama método super.clone() el método de Object clone se llamará. Se comprueba si los implementos ejemplo t la interfaz Cloneable. Desde que hace poner en práctica el método no lanzar una excepción.

Otros consejos

La interfaz Cloneable es una interfaz de marcador que indica que la clase que implementa soporta el método de clon. La razón de que super.clone () no produce una excepción es que el objeto de base que está siendo llamado en Cloneable es por herencia.

Desde el Javadoc:

  

implementa la clase A la interfaz Cloneable para indicar al método Object.clone () que es legal para que el método para hacer una copia de campo para el campo de las instancias de esa clase.

     

método clone de Invocación de objetos en una instancia que no implementa los resultados de interfaz Cloneable en el CloneNotSupportedException excepción siendo lanzada.

Ver: Cloneable (plataforma Java SE 6)

Debido a su clase implementa Cloneable. Desde el Javadoc de Cloneable:

  

implementa la clase A la interfaz Cloneable para indicar al método Object.clone () que es legal para que el método para hacer una copia de campo para el campo de las instancias de esa clase.

Así que este método permite el uso de Object clone(). Es (de nuevo de acuerdo con el Javadoc) sólo una convención para clone() anulación. Si no cancelas y método de Object clone() realiza una copia de campo-por-campo, es posible que aún así obtener una CloneNotSupportedException si uno de los campos es en sí misma no cloneable. Por lo tanto es un buen consejo para anularlo.

  

¿Por qué el método clone en protected clase Object?

Para que una clase que elige para apoyar la clonación no es forzó para exponerlo en su API pública.

A medida que su ejemplo demuestra, se permite una subclase para anular un método con un mayor acceso a la versión heredada del método. Simplemente no se puede reducir el acceso de un método de esta manera.

  

Es decir, cualquier clase, que no implementa cloneable lanzará CloneNotSupported excepción cuando se invoca el método clone.

Eso es correcto.

  

Desde se invoca super.clone método clone de prueba Clase?

Eso es correcto.

  

¿Por qué no lanzar una excepción?

Debido a que usted ha declarado que su clase implementa Cloneable. Si no hubiera hecho esto, le una excepción ... suponiendo que su método clone todavía se llama super.clone().

Esto le podría dar la respuesta a por qué se protege el método por qué está protegido método clon

No tirar excepción porque se implementa Cloneable. De la documentación Cloneable:

  

"implementa la clase A la interfaz Cloneable para indicar al método Object.clone () que es legal para que el método para hacer una copia de campo para el campo de las instancias de esa clase.   La invocación de método clone de objetos en una instancia que no implementa los resultados de interfaz Cloneable en el CloneNotSupportedException excepción que son lanzados. "

Sin embargo, a medida que va a implementar se le dice a la aplicación del objeto que es legal para hacer una copia de campo para el campo por lo que no lanza la excepción.

Yo diría que una buena pregunta para confundir a los entrevistados:.)

En cuanto a la razón por la que no lanza la excepción. Piense en ello en forma de objetos. Su objeto es t de prueba de clase que implementa Cloneable. Cuando se llama al método super.clone todavía es un objeto de la clase de prueba y por lo tanto no hay razón para que tire CloneNotSupported excepción. Si hubiera sido un objeto de la misma clase de objetos que hubiera tirado la excepción.

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