Public static main en java

Résolu/Fermé
filem_ro3b Messages postés 9 Date d'inscription mercredi 2 avril 2008 Statut Membre Dernière intervention 4 avril 2008 - 3 avril 2008 à 10:40
 Fuot - 16 janv. 2014 à 17:39
Bonjour tout le monde
Comme je suis en train de visualiser des codes sources de quelques programmes simples en java en même temps avec des tutorials je trouve souvent une référence a des mots clefs dans la définitions des classes et ce ci au début de chaque script dans la plupart des cas .
Je comprends bien que java est un OOP et que chaque partie de tout scripte est considéré comme un Objet ou classe . c’est comme si on est en train de construire chaque programme ou application avec des petits pièces préfabriquées .
J’aimerai bien confirmer ca avec vous et en plus me donner des explications sur quelques mots clefs comme
« public , static , main » principalement.Car ce sont des mots clefs qui ne cessent pas de me sauter aux yeux

Merci pour vous d’avance
A voir également:

5 réponses

filem_ro3b Messages postés 9 Date d'inscription mercredi 2 avril 2008 Statut Membre Dernière intervention 4 avril 2008 9
3 avril 2008 à 12:20
ce que je n’arrive pas a comprendre encore c’est la différence entre les faits qu’une méthode ou classe soit accessible de l’extérieur ou de l’intérieur .
je n’ai pas une bonne idée sur ce que c’est l’instanciation . (es ce que ca veux dire la création d’un objet ou méthode personnalisée ? )

es ce que je peux comprendre main comme une methode qui active le kernel du java pour comprendre mes commandes ou les englober Comme document dans document.form.option dans javascript
et si c’est le cas comment peut on parler de main accedant une autre methode ou objet et by the by que veut on dire par acceder a une variable ou methode java parlant .

pouvez vous me simplifier static s’il vous plait

voilà trop de questions bêtes merci pour votre patience .

cracie mille
3
sendoshi Messages postés 22 Date d'inscription mercredi 2 avril 2008 Statut Membre Dernière intervention 16 décembre 2008 70
3 avril 2008 à 13:01
l'instanciation:
MyClass mc= new MyClass();

mc est une instance de MyClass. l'instanciation est la création d'un objet à partir d'une classe.

main:

c'est l'inverse: lorsqu'on dit à la JVM de lancer tel programme, elle commence par la méthode main. Si tu as fait du C c'est exactement la même chose. si tu n'en n'as pas fait, considère que le main est le point d'entrée de ton programme.

Public et private:

une méthode ou une variable peut être soit public, soit private. (ou protected ou par defaut mais on va se contenter de private et public pour commencer). On apelle ça des access modifier. Ce sont des mots clés qui déterminent QUI peut utiliser la dite méthode ou variable.

class MyClass{
     private int nombre;
     public setNombre(int i){
          if(i<100){
               this.nombre=i;
          }
          else{
               System.out.println("Hors de question, nombre doit être inférienr à 100");
          }
     }
     public int getNombre(){
          doStuff();
          return this.nombre;
     }
     private void doStuff(){
          System.out.println("do something");
     }
}

class MyOtherClass{

     public static void main (String [] arg){
          MyClass myInstance= new MyClass(); // j'instancie MyClass, ça me donne un objet de type MyClass
          //Insert Code Here
          System.out.println(myinstance.getNombre());
     }
}


J'ai donc une classe MyClass, instanciée dans le main sous la référence myInstance. MyClass a une variable privée: nombre. si, à la place de
     //Insert Code Here

j'insère ce code:
     myInstance.nombre=5;

