Public, private, static ... je me perds encore

Signaler
Messages postés
90
Date d'inscription
lundi 17 mars 2008
Statut
Membre
Dernière intervention
31 mars 2010
-
Messages postés
2333
Date d'inscription
samedi 28 février 2004
Statut
Membre
Dernière intervention
26 juillet 2013
-
salut,

depuis que j'etudie le java ( poo précisement ) je me perds encore avec les codes : static, public, private, la difference entre une class qui n'a rien et public  ... par ex quand je dois les mettre ? quand je ne dois pas ? à quoi ils servent ?  ....

niveau étude : 1ere année développement informatqiue, mais on peut dire que c'est une auto formation
langage qu'on doit acquir : java2, orienté objet jusqu'a la sérialisation ( on exclu le graphisme, awt, swing ... )

voila ce que j'ai dans la tete ( c'est tout melangé lol ) :

static : on le met dans une class, fonction, methode si on veut garder la valeur d'une variable la meme dans tout notre programme, jusqu'a lorsque on le reinitialise nous meme

public : chaque class de départ doit etre public, celle qui as le meme nom que notre fichier. on la met dans une methode/fonction si on veut l'utiliser dans n'importe quel moment dans notre code 

difference entre une class/methode qui n'a rien et public : euh aucune idée pour le moment

private : on le met dans une class/objet/methode/fonction afin de les protéger, pour qu'elles ne soient pas manipulé par des mechants :p j'ai raté quelque chose ?

voila un package que je suis entrée d'étudier, j'ai compris tout son code à part les acces/static, quand je dois les mettre ou non .... j'ai mis le code en rouge :

import java.io.*;
 
public class etude {
   
  public static void main(String[] args)throws IOException {
     
        ville v = new ville();
        ville v1 = new ville("casablanca",1500,"Maroc");      
        ville v2 = new ville("Paris",500,"France");
       
        System.out.println("Entrer une ville");    String ville1=ecrire();
        System.out.println("entrer un pays"); String pays1=ecrire();
        System.out.println("habitant");    String test=ecrire();
        int habitant1=Integer.valueOf(test).intValue();
       
        ville vtest=new ville(ville1,habitant1,pays1);
      
        System.out.println(v.décris_toi());
        System.out.println(v1.décris_toi());
        System.out.println(v2.décris_toi());
        System.out.println(v1.comparer(v2));
        System.out.println(vtest.décris_toi());
    }
   
    private ou pas ? on met quoi comme acces ? static String ecrire()throws IOException{
    BufferedReader f =new BufferedReader(new InputStreamReader(System.in));
    String phrase= f.readLine();
    return phrase;
    }
}

*********************************************************************

public ou private ? class ville {
    //nos variables pour les données de notre objet
    private String nom_ville = new String();
    private int nbre_habitant = 0;
    private String pays = new String();

    //constructeur de l'objet ville par défaut
    public ville() {
        nom_ville = "Inconnu";
        nbre_habitant = 0;
        pays = "Inconnu";
    }

    //constructeur de l'objet ville
    public ville(String nom, int nbre, String land) {
        nom_ville = nom;
        nbre_habitant = nbre;
        pays = land;
    }

    //Accesseur à la variable nom_ville en lecture
    public String nom_ville() {
        return nom_ville;
    }

    //Accesseur à la variable nbre_habitant en lecture
    public int nbre_habitant() {
        return nbre_habitant;
    }

    //Accesseur de la variable pays en lecture
    public String pays() {
        return pays;
    }

    //Accesseur de la variable nom_ville en écriture
    public void nom_ville(String str) {
        nom_ville = str;
    }

    //Accesseur de la variable nbre_habitant en écriture
    public void nbre_habitant(int i) {
        nbre_habitant = i;
    }

    //Accesseur de la variable pays en écriture
    public void pays(String str) {
        pays = str;
    }

    //Méthodes de classement de catégories
    public static normalement ici non ? quand je le mets y'a une erreur  String categorie() {
        String c =new String();
        if (this.nbre_habitant<1000)
            c="categorie A (1000)";
        else c="categorie B (autre)";
    return c;           
    }
   
    //Méthodes pour décrire l'ensemble de notre objet
    public String décris_toi() {
        return this.nom_ville+" est la ville de "+this.pays+", ses habitant est de "+this.nbre_habitant+" donc la categorie"+this.categorie();
    }
  
    //Méthodes de comparaison entre deux villes (comparaison sur le nombre d'habitants
    public String comparer(ville v9){
        String str = new String();
      
        if (v9.nbre_habitant > this.nbre_habitant)
            str = v9.nom_ville+" est une ville plus peuplée que "+this.nom_ville;
      
        else
            str = this.nom_ville+" est une ville plus peuplée que "+v9.nom_ville;
      
        return str;
    }
}

