Primordial vs Cacher Java Confus
Je suis confus sur la façon Impérieuse diffère de la Clandestinité en Java. Quelqu'un peut-il fournir plus de détails sur la façon dont ces différences? J'ai lu le Java Tutoriel mais l'exemple de code encore à gauche me confondre.
Pour être plus clair, je comprends Primordial de bien. Mon problème est que je ne vois pas ce que le masquage est toute différente, à l'exception du fait que l'on est au niveau de l'instance, tandis que l'autre est au niveau de la classe.
En regardant le tutoriel Java code:
public class Animal {
public static void testClassMethod() {
System.out.println("Class" + " method in Animal.");
}
public void testInstanceMethod() {
System.out.println("Instance " + " method in Animal.");
}
}
Ensuite, nous avons une sous-classe de chat:
public class Cat extends Animal {
public static void testClassMethod() {
System.out.println("The class method" + " in Cat.");
}
public void testInstanceMethod() {
System.out.println("The instance method" + " in Cat.");
}
public static void main(String[] args) {
Cat myCat = new Cat();
Animal myAnimal = myCat;
Animal.testClassMethod();
myAnimal.testInstanceMethod();
}
}
Puis ils disent:
La sortie de ce programme est comme suit:
Méthode de la classe des Animaux.
La méthode d'instance dans le Chat.
Pour moi, le fait que l'appel d'une méthode de classe testClassMethod() directement à partir de l'Animal de la classe, exécute la méthode des Animaux de la classe est assez évident, rien de spécial là. Puis ils appellent le testInstanceMethod() à partir d'une référence à myCat, donc encore une fois assez évident que la méthode exécutée est alors l'un dans l'instance de Chat.
De ce que je vois ce que l'appel de cacher se comporte comme primordial, alors pourquoi faire cette distinction. Si j'exécute ce code à l'aide des classes ci-dessus:
Cat.testClassMethod();
Je vais prendre:
La méthode de classe dans la Cat.
Mais si je supprime le testClassMethod() de Chat, alors je vais prendre:
La méthode de la classe des Animaux.
Qui me montre que la rédaction d'une méthode statique, avec la même signature que dans le parent, dans une sous-classe assez bien fait un remplacement.
J'espère que je suis clair mon où je suis confus et quelqu'un peut jeter un peu de lumière. Merci beaucoup à l'avance!
Vous devez vous connecter pour publier un commentaire.
Plus de l'équitation, fondamentalement, prend en charge la liaison tardive . Par conséquent, la méthode qui sera appelée est décidé au moment de l'exécution.C'est pour les non-méthodes statiques.
Le masquage est pour tous les autres membres (méthodes statiques , les membres de l'instance, les membres statiques). Il est basé sur la liaison anticipée . Plus clairement , la méthode ou le membre d'être appelé ou utilisé est décidé lors de la compilation.
Dans votre exemple, le premier appel ,
Animal.testClassMethod()
est un appel à unestatic
méthode,par conséquent, il est assez sûr que la méthode qui va être appelé.Dans le deuxième appel,
myAnimal.testInstanceMethod()
, il appelle une non-méthode statique. C'est ce qu'on appelle polymorphisme de l'exécution. Il n'est pas décidé jusqu'au moment de l'exécution de la méthode qui sera appelée.Pour plus de précisions, lire cette.
private methods
? Ils ne peuvent pas êtreoverridden
depuis le sous-classe ne savent pas à propos de leur existence.. Donc ils pourraient êtrehidden
à la place.Méthodes statiques sont cachés, non-méthodes statiques sont redéfinies.
La différence est notable lorsque les appels ne sont pas qualifiés de "quelque chose()" vs "ce.quelque chose()".
Je ne peux pas vraiment l'air de le mettre vers le bas sur les mots, alors, voici un exemple:
De SORTIE:
husky.Animal();
il imprime animal.quelque chose ou chien.quelque chose? je suppose que son FAUX de dire ** que ** * * * Ce sera toujours appeler l'Animal.quelque chose()C'est la différence entre les remplacements et la clandestinité,
Si je comprends votre question correctement, alors la réponse est "vous êtes déjà primordial".
"Qui me montre que la rédaction d'une méthode statique, avec le même nom que dans le parent, dans une sous-classe assez bien fait un remplacement."
Si vous écrivez une méthode dans une sous-classe avec exactement le même nom qu'une méthode dans une super-classe, il remplace la super-classe de la méthode. Le @Override annotation n'est pas nécessaire de remplacer une méthode. Il permet toutefois de rendre votre code plus lisible et force le compilateur de vérifier que vous êtes réellement remplacement d'une méthode (et de ne pas écorcher la sous-classe de la méthode par exemple).
Primordial se produit uniquement avec des méthodes d'instance.
Lorsque le type de la variable de référence est l'Animal et l'objet est le Chat puis la méthode d'instance est appelée à partir de Chat (c'est primordial). Pour la même acat objet à la méthode de classe de l'Animal est utilisé.
De sortie est:
La règle pour la mémorisation est simple: une méthode dans l'extension de la classe
ne peut pas changer statique d'annuler et de
ne peut pas changer vide à la statique.
Il sera la cause de la compilation d'erreur.
Mais si void Nom changé à void Nom c'est Primordial.
Et si statique Nom changé à statique Nom il se cache. (Lorsque le compilateur voit statique méthode dans l'objet de la super-classe, alors il ne cochez pas la méthode dans la sous-classe.)
Dans cet extrait de code, j'utilise "privé" modificateur d'accès au lieu de "statique" pour vous montrer la différence entre cacher les méthodes et la redéfinition des méthodes.
De sortie:
Basé sur ma récente de Java études
Exemple de l'OCP Java 7 livre, page 70-71:
mais si l'on écrit les principales suivantes:
Dans la seconde main, nous à l'aide de la classe de l'Objet comme type statique, donc quand on l'appel de l'égalité de méthode au Point de l'objet, il est en attente d'une classe Point d'arriver comme un paramètre,mais de l'Objet à venir. Si la classe de l'Objet est égale à la méthode de se faire, parce que nous avons une equals(Object o) il y a des. Dans ce cas, le Point est de classe est égale à doesnt remplace, mais cache la classe de l'Objet est égale à la méthode.
Liés java tutoriel explique le concept de l'annulation et de cacher
La distinction entre le masquage d'une méthode statique et de la substitution d'une méthode d'instance a d'importantes implications:
De revenir à votre exemple:
Déclaration ci-dessus ne montre pas cacher encore.
Maintenant, modifiez le code comme ci-dessous afin d'obtenir les différentes sortie:
Outre les exemples énumérés ci-dessus, voici un petit exemple de code pour clarifier la distinction entre la clandestinité et majeur:
L'appel de
child.printParent()
sorties:pour être caché: Parent
pour être redéfinies: Enfant
L'appel de
child.printChild()
sorties:pour être caché: Enfant
pour être redéfinies: Enfant
Que wee pouvez le voir à partir des sorties ci-dessus (surtout les gras sorties), la méthode de masquage se comporte différemment de primordial.
Java permet à la fois cacher et prioritaire que pour les méthodes. La même règle ne s'applique pas à des variables. La redéfinition de variables n'est pas autorisé, de sorte que les variables ne peuvent être cachés (pas de différence entre statique ou variable non statique). L'exemple ci-dessous montre comment la méthode
getName()
est surchargé et la variablename
est caché:Au moment de l'exécution de la version enfant d'une méthode surchargée est toujours exécutée pour une instance
indépendamment du fait que l'appel de méthode est défi nie dans un parent ou d'un enfant de la méthode de classe. Dans ce
la manière, la méthode parent n'est jamais utilisé, à moins qu'un appel explicite à la méthode parent est
de référence, en utilisant la syntaxe
ParentClassName.méthode().
Sinon, au moment de l'exécution du parent
version caché d'une méthode est toujours exécuté si l'appel de la méthode est définie dans le
classe parent.
Dans la méthode primordial, la méthode de résolution est effectuée par la JVM sur la base de l'exécution de l'objet. Alors que dans la méthode de la clandestinité, de la méthode de résolution est effectuée par le compilateur sur la base de référence.
Ainsi,
Si le code aurait été écrit comme,
La Sortie sera comme ci-dessous:
Méthode de la classe des Animaux.
Comment est-statique méthode de masquage qui se passe en java?
Classe chat est l'extension de l'Animal de la classe. Donc dans la classe Chat aura à la fois des méthodes statiques (je veux dire des Enfants de la classe de la méthode statique et Parent de la classe de la méthode statique)
Mais comment la JVM cacher Parent méthode statique? La façon dont il traite dans le Tas et de la Pile?