7
votes

Pourquoi ces deux échantillons de code produisent-ils des sorties différentes?

Sample 1:

 Gurrr! Moo! Moo!


1 commentaires

"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 :)


5 Réponses :


7
votes

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();
   }


3 commentaires

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



3
votes

Vous ne pouvez pas remplacement méthodes statiques avec la même signature dans les sous-classes, juste masquer .

Pour les méthodes de classe, le système d'exécution invoque la méthode définie dans le type compacte de la référence sur laquelle la méthode est appelée. Par exemple, le système d'exécution invoque la méthode définie dans le type d'exécution de la référence sur laquelle la méthode est appelée.

http://life.csu.edu.au /java-Tut/java/javaoo/override.html


0 commentaires

3
votes

Certaines des "pièges" radiophoniques connus

  • Les méthodes statiques ne peuvent pas être remplacées
  • Les méthodes privées ne peuvent pas être remplacées

    Ceci explique la sortie.


0 commentaires

1
votes

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.


0 commentaires

1
votes

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 SaySomething () code>. Les méthodes régulières sont liées à une instance d'un objet, non à la classe elle-même. P>

C'est aussi pourquoi vous ne pourriez jamais faire cela: p>

class Animal
{
   public abstract static void saySomething();
}


0 commentaires