Question

Java doc dit -

  

L'objet de classe ne se   mettre en œuvre l'interface Cloneable, donc   appelant la méthode clone sur un objet   dont la classe est l'objet se traduira   lancer une exception au moment de l'exécution.

Ce qui est pourquoi la méthode clone classe Object est protégé? est-ce pas?

Cela signifie que toute classe qui ne met pas en œuvre cloneable jetteront exception CloneNotSupported lorsque sa méthode clone est invoquée.

J'ai couru un programme de test

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{

}

A partir de la méthode clone de super.clone de classe de test est invoquée?

Pourquoi ne pas jeter exception?

Était-ce utile?

La solution

arbre d'héritage des regards instance de Test de t comme

Object
  ABC
    Test

Test aussi des outils Cloneable ce qui signifie que lorsque vous appelez la méthode super.clone() de la méthode Object clone sera appelée. Il vérifie si les outils de t instance l'interface Cloneable. Comme il le fait de mettre en œuvre la méthode ne jette pas une exception.

Autres conseils

L'interface Cloneable est une interface de marqueur qui indique que la classe mise en œuvre prend en charge la méthode clone. La raison pour laquelle super.clone () ne jette pas une exception est que la base de l'objet, il est appelé est Cloneable par héritage.

De la Javadoc:

  

classe implémente l'interface Cloneable pour indiquer la méthode Object.clone () qu'il est légal pour cette méthode pour faire un champ pour champ copie des instances de cette classe.

     

Invoquer la méthode clone de l'objet sur une instance qui ne met pas en œuvre les résultats de l'interface Cloneable à l'exception CloneNotSupportedException étant levée.

Voir: Cloneable (plate-forme Java SE 6)

Parce que vos outils de classe Cloneable. De la Javadoc de Cloneable:

  

classe implémente l'interface Cloneable pour indiquer la méthode Object.clone () qu'il est légal pour cette méthode pour faire un champ pour champ copie des instances de cette classe.

Alors cela permet à la méthode Object d'utilisation clone(). Il est (à nouveau selon la Javadoc) juste une convention à la dérogation clone(). Si vous ne le remplacez et la méthode de Object de clone() exécute un champ pour champ copie, vous pouvez toujours obtenir un CloneNotSupportedException si l'un des champs est lui-même pas cloneable. Il est donc de bons conseils pour la remplacer.

  

Pourquoi la méthode clone classe Object protected?

Pour qu'une classe qui choisit de soutenir le clonage est pas forcé pour l'exposer dans son API publique.

En tant que votre exemple montre, une sous-classe est autorisé à passer outre une méthode avec un accès plus que la version héritée de la méthode. Vous ne pouvez pas réduire l'accès d'une méthode de cette façon.

  

Cela signifie que toute classe qui ne met pas en œuvre cloneable jetteront exception CloneNotSupported lorsque sa méthode clone est invoquée.

C'est exact.

  

A partir de la méthode clone de super.clone de classe de test est invoquée?

C'est exact.

  

Pourquoi ne pas jeter exception?

Parce que vous avez déclaré que votre classe implémente Cloneable. Si vous ne l'aviez pas fait, il serait jeter une exception ... en supposant que votre méthode clone encore appelé super.clone().

Cela pourrait vous donner la réponse à pourquoi la méthode protégée pourquoi la méthode clone protégé

Il ne jette pas exception parce que vous implémentez Cloneable. De la documentation Cloneable:

  

"classe implémente A l'interface Cloneable pour indiquer la méthode Object.clone () qu'il est légal pour cette méthode pour faire un champ pour champ copie des instances de cette classe.   La méthode de l'invocation clone de l'objet sur une instance que ne met pas en œuvre les résultats d'interface Cloneable dans la CloneNotSupportedException d'exception jetés. «

Mais comme vous le mettre en œuvre vous dire la mise en œuvre de l'objet qu'il est légal de faire une copie de champ pour champ il ne jette pas l'exception.

Je dirais une bonne question de confondre les personnes interrogées:.)

En ce qui concerne la raison pour laquelle il ne jette pas l'exception. Pensez-y de la manière d'objets. Votre objet est t de test de classe qui implémente Cloneable. Lorsque vous appelez la méthode super.clone il est encore un objet de classe Test et donc il n'y a aucune raison pour elle de jeter exception CloneNotSupported. Si elle avait été un objet de classe objet lui-même, il aurait jeté l'exception.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top