Comment les méthodes protégées de java.lang.Object sont-elles protégées des sous-classes?
Le mot-clé protected
accorde l'accès aux classes du même package et sous-classes (http://java.sun.com/docs/books/tutorial/java/javaOO/accesscontrol.html).
Maintenant, chaque classe a java.lang.Object
en tant que super-classe (http://java.sun.com/j2se/1.5.0/docs/api/java/lang/Object.html).
D'où je conclus que chaque classe peut accéder à java.lang.Object
's méthodes, même si elles sont protected
.
Prendre un coup d'oeil à l'exemple suivant:
public class Classetest { Objet public getOne() throws CloneNotSupportedException { de retour cette.clone(); } Objet public getTwo() throws CloneNotSupportedException { return ((Objet)).clone(); } }
Tout getOne()
compile fine, getTwo()
donne
Testclass.java:6: clone() a un accès protégé en java.lang.Objet return ((Objet)).clone();
Je ne pas comprendre pourquoi getTwo()
ne compile pas, ni quelle est la différence (en ce qui concerne l'accès de java.lang.Object
s membres), avec getOne()
.
source d'informationauteur Adrian Heine
Vous devez vous connecter pour publier un commentaire.
Vous pouvez uniquement accéder aux membres d'un type dans un package différent si le type de compilation de l'expression que vous faites référence est celui de votre propre classe ou sous-classe. (Où "votre" classe est la classe contenant le code). Votre propre classe doit être une sous-classe du type qui, à l'origine, déclare la méthode, trop.
Voici un exemple: supposons que
Base
est dans un package différent de toutes les autres classes:En d'autres termes, c'est vous permettant d'y avoir accès pour les membres des "objets qui sont un comme vous".
Détails sont dans section 6.6.2 de la Spécification du Langage Java:
Lorsque vous avez dit "
((Object) this).clone()
", vous accédez à votre propre objet par l'intermédiaire de sa super-classe de l'Objet. Vous avez effectué un élargissement de la conversion d'un Objet. Le code puis tente d'appeler clone sur l'Objet.Mais, comme vous l'avez remarqué, le clone est une méthode protégée, ce qui signifie que uniquement si votre objet a été dans le même package de java.lang serait-il en mesure d'accéder à l'OBJET de la méthode clone.
Quand vous dites cela.clone, de votre classe d'Objet étendu et avait ainsi accès à de remplacer ou de les utiliser clone directement à travers le protégé modificateur de classe en raison de l'héritage. Mais cela ne change pas l'Objet de la mise en œuvre.
En disant: ((Objet) yourObject), vous obtenez quelque chose qui est uniquement accessible par la classe d'Objet. Seulement les méthodes publiques de la classe d'Objet sont accessibles à l'extérieur du paquet java.lang, de sorte que vous obtenez le moment de la compilation exception, parce que le compilateur sait.
En disant cela.clone(), vous appelez votre objet de la méthode clone qu'il a obtenu par le biais d'hériter par l'Objet, et est maintenant en mesure d'être appelé, car il devient une partie de votre sous-classe personnalisée.
La différence est la façon dont vous accédez à l'Objet.clone(). le clone n'est accessible que lorsque l'on y accède via une sous-classe ou classe du même package. Dans le getOne() exemple vous êtes claling.clone(). De toute évidence, cela répond à l'accès de l'intérieur d'une sous-classe.
Dans getTwo() si vous êtes acessing Objet.clone() et pas TestClass.clone(). Pour que cela fonctionne, vous devez avoir paquet niveau de l'accès à l'Objet dont vous n'avez pas et d'où l'erreur.