 |
 |
2) Tout est « objet » |
|
 |
|
Texte original |
 |
Traducteur :
Raczy |
|
 |
///
|
Ce chapitre contient
4 pages
1
2
3
4
|
|
|
 |
 |
 |
 |
 |
 |
|
 |
|
 |
 |
 |
Fields and methods
|
 |
Champs et méthodes
|
 |
 |
 |
When you define a class (and all you do
in Java is define classes, make objects of those classes, and send messages to
those objects), you can put two types of elements in your class: data members
(sometimes called fields), and member functions (typically called
methods). A data member is an object of any type that you can communicate
with via its reference. It can also be one of the primitive types (which
isn’t a reference). If it is a reference to an object, you must initialize
that reference to connect it to an actual object (using new, as seen
earlier) in a special function called a constructor (described fully in
Chapter 4). If it is a primitive type you can initialize it directly at the
point of definition in the class. (As you’ll see later, references can
also be initialized at the point of definition.)
|
 |
Lorsqu'on définit une classe (et tout ce que l'on fait en Java consiste à
définir des classes, fabriquer des objets à partir de ces classes et envoyer des messages à ces
objets) on peut mettre deux types d'éléments dans ces classes : des données membres de la
classe (aussi appelées champs) et des fonctions membres de la classe (habituellement appelées
méthodes). Une donnée membre est un objet de n'importe quel type avec lequel on peut communiquer
via sa référence. Il peut aussi s'agir d'un des types primitifs (dans ce cas, ce n'est pas une
référence). S'il s'agit d'une référence à un objet, il faut initialiser cette référence pour la
connecter à un objet réel (en utilisant new comme indiqué précédemment) grâce à
une fonction particulière appelée un constructeur (entièrement décrit dans le chapitre 4).
S'il s'agit d'un type primitif il est possible de l'initialiser directement lors de sa définition
dans la classe (comme on le verra plus tard, les références peuvent aussi être initialisées lors de
la définition).
|
 |
 |
 |
Each object keeps its own storage for its
data members; the data members are not shared among objects. Here is an example
of a class with some data members:
|
 |
Chaque objet met ses données membres dans sa zone de mémoire propre, les
données membres ne sont pas partagées entre les objets. Voici un exemple de classe avec des données
membres :
|
 |
 |
 |
class DataOnly {
int i;
float f;
boolean b;
}
|
 |
class DataOnly { int i; float f; boolean b; }
|
 |
 |
 |
This class doesn’t do
anything, but you can create an object:
|
 |
Cette classe ne fait rien mais on peut créer un objet :
|
 |
 |
 |
DataOnly d = new DataOnly();
|
 |
DataOnly d = new DataOnly();
|
 |
 |
 |
You can assign values to the data
members, but you must first know how to refer to a member of an object. This is
accomplished by stating the name of the object reference, followed by a period
(dot), followed by the name of the member inside the object:
|
 |
On peut affecter des valeurs aux données membres mais il faut d'abord
savoir comment faire référence à un membre d'un objet. Ceci s'effectue en indiquant le nom de la
référence à l'objet, suivi par un point, suivi par le nom du membre dans l'objet :
|
 |
 |
 |
objectReference.member
|
 |
objectReference.member
|
 |
 |
 |
For example:
|
 |
Par exemple :
|
 |
 |
 |
d.i = 47;
d.f = 1.1f;
d.b = false;
|
 |
d.i = 47; d.f = 1.1f; d.b = false;
|
 |
 |
 |
It is also possible that your object
might contain other objects that contain data you’d like to modify. For
this, you just keep “connecting the dots.” For
example:
|
 |
Il est aussi possible que l'objet puisse contenir d'autres objets qui
contiennent des données que l'on souhaite modifier. Pour cela il suffit de continuer à
« associer les points ». Par exemple :
|
 |
 |
 |
myPlane.leftTank.capacity = 100;
|
 |
myPlane.leftTank.capacity = 100;
|
 |
 |
 |
The DataOnly class cannot do much
of anything except hold data, because it has no member functions (methods). To
understand how those work, you must first understand arguments and
return values, which will be described shortly.
|
 |