j'aurai une supere erreur de compilation. Pourquoi? Parceque nombre est private. Donc, la seule et unique place où je peux l'utiliser directement est DANS la classe MyClass qui possède cette variable.
C'est un peu comme tes chaussettes: tu les porte et toi seul y a accès (ou alors je ne veux pas savoir comment tu fais!). Mais, vas tu me dire, c'est complètement con, comment je fais pour l'utiliser? Et bien de deux choses l'une: ou nombre est une variable interne, dont tu n'as pas besoin à l'extérieur, auquel cas ça ne pose aucun problème. C'est le cas de la méthode privée doStuff: elle n'est appelée et n'est appelable que dans le code de MyClass. Typiquement on utilise des méthodes privées pour des traitements internes propres à la classe, valider une donnée reçue, par exemple, ou calculer l'âge du capitaine en fonction de la dentition de son chien...
Mais tu pourais aussi avoir besoin d'utiliser la variable nombre à l'extérieur.Et là, tu vas triompher en me disant "HAHAAAA! là, nombre doit être public!". Ce à quoi je répondrai non, petit scarabée, et ce en vertu du principe d'encapsulation (que je t'invite à chercher mais qui consiste, en gros, à dire à une classe "c'est TOI qui gère tes données, personne n'y touche sans ton autorisation"). Et suivant ce principe il vaux mieux qu'on ne puisse accéder aux variables d'un objet que via des accessers. Un accesser c'est une méthode qui a pour rôle de donner accès aux variables privées, et de garder le contrôle sur ces accès. Dans MyClass, l'accesser getNombre (on apelle ça un getter) me permet de garantir que nombre sera toujours inférieur à 100. Ce serait impossible si nombre était public.

static: une méthode ou une variable static n'est pas liée à un objet mais à la classe. Concrètement ça veux dire 2 choses:
1) la méthode mais surtout la variable est commune à toutes les instances de la classe. Ainsi, tu pourais avoir
class Myclass{
     private int compteur=0;
     public MyClass(){
          compteur++;
     }
     public static int getCompteur(){
          return compteur;
     }
}

Avec une telle classe, à chaque fois que tu ferait new MyClass(), tu incrémenterait compteur de 1, et ce pour chaque instance de cette classe. Et même si tu n'as jamais instancié MyClass, tu peux faire MyClass.getCompteur et recevoir 0(zéro) comme résultat: la méthode n'a aucun besoin d'un objet pour fonctionner. MAIS attention une méthode static ne peut PAS utiliser de variables et/ou de méthodes d'instance (non static).

Voila j'espère que ça t'aide un peu (si tu as eu le courage de lire la tartine).
et y a pas de bêtes questions, y a juste des questions qui attirent de bêtes réponses :p

edit: char nipeur je viens de vérifier:
public int main=2;
ça marche, main ,'est pas un mot réservé.... roh y a moyen de pourir son code avec ça...
0
merci infiniment !!!!!!!!!!!!!!!!!!! vous me sauvez la vie !
0
sendoshi, tu devrai être professeur, c'est dans le top des définitions que j'ai pu lire sur le net, et elle est mieux que la définition que ferai un professeur en programmation, 5 ans après tu sauves encore des gens :D merci
0
filem_ro3b Messages postés 9 Date d'inscription mercredi 2 avril 2008 Statut Membre Dernière intervention 4 avril 2008 9
3 avril 2008 à 15:50
Je commence a avoir une idée sur le truc ;)

Donc une variable ou une fonction peuvent etre « public/private » ou « static/non static »

Si une variable ou fonction qui appartient a une classe X sont « private » leur valeurs ne sont pas transmissibles qu’ aux autres fonctions de la meme classe X et non aux fonctions et variables des autres classes (aussi au classes) (sauf si on utilise la baguette magique des GETTERS que je comprends pas bien ).

Si une variable ou fonction appartenent a une classe X sont public leur valeurs sont transmissibles et accessibles aux autres fonctions de la meme classe X et aux autres classes aussi.

Meme si je trouve que rendre une variable ou fonction privé pas necessaire du tout car une variable ou fonction sont mieux à l’etat public mais je suis le conseil qui dit RULES ARE RULES.

Es ce que je viens de dire est clean .

J’admire mes questions de mules et je lance un soupir . merci pour votre effort les amis.
2
sendoshi Messages postés 22 Date d'inscription mercredi 2 avril 2008 Statut Membre Dernière intervention 16 décembre 2008 70
3 avril 2008 à 16:17
Donc une variable ou une fonction peuvent etre « public/private » ou « static/non static » 

« public/private » et « static/non static »
exemple: public static void main... l'un dit à quel niveau ça se trouve (static) l'autre dit qui y a acces (private/public)


Si une variable ou fonction qui appartient a une classe X sont « private » leur valeurs ne sont pas transmissibles qu’ aux autres fonctions de la meme classe X et non aux fonctions et variables des autres classes (aussi au classes) (sauf si on utilise la baguette magique des GETTERS que je comprends pas bien ). 


