vendredi 24 octobre 2008

Informatique: Premiers pas en Java

J’ai décidé aujourd’hui de faire une présentation/introduction de la programmation. J’aborderai donc le Java et la programmation et je le ferai d’abord en présentant certaines notions de base.

Les variables

En Java, les variables sont « typées », c’est-à-dire qu’une variable doit être associée à un type défini de données. Il y a les types dits « primitifs ». Ce sont les plus simples et voici les principaux :

1. Une valeur booléenne (Vrai ou Faux) (boolean)

2. Un petit entier (byte) (de -128 à 127)

3. Un entier un peu plus grand (short) (de -32768 à 32767)

4. Un entier simple (int) (de -2147483648 à 2147483647)

5. Un entier long (long) (de -9223372036854775808 à 9223372036854775807)

6. Un nombre décimal (float) (de -1,4 x 10^-45 à 3,4 x 10^38)

7. Un nombre décimal plus précis (double) (de 4,9 x 10^-324 à 1,7 x 10^308)

8. Un caractère (char)

Lorsqu’il existe plusieurs types pour le même genre de données, il faut choisir en fonction de la précision désirée. Par exemple, dans le cas des nombres décimaux, « double » conserve les données de manière plus précise, mais il occupe 8 octets en mémoire comparativement à 4 octets pour « float ».

Il y a les types composés. Il s’agit dans l’ensemble d’assemblages de types primitifs. Par exemple, String, qui permet de stocker du texte simple, n’est rien de plus qu’un assemblage de caractères (« char »).

Les tableaux (« array »)

Les tableaux sont un regroupement ordonné de valeurs du même type. Bien que le concept ne soit pas propre au langage Java, la manière de l’utiliser dépend du langage employé. En Java, un tableau doit avoir une taille prédéfinie et celle-ci ne peut pas être modifiée par la suite. Pour la changer, il faut créer un nouveau tableau et y transférer les données de l'ancien. Pour régler ce problème, Java propose des types composés de données un peu plus complexes comme « ArrayList », mais plus aussi plus pratiques. Par contre, je ne m'y attarderai pas dans le cadre de cet article. Note: Le contenu d'un tableau est numéroté à partir de zéro.

Les classes

Une classe regroupe des fonctions qui ont un but commun. À titre d'exemple, définissons la classe « Echiquier ». En voici la structure:

Attributs (dans une classe, les variables sont appelées des attributs)
  • Tableau (array, capacité de 2) contenant les noms des joueurs

Méthodes (les fonctions sont appelées méthodes dans une classe)
  • DeplacerPiece ( int numeroPiece , int nouvellePosition)
  • Roquer ( int numeroPiece , int nouvellePosition )

Les méthodes
Les méthodes sont les fonctions d'une classe. Pour rendre une classe auto-exécutable, il faut qu'elle contienne une méthode "main". Java se chargera d'exécuter cette méthode de façon automatique. Une classe qui ne contient pas de méthode « main » ne peut pas être utilisée directement. En effet, elle doit plutôt être utilisée à partir d'une classe qui en contient une. Ce principe sera illustré plus clairement dans l'exemple qui accompagne cet article.

Les objets
En programmation, un objet est une instance d'une classe. En Java, on créé un objet en utilisant "new" comme dans l'exemple ci-dessous.

Echiquier jeuUn = new Echiquier ( "Seigneur101" , "Joueur deux" );

Même si deux objets ont été créés à partir de la même classe, ils sont manipulables et utilisables de manière totalement indépendante. Dans le cas ici, on pourrait donc créer plusieurs échiquiers et leur attribuer des joueurs différents.

Exemple modifié:
Echiquier jeuUn = new Echiquier ( "Seigneur101" , "Joueur deux" );
Echiquier jeuDeux = new Echiquier ( "Patou" , "Joueur quatre" );






Voici un petit programme Java qui utilise les notions présentées dans cet article


public class jeuEchecs
{

public static void main (String[] args)
{

// Les lignes de texte précédées de barres obliques // sont des commentaires.
// Elles sont ignorées par le compilateur Java.

// Affichage de texte simple
System.out.println ("Le jeu d'échecs est lancé !");

// Création d'un nouvel échiquier
// C'est ici qu'on fait appel à la classe "Echiquier".
// Comme celle-ci ne contient pas de méthode "main",
// elle doit être instanciée par une autre classe pour être utilisée

Echiquier jeuUn = new Echiquier ( "Seigneur101" , "Joueur deux" );


// Appel à la méthode afficheNomsJoueurs de la classe Echiquier
System.out.println( jeuUn.afficheNomsJoueurs() );


System.out.println ("C'est fini!");

}

}


class Echiquier
{
/*
* Ceci est une autre façon d'écrire des commentaires.
*/


/*
* Les attributs de la classe Echiquier
*/
private String[] nomJoueurs;




/*
* Une méthode qui n'a que l'attribut "public" et qui
* porte le même nom que la classe est un "constructeur".
* Cette méthode sert à instancier la classe Echiquier
* à partir d'une autre classe.
*
* x: public Echiquier ( ...
*
* Dans le cas ici, on passe comme arguments au constructeur
* les noms des deux joueurs. Toutefois, il est possible de
* faire un constructeur qui ne reçoit aucun argument.
*/
public Echiquier ( String nomUn , String nomDeux )
{
this.nomJoueurs = new String[2];
this.nomJoueurs[0] = nomUn;
this.nomJoueurs[1] = nomDeux;
}


// Méthode qui retourne le nom des joueurs
public String afficheNomsJoueurs ()
{
String ligneTexte = this.nomJoueurs[0] + " joue contre " + this.nomJoueurs[1];
return ligneTexte;
}



}

1 commentaire:

Seigneur a dit...

ah, Java...

chose vraiment fascinante qui n'a pas été clairement mentionnée: un fichier ".java" (code source, comme dans le long exemple) doit absolument contenir:

* exactement une classe publique;
* cette dernière doit absolument contenir une méthode publique main;

Par contre, en général (contrairement à l'exemple), les classes sont toutes indépendantes (c'est-à-dire qu'elles sont définies dans plusieurs fichiers .java). Dans ce cas-là, chaque classe qui sera utilisée dans la fonction principale main DOIT être publique. Par contre, ça fait principalement que les classes peuvent être utilisées par n'importe qu'elle classe "principale" (contenant une fonction main).

Par exemple: supposons qu'on se crée une classe qui permette de créer un échiquier (pour reprendre l'exemple), avec le nom des deux joueurs. On pourrait avoir ceci:

{
Programme:
. classe publique
.. méthode *publique* main;
.. autre(s) méthode(s) quelconque(s)
. classe échiquier non publique
.. méthodes
}

Ou encore:

{
Programme:
. classe publique
.. méthode publique main
.. autre(s) méthode(s)

Classe publique échiquier
. méthodes quelconques
}

Dans le premier cas, la classe "échiquier" fait partie du programme, tandis que dans le deuxième cas, la classe échiquier est indépendant du programme, mais le programme l'utilise.

Différence fondamentale:

La première situation aura un seul fichier texte, "MonProgramme.java". La deuxième situation aura DEUX fichiers texte, "MonProgramme.java" et "Echiquier.java", ce dernier pouvant être utilisé par d'autres programmes...

C'est un peu compliqué pour les gens qui n'ont jamais touché à ça je suppose, et je crois que Nicolas a fait beaucoup mieux que moi dans ce domaine ;)