La classe DataOnly ne peut pas faire grand chose à part
contenir des données car elle n'a pas de fonctions membres (méthodes). Pour comprendre comment
celles-ci fonctionnent il faut d'abord comprendre les notions de paramètres et de
valeurs de retour, qui seront brièvement décrites.
|
 |
 |
 |
Default values for primitive members
|
 |
Valeurs par défaut des membres primitifs
|
 |
 |
 |
When a primitive data type is a member of
a class, it is guaranteed to get a default value if you do not initialize
it:
|
 |
Quand une donnée d'un type primitif est membre d'une classe on est assuré
qu'elle a une valeur par défaut si on ne l'initialise pas :
|
 |
 |
 |
Primitive type
|
Default
|
boolean
|
false
|
char
|
‘\u0000’
(null)
|
byte
|
(byte)0
|
short
|
(short)0
|
int
|
0
|
long
|
0L
|
float
|
0.0f
|
double
|
0.0d
|
|
 |
Type primitif |
Valeur par défaut |
boolean |
false |
char |
`\u0000' (null) |
byte |
(byte)0 |
short |
(short)0 |
int |
0 |
long |
0L |
float |
0.0f |
double |
0.0d |
|
 |
 |
 |
Note carefully that the default values
are what Java guarantees when the variable is used as a member of a
class. This ensures that member variables of primitive types will always be
initialized (something C++ doesn’t do), reducing a source of bugs.
However, this initial value may not be correct or even legal for the program you
are writing. It’s best to always explicitly initialize your
variables.
|
 |
Par prudence, il faut remarquer que les valeurs par défaut sont celles que
Java garantit quand la variable est utilisée comme un membre d'une classe. Ceci assure que
les variables membres de type primitif sont toujours initialisées (parfois C++ ne le fait pas), ce
qui supprime une source de bugs. Toutefois, cette valeur initiale peut ne pas être correcte ou même
légale pour le programme qui est écrit. Il est préférable de toujours initialiser explicitement les
variables.
|
 |
 |
 |
This guarantee doesn’t apply to
“local” variables—those that are not fields of a class. Thus,
if within a function definition you have:
|
 |
Cette garantie ne s'applique pas aux variables « locales » --
celles qui ne sont pas des champs d'une classe. Ainsi, si dans la définition d'une fonction, on
a :
|
 |
 |
 |
int x;
|
 |
int x;
|
 |
 |
 |
Then x will get some arbitrary
value (as in C and C++); it will not automatically be initialized to zero. You
are responsible for assigning an appropriate value before you use x. If
you forget, Java definitely improves on C++: you get a compile-time error
telling you the variable might not have been initialized. (Many C++ compilers
will warn you about uninitialized variables, but in Java these are
errors.)
|
 |
Alors x aura une valeur arbitraire (comme en C et C++), il
ne sera pas initialisé automatiquement à zéro. On a la responsabilité d'affecter une valeur
appropriée avant d'utiliser x. Si on oublie de le faire, Java est sans aucun doute
mieux conçu que C++ sur ce point : on obtient une erreur de compilation qui dit que la
variable pourrait ne pas être initialisée (avec beaucoup de compilateurs C++ on a des
avertissements concernant les variables non initialisées, mais avec Java ce sont des
erreurs).
|
 |
 |
 |
Methods, arguments, and return values
|
 |
Méthodes, paramètres et valeurs de retour
|
 |
 |
 |
Up until now, the term function
has been used to describe a named subroutine. The term that is more commonly
used in Java is method, as in “a way to do something.” If you
want, you can continue thinking in terms of functions. It’s really only a
syntactic difference, but from now on “method” will be used in this
book rather than “function.”
|
 |
Jusqu'à présent le terme fonction a été employé pour désigner une
sous-routine nommée. Le terme qui est plus généralement employé en Java est méthode, en
tant que « moyen de faire quelque chose ». Il est possible, si on le souhaite, de
continuer à raisonner en terme de fonctions. Il s'agit simplement d'une différence de syntaxe, mais
à partir de maintenant on utilisera « méthode » plutôt que fonction, dans ce
livre.
|
 |
 |
 |
Methods in Java determine the messages an
object can receive. In this section you will learn how simple it is to define a
method.
|
 |
Les méthodes en Java définissent les messages qu'un objet peut recevoir.
Dans cette partie on verra à quel point il est simple de définir une méthode.
|
 |
 |
 |
The fundamental parts of a method are the
name, the arguments, the return type, and the body. Here is the basic
form:
|
 |
Les éléments fondamentaux d'une méthode sont le nom, les paramètres, le
type de retour et le corps. Voici la forme de base :
|
 |
 |
 |
returnType methodName( /* argument list */ ) {
/* Method body */
}
|
 |
returnType methodName( /* liste de paramètres */ ) { /* corps de la méthode */ }
|
 |
 |
 |
The return type is the type of the value
that pops out of the method after you call it. The argument list gives the types
and names for the information you want to pass into the method. The method name
and argument list together uniquely identify the method.
|
 |
Le type de retour est le type de la valeur qui est retournée par la méthode
après son appel. La liste de paramètres donne le type et le nom des informations qu'on souhaite
passer à la méthode. L'association du nom de la méthode et de la liste de paramètres identifie de
façon unique la méthode.
|
 |
 |
 |
Methods in Java can be created only as
part of a class. A method can be called only for an
object,[21] and
that object must be able to perform that method call. If you try to call the
wrong method for an object, you’ll get an error message at compile-time.
You call a method for an object by naming the object followed by a period (dot),
followed by the name of the method and its argument list, like this:
objectName.methodName(arg1, arg2, arg3). For example, suppose you have a
method f( ) that takes no arguments and returns a value of type
int. Then, if you have an object called a for which
f( ) can be called, you can say this:
|
 |
En Java, les méthodes ne peuvent être créées que comme une composante d'une
classe. Une méthode ne peut être appelée que pour un objet [22] et
cet objet doit être capable de réaliser cet appel de méthode. Si on essaye d'appeler une mauvaise
méthode pour un objet, on obtient un message d'erreur lors de la compilation. On appelle une
méthode pour un objet en nommant l'objet suivi d'un point, suivi du nom de la méthode et de sa
liste d'arguments, comme ça : objectName.methodName(arg1, arg2, arg3). Par
exemple, si on suppose qu'on a une méthode f( ) qui ne prend aucun paramètre
et qui retourne une valeur de type int. Alors, si on a un objet appelé
a pour lequel f( ) peut être appelé, on peut
écrire :
|
 |
 |
 |
int x = a.f();
|
 |
int x = a.f();
|
 |
 |
 |
The type of the return value must be
compatible with the type of x.
|
 |
Le type de la valeur de retour doit être compatible avec le type de
x.
|
 |
 |
 |
This act of calling a method is commonly
referred to as sending a message to an object. In the above example, the
message is f( ) and the object is a. Object-oriented
programming is often summarized as simply “sending messages to
objects.”
|
 |
On appelle généralement envoyer un message à un objet cet acte
d'appeler une méthode. Dans l'exemple précédent le message est f() et l'objet est
a. La programmation orientée objet est souvent simplement ramenée à « envoyer
des messages à des objets ».
|
 |
 |
 |
The argument list
|
 |
La liste de paramètres
|
 |
 |
 |
The method argument list specifies what
information you pass into the method. As you might guess, this
information—like everything else in Java—takes the form of objects.
So, what you must specify in the argument list are the types of the objects to
pass in and the name to use for each one. As in any situation in Java where you
seem to be handing objects around, you are actually passing
references[22]. The
type of the reference must be correct, however. If the argument is supposed to
be a String, what you pass in must be a string.
|
 |
La liste de paramètres de la méthode spécifie quelles informations on passe
à la méthode. Comme on peut le supposer, ces informations -- comme tout le reste en Java -- sont
sous la forme d'objets. On doit donc indiquer dans la liste de paramètres les types des objets à
transmettre et les noms à employer pour chacun. Comme dans toutes les situation où on a
l'impression de manipuler des objets, en Java on passe effectivement des références name="fnB23">[23]. Toutefois, le type de la référence doit être correct. Si le paramètre est
censé être un objet de type String, ce qu'on transmet doit être de ce
type.
|
 |
 |
 |
Consider a method that takes a
String as its argument. Here is the definition, which must be placed
within a class definition for it to be compiled:
|
 |
Considérons une méthode qui prend un objet de classe
String en paramètre. Voici la définition qui doit être mise à l'intérieur de la
définition d'une classe pour qu'elle soit compilée :
|
 |
 |
 |
int storage(String s) {
return s.length() * 2;
}
|
 |
int storage(String s) { return s.length() * 2; }
|
 |
 |
 |
This method tells you how many bytes are
required to hold the information in a particular String. (Each char
in a String is 16 bits, or two bytes, long, to support Unicode
characters.) The argument is of type String and is called s. Once
s is passed into the method, you can treat it just like any other object.
(You can send messages to it.) Here, the length( ) method is called,
which is one of the methods for Strings; it returns the number of
characters in a string.
|
 |
Cette méthode indique combien d'octets sont nécessaires pour contenir une
String donnée (chaque char dans une String fait
16 bits, ou deux octets, pour permettre les caractères Unicode). Le paramètre est de type
String et il est appelé s. Une fois que s est passé à une
méthode, il peut être traité comme n'importe quel autre objet (on peut lui envoyer des messages).
Ici, on appelle la méthode length( ) qui est une des méthodes de la classe
String ; elle retourne le nombre de caractères que contient la
chaîne.
|
 |
 |
 |
You can also see the use of the
return keyword, which does two things. First, it means “leave the
method, I’m done.” Second, if the method produces a value, that
value is placed right after the return statement. In this case, the
return value is produced by evaluating the expression s.length( ) *
2.
|
 |
On peut aussi voir l'utilisation du mot-clef return qui
fait deux choses. D'abord, il signifie « quitte la méthode, j'ai terminé ». Ensuite, si
la méthode retourne une valeur, cette valeur est placée juste après la déclaration du
return. Dans le cas présent, la valeur de retour est produite en évaluant
l'expression s.length( ) * 2.
|
 |
 |
 |
You can return any type you want, but if
you don’t want to return anything at all, you do so by indicating that the
method returns void. Here are some examples:
|
 |
On peut retourner des valeurs de tous les types qu'on souhaite, mais si on
souhaite ne rien retourner du tout on peut le faire en indiquant que la méthode retourne
void. Voici quelques exemples :
|
 |
 |
 |
boolean flag() { return true; }
float naturalLogBase() { return 2.718f; }
void nothing() { return; }
void nothing2() {}
|
 |
boolean flag() { return true; } float naturalLogBase() { return 2.718f; } void nothing() { return; } void nothing2() {}
|
 |
 |
 |
When the return type is void, then
the return keyword is used only to exit the method, and is therefore
unnecessary when you reach the end of the method. You can return from a method
at any point, but if you’ve given a non-void return type then the
compiler will force you (with error messages) to return the appropriate type of
value regardless of where you return.
|
 |
Quand le type de retour est void, alors le mot-clef
return n'est utilisé que pour sortir de la méthode, il n'est donc pas nécessaire
quand on atteint la fin de la méthode. On peut retourner d'une méthode à n'importe quel endroit
mais si on a indiqué un type de retour qui n'est pas void alors le compilateur
imposera (avec des messages d'erreur) un retour avec une valeur d'un type approprié sans tenir
compte de l'endroit auquel le retour se produit.
|
 |
 |
 |
At this point, it can look like a program
is just a bunch of objects with methods that take other objects as arguments and
send messages to those other objects. That is indeed much of what goes on, but
in the following chapter you’ll learn how to do the detailed low-level
work by making decisions within a method. For this chapter, sending messages
will
suffice.
|
 |
À ce point, on peut penser qu'un programme n'est qu'un paquet d'objets avec
des méthodes qui prennent d'autres objets en paramètres pour transmettre des messages à ces autres
objets. C'est effectivement l'essentiel de ce qui se passe mais dans les chapitres suivants on
verra comment faire le travail de bas niveau en prenant des décisions au sein d'une méthode. Pour
ce chapitre, envoyer des messages est suffisant.
|
 |
 |
 |
Building a Java program
|
 |
Construction d'un programme Java
|
 |
 |
 |
There are several other issues you must
understand before seeing your first Java
program.
|
 |
Il y a plusieurs autres éléments à comprendre avant de voir le premier
programme Java.
|
 |
 |
 |
Name visibility
|
 |
Visibilité des noms
|
 |
 |
 |
A problem in any programming language is
the control of names. If you use a name in one module of the program, and
another programmer uses the same name in another module, how do you distinguish
one name from another and prevent the two names from “clashing?” In
C this is a particular problem because a program is often an unmanageable sea of
names. C++ classes (on which Java classes are based) nest functions within
classes so they cannot clash with function names nested within other classes.
However, C++ still allowed global data and global functions, so clashing was
still possible. To solve this problem, C++ introduced namespaces using
additional keywords.
|
 |
Un problème commun à tous les langages de programmation est le contrôle des
noms. Si on utilise un nom dans un module du programme et si un autre programmeur utilise le même
nom dans un autre module, comment distingue-t-on un nom d'un autre et comment empêche-t-on les
« collisions » de noms ? En C c'est un problème particulier car un programme est
souvent un océan de noms incontrôlable. Les classes C++ (sur lesquelles les classes Java sont
basées) imbriquent les fonctions dans les classes de telle sorte qu'elles ne peuvent pas entrer en
collision avec les noms de fonctions imbriqués dans d'autres classes. Toutefois, C++ autorise
toujours les données et les fonctions globales, donc les collisions sont toujours possibles. Pour
résoudre ce problème, C++ a introduit les domaines de noms (namespace) en utilisant des
mots-clefs supplémentaires.
|
 |
 |
 |
Java was able to avoid all of this by
taking a fresh approach. To produce an unambiguous name for a library, the
specifier used is not unlike an Internet domain name. In fact, the Java creators
want you to use your Internet domain name in reverse since those are guaranteed
to be unique. Since my domain name is BruceEckel.com, my utility library
of foibles would be named com.bruceeckel.utility.foibles. After your
reversed domain name, the dots are intended to represent
subdirectories.
|
 |
Java a pu éviter tout cela en employant une approche originale. Pour
générer sans ambiguïté un nom pour une bibliothèque, le spécificateur utilisé n'est pas très
différent d'un nom de domaine Internet. En fait, les créateurs de Java veulent qu'on utilise son
propre nom de domaine Internet inversé, puisqu'on est assuré que ceux-ci sont uniques. Puisque mon
nom de domaine est BruceEckel.com, ma bibliothèque d'utilitaires (utility) pour
mes marottes (foibles) devrait être appelée com.bruceeckel.utility.foibles. Après
avoir inversé le nom de domaine, les points sont destinés à représenter des
sous-répertoires.
|
 |
 |
 |
In Java 1.0 and Java 1.1 the domain
extensions com, edu, org, net, etc., were
capitalized by convention, so the
library would appear: COM.bruceeckel.utility.foibles. Partway through the
development of Java 2, however, it was discovered that this caused problems, and
so now the entire package name is lowercase.
|
 |
Dans Java 1.0 et Java 1.1 les extensions de domaines com, edu, org, net,
etc. étaient mises en lettres capitales par convention, ainsi la bibliothèque serait :
COM.bruceeckel.utility.foibles. Toutefois, au cours du développement de Java 2, on
s'est rendu compte que cela causait des problèmes et par conséquent les noms de packages sont
entièrement en lettres minuscules.
|
 |
 |
 |
This mechanism means that all of your
files automatically live in their own namespaces, and each class within a file
must have a unique identifier. So you do not need to learn special language
features to solve this problem—the language takes care of it for
you.
|
 |
Ce mécanisme signifie que tous les fichiers existent automatiquement dans
leur propre domaine de nom et toutes les classe contenues dans un fichier donné doivent avoir un
identificateur unique. Ainsi, on n'a pas besoin d'apprendre de particularités spécifiques au
langage pour résoudre ce problème -- le langage s'en occupe à votre place.
|
 |
 |
 |
Using other components
|
 |
Utilisation d'autres composantes
|
 |
 |
 |
Whenever you want to use a predefined
class in your program, the compiler must know how to locate it. Of course, the
class might already exist in the same source code file that it’s being
called from. In that case, you simply use the class—even if the class
doesn’t get defined until later in the file. Java eliminates the
“forward referencing” problem so you don’t need to think about
it.
|
 |
Lorsqu'on souhaite utiliser une classe prédéfinie dans un programme, le
compilateur doit savoir comment la localiser. Bien entendu, la classe pourrait déjà exister dans le
même fichier source que celui d'où elle est appelée. Dans ce cas on utilise simplement la classe --
même si la classe n'est définie que plus tard dans le fichier. Java élimine le problème des
« référence anticipées », il n'y a donc pas à s'en préoccuper.
|
 |
 |
 |
What about a class that exists in some
other file? You might think that the compiler should be smart enough to simply
go and find it, but there is a problem. Imagine that you want to use a class of
a particular name, but more than one definition for that class exists
(presumably these are different definitions). Or worse, imagine that
you’re writing a program, and as you’re building it you add a new
class to your library that conflicts with the name of an existing
class.
|
 |
Qu'en est-il des classes qui existent dans un autre fichier ? On
pourrait penser que le compilateur devrait être suffisamment intelligent pour aller simplement la
chercher lui même, mais il y a un problème. Imaginons que l'on veuille utiliser une classe ayant un
nom spécifique mais qu'il existe plus d'une classe ayant cette définition (il s'agit probablement
de définitions différentes). Ou pire, imaginons que l'on écrive un programme et qu'en le créant on
ajoute à sa bibliothèque une nouvelle classe qui entre en conflit avec le nom d'une classe déjà
existante.
|
 |
 |
 |
To solve this problem, you must eliminate
all potential ambiguities. This is accomplished by telling the Java compiler
exactly what classes you want using the import keyword. import
tells the compiler to bring in a package, which is a library of
classes. (In other languages, a library could consist of functions and data as
well as classes, but remember that all code in Java must be written inside a
class.)
|
 |
Pour résoudre ce problème il faut éliminer les ambiguïtés potentielles.
Ceci est réalisé en disant exactement au compilateur Java quelles classes on souhaite, en utilisant
le mot-clef import. import dit au compilateur d'introduire un
package qui est une bibliothèque de classes (dans d'autres langages, une bibliothèque
pourrait comporter des fonctions et des données au même titre que des classes mais il faut se
rappeler que tout le code Java doit être écrit dans des classes).
|
 |
 |
 |
Most of the time you’ll be using
components from the standard Java libraries that come with your compiler. With
these, you don’t need to worry about long, reversed domain names; you just
say, for example:
|
 |
La plupart du temps on utilise des composantes des bibliothèques Java
standard qui sont fournies avec le compilateur. Avec celles-ci il n'y a pas à se tracasser à propos
des longs noms de domaines inversés ; il suffit de dire, par exemple :
|
 |
 |
 |
import java.util.ArrayList;
|
 |
import java.util.ArrayList;
|
 |
 |
 |
to tell the compiler that you want to use
Java’s ArrayList class. However, util contains a number of
classes and you might want to use several of them without declaring them all
explicitly. This is easily accomplished by using ‘*’ to
indicate a wild card:
|
 |
pour dire au compilateur que l'on veut utiliser la classe Java
ArrayList. Toutefois, util contient de nombreuses classes et on
pourrait vouloir utiliser plusieurs d'entre elles sans les déclarer explicitement. Ceci est
facilement réalisé en utilisant '*' pour indiquer un joker :
|
 |
 |
 |
import java.util.*;
|
 |
import java.util.*;
|
 |
 |
 |
It is more common to import a collection
of classes in this manner than to import classes
individually.
|
 |
Il est plus courant d'importer une collection de classes de cette manière
que d'importer les classes individuellement.
|
 |
 |
 |
The static keyword
|
 |
Le mot-clef static
|
 |
 |
 |
Ordinarily, when you create a class you
are describing how objects of that class look and how they will behave. You
don’t actually get anything until you create an object of that class with
new, and at that point data storage is created and methods become
available.
|
 |
Normalement, quand on crée une classe, on décrit ce à quoi ressemblent les
objets de cette classe et comment ils se comportent. Rien n'existe réellement avant de créer un
objet de cette classe avec new ; à ce moment la zone de données est créée et
les méthodes deviennent disponibles.
|
 |
 |
 |
But there are two situations in which
this approach is not sufficient. One is if you want to have only one piece of
storage for a particular piece of data, regardless of how many objects are
created, or even if no objects are created. The other is if you need a method
that isn’t associated with any particular object of this class. That is,
you need a method that you can call even if no objects are created. You can
achieve both of these effects with the static keyword. When you say
something is static, it means that data or method is not tied to any
particular object instance of that class. So even if you’ve never created
an object of that class you can call a static method or access a piece of
static data. With ordinary, non-static data and methods you must
create an object and use that object to access the data or method, since
non-static data and methods must know the particular object they are
working with. Of course, since static methods don’t need any
objects to be created before they are used, they cannot directly access
non-static members or methods by simply calling those other members
without referring to a named object (since non-static members and methods
must be tied to a particular object).
|
 |
Mais il y a deux situation pour lesquelles cette approche n'est pas
suffisante. L'une, si on veut avoir une zone de stockage pour des données spécifiques, sans tenir
compte du nombre d'objets créés, ou même si aucun objet n'a été créé. L'autre, si on a besoin d'une
méthode qui n'est associée à aucun objet particulier de la classe. C'est à dire si on a besoin
d'une méthode qui puisse être appelée même si aucun objet n'a été créé. On peut obtenir ces deux
effets avec le mot-clef static. Dire que quelque chose est static
signifie que la donnée ou la méthode n'est pas spécifiquement rattachée à un objet instance de
cette classe. Donc, même si aucun objet de cette classe n'a jamais été créé il est possible
d'appeler une méthode static ou d'accéder à une donnée static.
Avec des données et des méthodes non static ordinaires il faut connaître l'objet
spécifique avec lequel elles fonctionnent. Bien entendu, étant donné que les méthodes
static n'ont pas besoin qu'un objet soit créé avant d'être utilisées, elles ne
peuvent pas accéder directement à des membres ou des méthodes non static
en appelant ces autres membres sans faire référence à un objet nommé (puisque les membres et
méthodes non static doivent être rattachés à un objet spécifique).
|
 |
 |
 |
Some object-oriented languages use the
terms class data and class methods, meaning that the data and
methods exist only for the class as a whole, and not for any particular objects
of the class. Sometimes the Java literature uses these terms
too.
|
 |
Certains langages orientés objet emploient les expressions données de
classe et méthodes de classe, ce qui signifie que les données et les méthodes
n'existent que pour la classe en tant que tout et pas pour des objets particuliers de la classe.
Parfois la littérature Java utilise aussi ces expressions.
|
 |
 |
 |
To make a data member or method
static, you simply place the keyword before the definition. For example,
the following produces a static data member and initializes
it:
|
 |
Pour rendre statique une méthode ou une donnée membre il suffit de mettre
le mot-clef static avant la définition. Par exemple, le code suivant crée une
donnée membre static et l'initialise :
|
 |
 |
 |
class StaticTest {
static int i = 47;
}
|
 |
class StaticTest { static int i = 47; }
|
 |
 |
 |
Now even if you make two
StaticTest objects, there will still be only one piece of storage for
StaticTest.i. Both objects will share the same i.
Consider:
|
 |
Maintenant, même en créant deux objet StaticTest, il n'y
aura qu'une seule zone de stockage pour StaticTest.i. Tous les objets partageront
le même i. Considérons :
|
 |
 |
 |
StaticTest st1 = new StaticTest();
StaticTest st2 = new StaticTest();
|
 |
StaticTest st1 = new StaticTest(); StaticTest st2 = new StaticTest();
|
 |
 |
 |
At this point, both st1.i and
st2.i have the same value of 47 since they refer to the same piece of
memory.
|
 |
à ce point, st1.i et st2.i ont la même valeur 47 puisqu'elles font
référence à la même zone mémoire.
|
 |
 |
 |
There are two ways to refer to a
static variable. As indicated above, you can name it via an object, by
saying, for example, st2.i. You can also refer to it directly through its
class name, something you cannot do with a non-static member. (This is the
preferred way to refer to a static variable since it emphasizes that
variable’s static nature.)
|
 |
Il y a deux façons de faire référence à une variable
static. Comme indiqué ci-dessus, il est possible de la nommer via un objet, en
disant par exemple st2.i. Il est aussi possible d'y faire référence directement par le nom de la
classe, ce qui ne peut pas être fait avec un membre non static (c'est le moyen de
prédilection pour faire référence à une variable static puisque cela met en
évidence la nature static de la variable).
|
 |
 |
 |
StaticTest.i++;
|
 |
StaticTest.i++;
|
 |
 |
 |
The ++ operator increments the
variable. At this point, both st1.i and st2.i will have the value
48.
|
 |
L'opérateur ++ incrémente la variable. À ce point, st1.i
et st2.i auront tous deux la valeur 48.
|
 |
 |
 |
Similar logic applies to static methods.
You can refer to a static method either through an object as you can with any
method, or with the special additional syntax ClassName.method( ).
You define a static method in a similar way:
|
 |
Une logique similaire s'applique aux méthodes statiques. On peut faire
référence à une méthode statique soit par l'intermédiaire d'un objet, comme on peut le faire avec
n'importe quelle méthode, ou avec la syntaxe spécifique supplémentaire
ClassName.method( ). Une méthode statique est définie de façon
similaire :
|
 |
 |
 |
class StaticFun {
static void incr() { StaticTest.i++; }
}
|
 |
class StaticFun { static void incr() { StaticTest.i++; } }
|
 |
 |
 |
You can see that the StaticFun
method incr( ) increments the static data i. You can
call incr( ) in the typical way, through an object:
|
 |
On peut voir que la méthode incr( ) de
StaticFun incrémente la donnée static i. On peut appeler
incr( ) de façon classique, par le biais d'un objet :
|
 |
 |
 |
StaticFun sf = new StaticFun();
sf.incr();
|
 |
StaticFun sf = new StaticFun(); sf.incr();
|
 |
 |
 |
Or, because incr( ) is a
static method, you can call it directly through its class:
|
 |
Ou, parce que incr( ) est une méthode statique, il
est possible de l'appeler directement par sa classe :
|
 |
 |
 |
StaticFun.incr();
|
 |
StaticFun.incr();
|
 |
 |
 |
While static, when applied to a
data member, definitely changes the way the data is created (one for each class
vs. the non-static one for each object), when applied to a method
it’s not so dramatic. An important use of static for methods is to
allow you to call that method without creating an object. This is essential, as
we will see, in defining the main( ) method that is the entry point
for running an application.
|
 |
Alors que static, lorsqu'il est appliqué à une donnée
membre, change sans aucun doute la façon dont la donnée est créée (une pour chaque classe par
opposition à une pour chaque objet dans le cas des données non statiques), lorsqu'il est appliqué à
une méthode, le changement est moins significatif. Un cas important d'utilisation des méthodes
static est de permettre d'appeler cette méthode sans créer d'objet. C'est
essentiel, comme nous le verrons, dans la définition de la méthode main( )
qui est le point d'entrée pour exécuter une application.
|
 |
 |
 |
Like any method, a static method
can create or use named objects of its type, so a static method is often
used as a “shepherd” for a flock of instances of its own
type.
|
 |
Comme pour toute méthode, une méthode statique peut créer ou utiliser des
objets nommés de son type, ainsi les méthodes statiques sont souvent utilisées comme
« berger » pour un troupeau d'instances de son propre type.
|
 |
 |
 |
Your first Java program
|
 |
Votre premier programme Java
|
 |
 |
 |
Finally, here’s the
program.[23] It
starts by printing a string, and then the date, using the Date class from
the Java standard library. Note that an additional style of comment is
introduced here: the ‘//’, which is a comment until the end
of the line:
|
 |
Voici enfin notre premier programme . Il commence par écrire une chaîne de
caractères, puis il écrit la date en utilisant la classe Date de la bibliothèque
standard de Java. Il faut remarquer qu'un style de commentaire supplémentaire est introduit
ici : le '//' qui est un commentaire jusqu'à la fin de la ligne.
|
 |
 |
 |
// HelloDate.java
import java.util.*;
public class HelloDate {
public static void main(String[] args) {
System.out.println("Hello, it's: ");
System.out.println(new Date());
}
}
|
 |
// HelloDate.java import java.util.*; public class HelloDate { public static void main(String[] args) { System.out.println("Hello, it's: "); System.out.println(new Date()); } }
|
 |
 |
 |
 |
 |
 |
 |
 |
|
 |
 |
 |