oui, c'est ça.
Pour les getters, imagine un frigo: c'est ta variable. Place le dans ta maison, c'est ta classe.
déclare le frigo en public et tout le monde y aura accès, on le rempli ou on le vide comme on veut. Je sais pas toi, mais moi ça m'arrangerait pas. Alors je vais l'enfermer chez toi, le voila private: toi seul y a accès. C'est mieux, mais pour le moment toi seul peut boire son contenu, tes potes savent même pas que t'as un frigo. Alors tu leur propose à boire, tu vas chercher dans le frigo et tu leur donne leur verre: tu es le getter. tu donne accès selon tes conditions et tu garde le contrôle.

Meme si je trouve que rendre une variable ou fonction privé pas necessaire du tout car une variable ou fonction sont mieux à l’etat public mais je suis le conseil qui dit RULES ARE RULES.


imagine un magasin, dans ce magasin il y a une caisse pour payer. la procédure c'est
acheter(){
prendre la marchandise()
payer()
rendre la monnaie()
emporter la marchandise()
}

si toutes tes méthodes et variables sont public, moi je viens et je fais
faire mon beurre(){
rendre la monnaie()
rendre la monnaie()
rendre la monnaie()
rendre la monnaie()
rendre la monnaie()
prendre la marchandise()
emporter la marchandise()
}

tu vois l'intérêt maintenant?
en déclarant tout en private sauf la méthode acheter() tu m'oblige à suivre tes regles, à savoir:
payer et ne pas piocher dans la caisse...
0
sendoshi Messages postés 22 Date d'inscription mercredi 2 avril 2008 Statut Membre Dernière intervention 16 décembre 2008 70
3 avril 2008 à 10:49
public: accessible de l'extérieur. En effet, c'est pratique d'avoir un main que la JVM puisse lancer, non?
static: méthode (ou variable, soyons pas racistes) de CLASSE, c'est à dire qui ne dépend pas de l'instanciation. En d'autres termes, si tu as ton main dans une classe Main (ou TagadaTsoinTsoin, c'est pareil) tu n'as pas besoin de faire new Main() (ou new TagadaTsoinTsoin) pour accéder à la méthode. Pour un main c'est pratique, vu que c'est là qu'on commence et qu'on n'a encore fait AUCUN new.
Corrolaire du static main: main ne peux pas accéder directement à des variables/méthodes d'instance (variables/méthodes non static) de la classe où il est déclaré: lors du lancement du main(), il n'y a aucune classe instanciée, pas même la sienne. (mais rien ne t'empeche de faire un new Main() ou un new TagadaTsoinTsoin dans ton main() pour accéder à ses variables/méthodes d'instance).
main: c'est le nom de la première méthode lancée lors de l'éxécution du programme. ET ce n'est pas un mot clé. dis que c'est un mot clé à ton prof d'info et il fera un infar, mais pas avant de t'avoir découpé en rondelles avec un CD démo de windows 95 et de t'avoir arraché les tripes pour en faire la corde pour te pendre. static et public sont des mots clés, pas main: main est une méthode comme une autre, elle a juste un rôle très précis (démarer le programme) et une déclaration aussi précise (public static void main (String[] arg)).

voilà j'espère que ça répond à ta question.
1
filem_ro3b Messages postés 9 Date d'inscription mercredi 2 avril 2008 Statut Membre Dernière intervention 4 avril 2008 9
4 avril 2008 à 12:55
merci sendoshi, ca m'a beaucoup aidé .
1

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Char Snipeur Messages postés 9696 Date d'inscription vendredi 23 avril 2004 Statut Contributeur Dernière intervention 3 octobre 2023 1 297
3 avril 2008 à 12:41
en fait, la JVM recherche dans ton code la fonction (ou méthode ) main et l'exécute. C'est pas un mot clé, mais c'est un nom réservé (non ?)
pour le private :
class A{private int j;public int f(){return j;}}
Dans ton prog, si tu as une variable c de type A (A c=new A;) c.j est interdit car privé, tandis c.f() est autorisé car public, et comme f est une fonction de A elle a le droit d'accéder à j.
Static défini un membre propre à la class, c'est à dire que tu "peux faire" A.j, si j est static et si tu as 'c' et 'd' deux variable de type 'A' alors c.j==d.j si j est static (toujours vu que j est propre à la class pas à l'objet).
Mais je rexplique des chose qui sont bien mieux dites dans des tas de cours sur le net, tu devrais commencer par là.
0