Je suis un peu nouveau dans ce domaine, alors soyez indulgent avec moi. J'apprends actuellement C # et Java et l'une de leurs similitudes est que la fonction principale doit être encapsulée dans une classe. Par exemple
public class HelloWorld {
public static void main(String[] args) {
// Some Code
}
}
Maintenant, je comprends que principal est souvent le "point d'entrée" lorsque vous exécutez le programme. Donc, fondamentalement, votre programme commencera à s'exécuter où que soit la fonction principale. Mais je crois que dans les deux langues, vous pouvez avoir plusieurs fonctions principales dans plusieurs classes. Alors, quand je compile un projet avec plusieurs fonctions principales, où est le "point d'entrée"? Comment le compilateur sait-il par où commencer?
Dans .NET, vous pouvez définir quelle classe contient la méthode Main que vous souhaitez utiliser lors de la compilation.
http://msdn.Microsoft.com/en-us/library/x3eht538.aspx
En Java, si vous vous regroupez dans un pot, vous pouvez définir votre point d'entrée dans le manifeste du pot.
http://docs.Oracle.com/javase/tutorial/deployment/jar/appman.html
En Java, l'ordinateur détermine le "point d'entrée" lorsque vous exécutez réellement le programme, pas lorsque vous compilez. Par exemple, à partir de la ligne de commande
Java MyClass
recherche main()
dans MyClass
. Toutes les autres fonctions main()
sont ignorées.
Si vous utilisez un IDE, vous pouvez définir quelle classe contient la fonction main()
que vous souhaitez utiliser.
En C #, vous pouvez utiliser plusieurs méthodes Main
.
S'il existe plusieurs méthodes Main
, le compilateur ne sait pas quel point d'entrée utiliser et il vous montrera donc une erreur.
Vous devez spécifier la méthode Main
à utiliser lors de la compilation: vous pouvez spécifier la méthode à utiliser utilisé comme option de compilateur dans l'environnement de développement Visual Studio ou via le compilateur csc.
La classe principale est une classe spéciale pour une seule raison: lorsque vous exécutez la machine virtuelle Java Virtual Machine, cette fonction est ce que la JVM appelle. Elle est essentiellement comme n'importe quelle autre fonction, et en fait vous pouvez appeler la fonction principale d'une classe à partir d'une autre classe.
Lorsque vous compilez un projet avec plusieurs classes, vous dites à la JVM d'exécuter la classe avec la classe principale que vous souhaitez utiliser, comme ceci:
Java SomeClass
et il exécutera la méthode principale de SomeClass, en supposant que SomeClass est compilé et que le fichier compilé approprié se trouve dans votre chemin de classe. (C'est quelque chose que vous devrez travailler avec votre système d'exploitation particulier, mais je pense qu'il est assez habituel pour l'option -cp de spécifier un chemin de classe). Donc ça:
Java -cp /home/MyName Someclass
exécutera la fonction principale de SomeClass dans le répertoire/home/MyName
En C #, vous spécifiez le point d'entrée à l'aide de l'option du compilateur /main:
.
Considérez le code suivant contenant deux fonctions main()
:
namespace Application {
class ClassOne {
static void main () {
// Code here
}
}
class ClassTwo {
static void main () {
// Code here
}
}
}
Pour utiliser ClassOne.main()
comme point d'entrée, vous devez spécifier les éléments suivants lors de la compilation:
csc /main:Application.ClassOne hello.cs
Pour plusieurs fonctions principales, le point d'entrée peut être déclaré par:
Pour définir cette option de compilateur dans l'environnement de développement Visual Studio
Ouvrez la page Propriétés du projet.
Cliquez sur la page de propriétés de l'application.
Modifiez la propriété de l'objet Démarrage.
référence: http://msdn.Microsoft.com/en-us/library/x3eht538.aspx
En Java, comme d'autres l'ont souligné, vous définissez la classe contenant votre fonction principale lorsque vous exécutez la commande Java
.
Mais vous pouvez également créer un fichier exécutable, qui peut être exécuté avec Java -jar my.jar
. Dans ce cas, vous avez besoin d'un fichier manifeste appelé MANIFEST.MF
dans le dossier META-INF
dans le pot. Dans ce fichier, vous spécifiez la classe contenant la fonction principale à l'aide de l'instruction: Main-Class: YourClass
.
La méthode principale est statique, ce qui signifie qu'elle appartient à la classe plutôt qu'à l'objet. Ainsi, l'objet n'aura pas du tout d'autre méthode principale. Il n'aura pas de méthode principale supplémentaire, car main est statique. C'est donc une fois par classe.
Si vous avez plusieurs méthodes principales dans votre projet, vous spécifierez celle à lancer lors du démarrage de votre application
En fait, dans un fichier binaire, par exemple, le format PE dans Windows et le format ELF sous Linux ou tout autre système, l'en-tête du fichier binaire spécifiera où est l'adresse de début et il ne peut y en avoir qu'une.
Lequel devrait être le point d'entrée? Cela dépend de l'éditeur de liens. Tout comme @SetFreeByTruth a dit que vous pouvez le spécifier avec des paramètres de ligne de commande. De nombreux éditeurs de liens prennent en charge la spécification du point d'entrée avec des paramètres de ligne de commande. par exemple, gld de gnu peut spécifier le point d'entrée avec le paramètre -e.
Je ne connais pas le comportement de Java car il est chargé par Java machine virtuelle.