Sample 1:
Gurrr! Moo! Moo!
5 Réponses :
Lorsque vous appelez Sayyseomething () code> sur un animal, le type réel de l'animal ne compte pas parce que
SaySomething () code> est statique.
class Test {
static void mountain() {
System.out.println("Monadnock");
}
static Test favorite(){
System.out.print("Mount ");
return null;
}
public static void main(String[] args) {
favorite().mountain();
}
Je n'ai jamais compris pourquoi Java permet une invocation d'une méthode statique via une référence d'objet. Ce n'est pas nécessaire, et cela conduit à la confusion comme celle-ci.
D'accord. C ++ vous permet de le faire aussi. Je suppose que cela faciliterait simplement que le rédacteur du compilateur permettrait à ce type d'accès.
Eh bien, j'ai essayé de défendre ici: Stackoverflow.com/questions/3610309/java -Static-confusion
Vous ne pouvez pas remplacement em> méthodes statiques avec la même signature dans les sous-classes, juste masquer em>. p>
Pour les méthodes de classe, le système d'exécution invoque la méthode définie dans le type http://life.csu.edu.au /java-Tut/java/javaoo/override.html p>
Certaines des "pièges" radiophoniques connus p>
Ceci explique la sortie. P>
Les méthodes statiques sont liées à la "classe" et non à "l'instance" de l'objet. Puisque vous vous référez à un «animal» et appelez la méthode statique Saymentomething (). Il fera toujours l'appel à "animal" à moins que vous ne parliez pas à une vache. P>
Les méthodes statiques sont liées à leur classe au moment de la compilation et ne peuvent pas être utilisées polymorphiquement. Lorsque vous déclarez une méthode «statique» sur l'animal, elle est toujours liée à la classe d'animaux et ne peut pas être remplacée. Les méthodes statiques sont liées à l'objet de la classe, pas une instance de la classe.
Les méthodes régulières sont liées au moment de l'exécution et que la JVM peut donc examiner votre appel à "Sayoming" et tenter de déterminer si vous passez une sous-classe d'animal et si oui, a-t-il remplacé la méthode C'est aussi pourquoi vous ne pourriez jamais faire cela: p> SaySomething () code>. Les méthodes régulières sont liées à une instance d'un objet, non à la classe elle-même. P>
class Animal
{
public abstract static void saySomething();
}
"La spécification de langue java dit que" est vraiment tout ce qu'il y a. Pourquoi vous êtes autorisé à appeler une méthode statique d'une référence d'instance comme celle-là en premier lieu est la vraie bizarrerie. Mais il y a déjà au moins un énorme fil de wiki communautaire à ce sujet :)