2 votes

Confusion de la compilation Java : pourquoi ce code compile-t-il ?

Je ne suis pas sûr de la raison pour laquelle ce code (qui donne un stackoverflow au moment de l'exécution) compile :

import java.io.*;
import java.util.*;

public class StackOverflow {
   StackOverflow overflow = new StackOverflow();

   public void myCall() {
       overflow.myPrint();
   }

   public static void main(String[] args) {
       StackOverflow newStackOverflow = new StackOverflow();
       newStackOverflow.myCall();
   }

   public void myPrint() {
       System.out.println("I am confused!");
   }
}

La raison pour laquelle je suis confus est que, dans la définition de la classe, j'essaie de créer un objet de la classe que j'essaie de définir. Ne devrait-il pas s'agir d'une erreur de compilation ?

0voto

David Schwartz Points 70129

Puisqu'il n'est pas possible pour un compilateur d'attraper toutes les façons possibles de faire ceci, il n'y a pas d'exigence que le compilateur l'attrape. En général, la récursion illimitée n'est détectable qu'au moment de l'exécution. (Et même alors, tout ce que vous pouvez détecter est qu'elle dépasse les limites autorisées).

0voto

ManojGumber Points 1615

La raison pour laquelle je suis confus est que, dans la définition de la classe, j'essaie de créer un objet de la classe que j'essaie de définir. Ne devrait-il pas s'agir d'une erreur de compilation ?

Lorsque le compilateur voit ce morceau de code, vous avez déjà défini complètement votre classe et le compilateur peut créer un objet de cette classe sans ambiguïté. Il n'y a donc pas d'erreur de compilation.

0voto

Krish Points 437

Non, il ne devrait pas donner d'erreur, en écrivant la ligne suivante StackOverflow overflow = new StackOverflow(); vous créez en fait une variable d'instance dans une classe. Et cette ligne StackOverflow newStackOverflow = new StackOverflow(); va créer votre variable locale.

si vous mettez à jour votre code comme suit, alors cela fonctionnera également.

import java.io.*;
import java.util.*;

public class StackOverflow {
   private static StackOverflow overflow = new StackOverflow();

   public void myCall() {
       overflow.myPrint();
   }

   public static void main(String[] args) {
       overflow.myCall();
   }

   public void myPrint() {
       System.out.println("I am confused!");
   }
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X