Java en 5 leçons:

3e partie : Lutte des Classes et Discours sur les Méthodes

Leçon 1 et 2 Leçon 3 Leçon 4 Leçon 5

eric@netline.be

Java est basé sur une vision orientée objet du code de programmation considéré comme un ensemble d'objets. Ce sont les classes qui créent et spécifient les propriétés de ces objets.

Chaque classe est composée de deux parties : les propriétés qui définissent la classe et les fonctions qui permettent de manipuler ces propriétés. Les propriétés, plutôt baptisée champs dans le jargon Java, sont des variables auxquelles une classe peut accéder. Les outils permettant de manipuler les champs sont appelés méthodes.

Une méthode est l'équivalent d'une fonction en C ou C++. Elle se déclare exactement de la même manière : returnType name(parameters) { // body } sauf l'absence du point virgule en fin de déclaration.

Chaque méthode doit renvoyer une valeur à moins d'avoir été déclarée comme void. Exemple :

int surface ( int longueur, int largeur )
{
return longueur * largeur ;
}

En terme de syntaxe, une classe se compose d'une déclaration et d'un corps. Le nom d'une classe doit commencer par une lettre , un caractère "_" ou "$" et ne contenir que des caractères Unicode au-dessus de x00C0.

Une méthode, insérée dans sa classe, donne ceci :

Class Rectangle
{
int i;
int surface ( int longueur, int largeur )
{
return longueur * largeur ;
}
}

Les modifieurs de classe : Protected, private, public, friendly, final, abstract

Une méthode peut être précédée des modifieurs protected, private ou public.

Protected signifie que la méthode est uniquement disponible pour sa classe d'origine et ses classes dérivées. Public signifie que la méthode est disponible pour n'importe quelle classe. Les classes publiques sont accessibles par tous les objets, elles peuvent être utilisées et étendues par n'importe quel objet de n'importe quel package.

Private est utilisé lorsque seule la classe où la méthode a été déclarée peut utiliser celle-ci et même pas les sous-classes. C'est le degré de protection le plus fort applicable à une méthode, une méthode privée n'étant accessible que par les méthodes de la même classe.

friendly

Un autre modifieur est friendly. Une méthode friendly est accessible uniquement pour la classe courante et celles qui en sont dérivées. Par défaut, c'est le modifieur retenu pour les classes où d'autres modifieurs n'ont pas été utilisés.

private protected

Une version spéciale de la méthode private est appelée private protected. Elle désigne des méthodes accessibles pour une classe et ses sous-classes mais pas pour le reste des classes inscrites dans un package.

final

Les classes final ne peuvent avoir de sous_classes. En placant le mot clé final en tête de la déclaration d'une méthode, vous empêchez toute sous-classe de modifier une méthode donnée. Ex :

final void toggleStatus()

Abstracts

Les classes abstraites sont des classes dont les méthodes n'ont pas encore été complétées. C'est le travail des sous-classes de ces classes abstraites de finaliser les méthodes. La classe elle-même est considérée comme abstraite et ne peut être initialisée. Constructeurs, méthodes statiques et méthodes privées ne peuvent être abstraites.

Le mot clé abstract est utilisé comme suit :

abstract returnType methodName(parameters)

Overload method

Une méthode peut être "surchargée" en en déclarant plus d'une version avec des paramètres différents. Exemple :

int surface (int longueur, int largeur);

float surface (float longueur, float largeur);

Le compilateur détermine quelle méthode invoquer en fonction des paramètres passés à cette méthode.

Static

Le modifieur static indique qu'une variable ou une méthode est identique pour toutes les classes. Une variable déclarée comme statique sera la même pour toutes les instances d'une classe. Exemple :

static int version = 1;

Variables et méthodes statiques ont l'avantage de pouvoir être référencées sans qu'une instance spécifique de la classe ne soit créée. C'est par exemple le cas de la méthode System.Out.println où Out est une variable statique qui vous permet de faire appel à la méthode println sans avoir créé au préalable un objet de la classe System.

Création

La méthode de création en Java est une méthode qui porte le même nom que la classe qu'elle doit initialiser et qui n'a pas de valeur de retour.

Exemple :

class Point
{
protected int abscisse, ordonnée;
public Point ( int x , int y)
{
abscisse = x;
ordonnée = y;
}
}

Instanciation

Avant de pouvoir faire appel à une classe, il faut passer par l'opérateur new qui permet de créer une instance de celle-ci.

Exemple :

class Test
{
public static void main (String args[])
{
Point pt = new Point (5,6)
}
}

Finalisation

La méthode finalize permet à un objet de s'en aller proprement (fermeture de fichiers par exemple) avant que le "garbage collector" automatique ne retire l'objet de la mémoire.

void finalize()
{
...
}

Package

Un package est un groupe de classes réunis dans un seul fichier. Les membres d'une classe qui ne sont pas explicitement déclarés comme public, private ou protected ne peuvent être vus que par les classes du même package.

Le fichier à convertir en package doit simplement être préfixé de la sorte :

Pour utiliser une classe appartenant à un package, trois moyens sont disponibles :

monpackage.maclasse x = new monpackage.maclasse(1,2)

import monpackage.maclasse

class test {

maclasse x= new maclasse(1,2)

...

}

import monpackage.*

class test {

maclasse x= new maclasse(1,2)

...

}

Héritage

L'héritage de classe permet d'utiliser une classe existante pour en dériver une autre sans devoir repartir de zéro. A partir d'une classe d'objets comme voiture, il est possible de créer une classe particulière, la 4x4 qui hérite de toutes les propriétés d'une voiture et à laquelle on n'aura plus qu'à ajouter quelques spécifités. Le mot clé extends permet de signaler au compilateur qu'une classe héritera des propriétés d'une autre. Exemple :

class Quatrequatre extends voiture
{
...
}

native

Example: native void toggleStatus();

Les méthodes natives sont des méthodes écrites dans d'autres langages de programmation, comme le C++. Elles sont préfixées par le modifieur native en tête de la déclaration de méthode, le corps de la déclaration étant remplacé par un point virgule.

synchronized

En placant le mot clé synchronized en tête de la déclaration d'une méthode, vous pouvez empêcher la corruption de données pouvant survenir lorsque deux méthodes tentent d'accéder la même portion de données au même moment. Ce mot clé deviendra très important lorsque vous découperez votre application en threads. Ex:

synchronized void BoutonOnOff()

Exceptions

Les exceptions permettent de remédier à tous les problèmes pouvant apparaītre lors de l'exécution d'un programme. Toutes les portions de code susceptibles de générer des erreurs ou des problèmes (division par zéro etc) peuvent être encadrées par le bloc d'instructions try-catch comme suit

Si l'une des instructions contenues dans le bloc try émet une exception, elle est attrapée par l'instruction catch qui va s'occuper d'elle.

Voici une liste non exhaustive d'exceptions classiques

Exception Causé par
ArithmeticException Erreur mathématique comme une division par zero
ArrayIndexOutOfBoundsException Mauvais indice dans un tableau
ArrayStoreException Mauvais type de données stocké dans un tableau.
FileNotFoundException Accès à un fichier non existant.
IOException problème de lecture ou écriture sur un disque.
NullPointerException Référence un objet inexistant.
NumberFormatException Conversion incorrecte entre nombres et chaines de caractères
OutOfMemoryException Trop peu de mémoire pour l'allocation d'un objet
SecurityException Action non autorisée par la configuration du navigateur Web
StackOverflowException Stack overflow.
StringIndexOutOfBoundsException Accès à un caractère au-delà d'une chaīne de caractère

Réalisons une petite application graphique contenant un bouton "Inside Internet". Si l'on clique sur ce bouton, l'URL de votre magazine préféré est composé et affiché dans votre navigateur. Dans le bloc try, nous créons un objet URL à partir de la chaine http://www.best.be. Si cette création échoue, la classe URL génère une exception MalformedURLException et l'exécution du programme continue au niveau du bloc de programme catch


java1.gif (5652 bytes)

import java.awt.*;	// nécessaire pour les librairies graphiques
import java.applet.*;
import java.net.*;	// librairie réseau pour la classe URL

public class monurl extends Applet
{
    boolean badURL;

    public void init()
    {
        Button button = new Button("Inside Internet"); // création du bouton
        add(button);
        badURL = false;
    }
    public void paint(Graphics g)
    {
        if (badURL)
            g.drawString("Bad URL!", 60, 130);
    }

    public boolean action(Event evt, Object arg)
    {
    try
        {
            URL url = new URL("http://www.best.be");
            AppletContext context = getAppletContext();
            context.showDocument(url);
        }
        catch (MalformedURLException e)
        {
            badURL = true;
            repaint();
        }      
        return true;
    }
}

Code source http://www.netline.be/netline/formations/java/monurl.txt

Le bloc try and catch peut être complété par l'instruction throws comme dans l'exemple suivant où la fonction MyRead ne gère pas elle-même les erreurs d'accès disque mais renvoie l'exception à la méthode appelante. MyRead retourne cette exception parce que nous lui avons ajouté le throws IOException to its signature. N'oubliez pas bien sūr dans ce cas de faire gérer cette exception par la méthode de niveau supérieur.


protected void MyThrows()

{
    try
    {
        MyRead();
    }
    catch (IOException e)
    {
        String err = e.toString();
        System.out.println(err);
    }
}
protected void MyRead() throws IOException
{
    System.in.read(buffer, 0, 255);
}

Programmation par événements

En Java, les événements sont en fait des objets d'une classe Event qui définit tous les événements auxquels un programme est susceptible de répondre ainsi que les méthodes par défaut à appliquer pour traiter ou collecter des informations à propos de ces événements. Une action de l'utilisateur au clavier ou à la souris déclenche une série d'événements qui sont transmis à l'application pour traitement éventuel par le programmeur.

Constant Description
ACTION_EVENT utilisé avec la méthode action()
GOT_FOCUS Une fenêtre obtient le focus
KEY_ACTION identique à KEY_PRESS.
KEY_ACTION_RELEASE identique à KEY_RELEASE.
KEY_EVENT événement clavier
KEY_PRESS touche enfoncée
KEY_RELEASE touche relachée
LIST_DESELECT déselection d'un item d'une liste
LIST_EVENT événement pour une listbox
LIST_SELECT sélection d'un item d'une liste
LOAD_FILE au chargement d'un fichier
LOST_FOCUS une fenêtre perd le focus.
MISC_EVENT événement divers
MOUSE_DOWN bouton de souris pressé
MOUSE_DRAG déplacement drag and drop de souris
MOUSE_ENTER la souris pénètre dans une fenêtre
MOUSE_EVENT événement souris
MOUSE_EXIT la souris quitte la fenêtre.
MOUSE_MOVE souris déplacée.
MOUSE_UP bouton de souris relāché
SAVE_FILE à la sauvegarde d'un fichier
SCROLL_ABSOLUTE déplacement d'une scrollbar
SCROLL_EVENT événement scrollbar
SCROLL_LINE_DOWN bouton bas d'une scrollbar
SCROLL_LINE_UP bouton haut d'une scrollbar
SCROLL_PAGE_DOWN commande page down d'une scrollbar
SCROLL_PAGE_UP commande page up d'une scrollbar
WINDOW_DEICONIFY fenêtre replacée en position normale
WINDOW_DESTROY destruction d'une fenêtre
WINDOW_EVENT événement fenêtre
WINDOW_EXPOSE fenêtre plein écran
WINDOW_ICONIFY fenêtre mise en icône
WINDOW_MOVED fenêtre déplacée

Imaginons par exemple un programmeur désireux d'intercepter les déplacements de souris dans son application pour pouvoir concevoir un programme de dessin. Sa première étape sera de réagir lorsque la souris entre ou quitte la fenêtre de son applet. Plutôt que de les laisser traiter par le système, il va demander à traiter lui-même les événements mouseEnter et mouseExit. Il va créer une méthode du même nom que l'événement à traiter dans laquelle le premier argument est event de la classe Event qui contient des infos spécifiques à l'événement généré suivi d'un argument keycode dans le cas d'un événement clavier ou int x, int y dans le cas d'un événement souris.

Code source http://www.netline.be/netline/formations/java/masouris.txt


import java.awt.*;
import java.applet.*;
public class masouris extends Applet
{
    String msgStr;
    public void init()
    {
        msgStr = "";
        Font font = new Font("Arial", Font.BOLD, 36);
        setFont(font);
        resize(300, 200);
    }
    public void paint(Graphics g)
    {
        g.drawString(msgStr, 40, 120);
    }
    public boolean mouseEnter(Event evt, int x, int y)
    {
        msgStr = "Mouse in";
        repaint();
        return true;
    }
    public boolean mouseExit(Event evt, int x, int y)
    {
        msgStr = "Mouse out";
        repaint();
        return true;
    }
}