La méthode clone() de l'objet n'est pas visible?
Question:
package GoodQuestions;
public class MyClass {
MyClass() throws CloneNotSupportedException {
try {
throw new CloneNotSupportedException();
} catch(Exception e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
try {
MyClass obj = new MyClass();
MyClass obj3 = (MyClass)obj.clone();
} catch (CloneNotSupportedException e) {
e.printStackTrace();
}
}
}
Ici la classe "Maclasse" peut en mesure de cloner son propre objet en appelant la méthode clone dans l '"Objet" de la classe.
Quand je clone le de cette classe('Maclasse') dans une autre classe('TestSingleTon') dans le même package 'GoodQuestions' il est en train de jeter les suivantes erreur de compilation.
"La méthode clone() de l'Objet n'est pas visible'
Voici donc le code de jeter l'erreur ci-dessus?
package GoodQuestions;
public class TestSingleTon {
public static void main(String[] args) {
MyClass obj = new MyClass();
MyClass obj3 = obj.clone(); ---> here is the compile error.
}
}
Vous devez vous connecter pour publier un commentaire.
Cette erreur se produit parce que dans la classe Object clone() la méthode est protégé.
Si vous devez remplacer méthode clone() dans la classe respective.
Par exemple. Ajouter le code ci-dessous dans Maclasse
Également de mettre en œuvre Clonable interface.
Par exemple.
public class MyClass implements Cloneable
clone()
a un accès protégé. Ajouter ceci dans leMyClass
Aussi Changer
public class MyClass implements Cloneable
Parce que clone() est une méthode protégée. Voir Objet.clone() pour plus de détails.
Remplacer clone() dans MyClass et de faire la classe en œuvre Clonable interface.
Vous avez juste à faire MyClass mettre en œuvre Clonable interface. Pas besoin de provode mise en œuvre de clone().
La subtilité, c'est que le
clone()
méthode deMyClass
est héréditaire, ne sont pas définis dansMyClass
. DoncMyClass
peut invoquerclone()
de l'Objet, car il est protégé, maisMyClass
n'a pas vraiment d' ont unclone()
de lui-même, de sorteTestSingleTon
ne peut pas accéder àclone()
deMyClass
car il n'est pasclone()
méthode. Bien qu'ils soient tous les deux dans un même package, vous devez définir uneclone()
méthode dansMyClass
pour s'assurer qu'il est vraiment "a" de laclone()
. Par ailleurs, n'oubliez pas de mettre en œuvre l'interfaceCloneable
pourMyClass
.Object.clone()
méthode a un accès protégé, sensit's visible to sub-classes and classes in the same package
.Il est bon d'avoir un constructeur de copie pour copie manuelle de l'objet.
LIRE Pourquoi un constructeur de copie de Josh Bloch
Pour vous d'être en mesure de cloner MyClass, il doit mettre en œuvre les Clonable interface
J'ai fait des test de code de et voici mes conclusions:
Quand un membre protégé est héritée à travers le paquet, il devient membre privé de classe héritée
alors que
quand un membre protégé est héritée dans le même package, il devient par défaut membre de la classe héritée.
Dans votre exemple, clone() de la classe d'Objet est hérité dans Maclasse à travers le paquet.
Classe d'objet en java.des packages de langue et de MyClass est dans GoodQuestions paquet.
Donc méthode clone() devient un membre privé de la classe MyClass.
Qui explique pourquoi vous ne pouvez pas accéder méthode clone() de TestSingleTon classe.