vous pouvez m'éclairir svp ? je vous serais reconnaissant à vie

un grand merci à vous

11 réponses

Messages postés
2333
Date d'inscription
samedi 28 février 2004
Statut
Membre
Dernière intervention
26 juillet 2013
37
Salut:

Il faut savoir qu'en plus des trois droits d'accés (private, public, protected) Java offre un quatrième droit d'accès dit droit d'accès de paquetage (C'est lorsque tu ne précèdes pas la déclaration (un attribut, classe, méthode, ...) d'un des trois mots clefs deja cités.

public class X {
    static void sayHello() {
       // ...
    }
}

Ceci implique que l'élément qu'on vient de déclarer est accessible partout tantqu'on fait partie du même paquetage.
Ce type d'accès limite la validité d'un élément dans un paquetage donné.
Messages postés
90
Date d'inscription
lundi 17 mars 2008
Statut
Membre
Dernière intervention
31 mars 2010

merci de se renseignement important, info acquise ^^

en attendant avec impatience les réponses des mes autres problémes

( tres fier qu'un weld blad soit aussi competent que ça )
Messages postés
2333
Date d'inscription
samedi 28 février 2004
Statut
Membre
Dernière intervention
26 juillet 2013
37
Salut:

import java.io.*;
 
public class etude {
   
  public static void main(String[] args)throws IOException {
     
        ville v = new ville();
        ville v1 = new ville("casablanca",1500,"Maroc");      
        ville v2 = new ville("Paris",500,"France");
       
        System.out.println("Entrer une ville");    String ville1=ecrire();
        System.out.println("entrer un pays"); String pays1=ecrire();
        System.out.println("habitant");    String test=ecrire();
        int habitant1=Integer.valueOf(test).intValue();
       
        ville vtest=new ville(ville1,habitant1,pays1);
      
        System.out.println(v.décris_toi());
        System.out.println(v1.décris_toi());
        System.out.println(v2.décris_toi());
        System.out.println(v1.comparer(v2));
        System.out.println(vtest.décris_toi());
    }
   
    // C'est une méthode utilitaire pour lire à partir du clavier
    // Le nom que tu as choisit n'est pas bien fait
    // Vaut mieux l'appelée lire(), read(), de toute manière c'est une méthode de lecture.
    // Tu pourras la mettre dans une classe à part, par exemple Clavier.java
    // public class Clavier {
    // public static String lire() throws IOException {
    //    // Code ici
    // }
    static String ecrire()throws IOException{
    BufferedReader f=new BufferedReader(new InputStreamReader(System.in));
    String phrase=f.readLine();
    return phrase;
    }
}

*********************************************************************

    // Si tu crées chaque classe dans un fichier à part alors tu dois appliquer
    // la régle qui dit que le fichier dois prendre le même nom de la classe
    // et cette classe doit être déclarée public.
    // Sinon, si la déclaration de cette classe se trouve avec d'autres classes
    // Une seule classe doit être publique à la fois et c'est elle qui marque le nom
    // tu fichier .java
    public class ville {
    //nos variables pour les données de notre objet
    private String nom_ville = new String();
    private int nbre_habitant = 0;
    private String pays = new String();

    //constructeur de l'objet ville par défaut
    public ville() {
        nom_ville = "Inconnu";
        nbre_habitant = 0;
        pays = "Inconnu";
    }

    //constructeur de l'objet ville
    public ville(String nom, int nbre, String land) {
        nom_ville = nom;
        nbre_habitant = nbre;
        pays = land;
    }

    //Accesseur à la variable nom_ville en lecture
    public String nom_ville() {
        return nom_ville;
    }

    //Accesseur à la variable nbre_habitant en lecture
    public int nbre_habitant() {
        return nbre_habitant;
    }

    //Accesseur de la variable pays en lecture
    public String pays() {
        return pays;
    }

    //Accesseur de la variable nom_ville en écriture
    public void nom_ville(String str) {
        nom_ville = str;
    }

    //Accesseur de la variable nbre_habitant en écriture
    public void nbre_habitant(int i) {
        nbre_habitant = i;
    }

    //Accesseur de la variable pays en écriture
    public void pays(String str) {
        pays = str;
    }

    //Méthodes de classement de catégories
    // Le modificateur static est utilisé pour dire qu'un tel membre (méthode ou attribut)
    // existe indépendement de l'existence d'une instance de la classe.
    // Avec les méthodes statiques tu ne peux pas utiliser le mot clef this.
    // Parceque ça conredit tout ce que nous avons dit:
    // "Cette méthode est indépendante de toute instance et this refère à l'objet courant"
    public String categorie() {
        String c=new String();
        if (this.nbre_habitant<1000)
            c="categorie A (1000)";
        else c="categorie B (autre)";
    return c;           
    }
   
    //Méthodes pour décrire l'ensemble de notre objet
    public String décris_toi() {
   
    return this.nom_ville+" est la ville de "+this.pays+", ses habitant
est de "+this.nbre_habitant+" donc la categorie"+this.categorie();
    }
  
    //Méthodes de comparaison entre deux villes (comparaison sur le nombre d'habitants
    public String comparer(ville v9){
        String str = new String();
      
        if (v9.nbre_habitant > this.nbre_habitant)
            str = v9.nom_ville+" est une ville plus peuplée que "+this.nom_ville;
      
        else
            str = this.nom_ville+" est une ville plus peuplée que "+v9.nom_ville;
      
        return str;
    }
}
Messages postés
2333
Date d'inscription
samedi 28 février 2004
Statut
Membre
Dernière intervention
26 juillet 2013
37
Salut:

J'espère avoir était clair.

Sinon, on attend tes questions.

Souvenez-vous qu'il
n'y a jamais de question bête, mais rester dans l'ignorance parce que
l'on ose pas poser une question, ça c'est une erreur !
Messages postés
90
Date d'inscription
lundi 17 mars 2008
Statut
Membre
Dernière intervention
31 mars 2010

salut,

merci encore une fois de ton aide ombitious, si je me suis amelioré un ptit peu au java c'est grace à toi :p

comme d'habitude j'ai d'autres questions ^^

1- j'ai créé un nouveau package, que j'ai appelé etude1 et qui contient qu'une seule class main :

/**************** etude1**********************/
import java.io.*;
class etude1 {
       public static void main(String[] argv)throws IOException {
        System.out.println("Entrer une ville");   
        String ville=clavier.lire(); }}

/*************** clavier ***********************/
import java.io.*;
class clavier {
    static String lire()throws IOException{
    BufferedReader f=new BufferedReader(new InputStreamReader(System.in));
    String phrase=f.readLine();
    return phrase;}}

si j'ai bien compris ta définition du mot static ça permet qu'on utilise une class directement sans créer un objet de cette class ? par ex ici j'ai utilisé :

String ville=clavier.lire();

si je n'utilise pas static je dois faire?

clavier objet=new clavier();
String ville=objet.lire();

j'ai toujours des soucis avec static ....

2-je developpe sous jcreator et j'ai créé un new package "etude1" comme je l'ai dit, et apres j'ai créé une class externe à ce package ( External Files )  qui contient la class et la methode clavier pour entrer un texte, mais le probleme est que ma class main de mon package utilise la methode clavier lorsque je lui fait un appel sans meme que la class clavier soit lié au package par :

package etude1;

comment est ce possible ? normalement mon package ne doit pas avoir acces à une class externe non ?

voila pour le moment, merci d'avance pour votre aide
 
Messages postés
2333
Date d'inscription
samedi 28 février 2004
Statut
Membre
Dernière intervention
26 juillet 2013
37
Salut:

Tu dois tout simplement importer cette classe.

Les packages sont des répertoires, donc pour importer/utiliser une classe donnée tu dois spécifier le chemin complet pour accéder à cette classe pour que le compilateur et la JVM puissent y accéder.

Quand la classe que tu veux importer est dans le même package (répertoire) que la classe qui l'utilises alors ce n'est pas la peine de l'importer.

Petite illustration, suppons qu'on a les packages suivantes:

         + com
         |
         |-------+ util
         |       |
         |       |-------- Clavier
         |         
         |-------+ etudes
                 |
                 |-------- Application

Dans la classe Application tu dois faire:

// Application.java

// Notre package (il faut mettre toute l'arborescence)
// Normalement, le chemin s'écrit sous la forme com/etudes
// On remplace le / par .
// ce qui donne com.etudes
// Généralement on préfére appeler les packages en commençant
// soit par com ou net ou org (qui sont des préfixses de URLs)
// Mais ce sont dans notre cas des suffixses

package com.etudes;

import com.util.Clavier;
// Pour importer toutes les classe du package com.util
// s'il existe bien sûr d'autres classes
// import com.util.*;

public class Application {
    // Utiliser la classe Clavier
    // Elle est belle et bien connu par le compilateur
}
Messages postés
2333
Date d'inscription
samedi 28 février 2004
Statut
Membre
Dernière intervention
26 juillet 2013
37
Salut:

Désolé, j'ai fait une plusieurs erreurs de frappes, j'ai mélangé suffixe et préfice, et je n'ai pas bien expliqué pourquoi on utilises com, net, org.

Tout d'abord, c'est choix, personne ne t'oblige à le faire. Mais cependant c'est une bonne manière de faire.

Suppons que tu travailles pour le compte d'une societé companyX et que cette dernière un site web: www.companyX.net.

Il est bien recomendé que tu appelles des packages en inversant cette URL, càd net.companyx (en minuscule et sans www).

J'espère avoir était bien clair.

Bonne nuit, je suis mort de fatigue.
Messages postés
90
Date d'inscription
lundi 17 mars 2008
Statut
Membre
Dernière intervention
31 mars 2010

des informations de plus, merci encore ombitious

sinon concernant la class clavier bah le probleme est que meme sans aucune importation sur ma class main ( projet ) il reconnait la methode clavier, alors que normalement il doit me generer une erreur lors de la compilation comme quoi fichier clavier et methode invalide ...

voila pour tester :

- un new projet etude, dans la class main :

import java.io.*;
class etude {
  public static void main(String[] fdf)throws IOException {
  System.out.println("Entrer un nom");   
        String ville1=A.lire();
        System.out.println(ville1); }}

- on cree une 2eme class tout à fait externe au projet, qui se trouve dans un dossier dans une autre partition par ex ...

import java.io.*;

class A{
    static String lire()throws IOException{
    BufferedReader f=new BufferedReader(new InputStreamReader(System.in));
    String phrase=f.readLine();
    return phrase;}}

tres bizarre ...
Messages postés
2333
Date d'inscription
samedi 28 février 2004
Statut
Membre
Dernière intervention
26 juillet 2013
37
Salut:

C'est vraimant étonnant.

Il se peut que quand tu as changé l'emplacement de ton fichier Clavier.java tu as laissé un fichier Clavier.class résultant de la précédante compilation.

En Java, un simple fichier .class suffira pour réussir la compilation.

Fais le nettoyage total (supprimes toutes les fichiers *.class) et relance la compilation.

Mets nous au courant.
Messages postés
90
Date d'inscription
lundi 17 mars 2008
Statut
Membre
Dernière intervention
31 mars 2010

salut

j'ai tout essayé, mais toujours ce probléme

vous pouvez tester sous jcreatorpro ( derniere version ) svp ?

la j'ai fait un autre test, j'ai créé 2 autres fichiers class ( main et clavier ) dans un autre emplacement mais toujours lorsque je fait appel à la methode il l'execute sans aucun soucis, c'es comme si java les considerait encore du package .... à noter aussi lors du compilation j'ai ça :

--------------------Configuration: projettest - JDK version 1.6.0_05 <Default> - <Default>--------------------
Messages postés
2333
Date d'inscription
samedi 28 février 2004
Statut
Membre
Dernière intervention
26 juillet 2013
37
Salut:

Le problème est vraimant incompréhensible.

Personnellement, je n'ai jamais utilisé l'IDE JCreator.

Je préfère travailler avec Eclipse et NetBeans.