et la meilleure réponse serait B. C fonctionne également sur certaines plates-formes, mais ne sont pas recommandées et est très rare (au moins, je je ne l'ai pas vu depuis plus de 10 ans en programmation Java).
EDIT
Une idée fausse commune avec les débutants en Java est un nom de classe est quelque chose comme "MyClass". Mais ce n'est pas exact. la nomenclature "MyClass" comme vu dans la déclaration class MyClass
est vraiment une commodité pour le programmeur que le compilateur combine avec la déclaration de package pour créer ce que Java appelle un nom de classe qualifié, que tous les noms de classe sont réellement à l'exécution. (En C#, ils utilisent des espaces de noms pour cela).
Cela devient évident dans de nombreux cas, tels que les traces de pile et les signatures de méthodes qui contiennent toujours, par exemple, java.lang.String. Parce que "String" est juste une forme courte qui est résolue en java.lang.String. Vous pouvez le prouver en créant votre propre chaîne dans votre propre paquet ... mais attention, vous devrez utiliser explicitement java.lang.String ou my.package.String partout où les deux packages ou classes sont importés. Une fois que vous avez assimilé le fait que tous les noms de classe sont entièrement qualifiés et que le compilateur vous aide à éviter le travail fastidieux en utilisant les importations pour résoudre les formulaires courts en formulaires complets, les choses deviennent plus claires.
Il est alors évident pourquoi:
java -cp com/soleil/test Commander
ne fonctionne pas. L'option cp place le répertoire ./com/sun/test (relatif au répertoire courant) sur le chemin de la classe, mais il n'y a pas de classe nommée Commander ... c'est com.sun.test.Commander. Cela implique deux choses: (a) la ligne de commande requiert com.sun.test.Commander et (b) le classpath doit contenir une entrée pour le répertoire contenant "com" afin de résoudre cette classe car une classe nommée xyMyClass doit être en x/y par rapport à un élément classpath.
PS: Vous ne devriez pas utiliser com.sun comme nom de package, sauf si vous êtes employé par Sun, puisque le nom de domaine sun.com appartient à Sun. Cette convention existe pour éviter les collisions de classes et de noms.
PPS: Il y a une chose telle que le package par défaut, qui est « spécifiée » en omettant la déclaration de paquet - mais il ne devrait presque jamais être utilisé. Le seul endroit que j'ai trouvé légitime est un « lanceur/Classloader » autonome où l'on souhaite pouvoir faire:
java -cp . Launcher com.xxx.yyy.TargetApp
avec Launcher.class dans le répertoire courant ... et qui est seulement car les fichiers JAR sont bloqués pendant que l'application s'exécute alors que les fichiers de classe ne le sont pas, ce qui signifie que Launcher.class peut se mettre à jour automatiquement, tandis que Launcher.jar ne le peut pas.
Pourquoi ne pas simplement essayer tous? – sfussenegger
Vous avez de la chance. Évidemment, certains gars répondent à n'importe quoi pour la réputation;) – sfussenegger
Oui, il doit essayer de trouver la solution. Cependant, il peut ne pas comprendre pourquoi ils travaillent ou pas ... – romaintaz