t
t
t
t
t t 2) Tout est « objet »
tttt
2) Tout est « objet »
Texte original t Traducteur : Raczy
t
t
///
Ce chapitre contient 4 pages
1 2 3 4
\\\
t t t
t t t
t
t t t



Fields and methods


t

Champs et méthodes

t t t
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.)
t 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).
t t t
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:

t 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 :
t t t
class DataOnly {
  int i;
  float f;
  boolean b;
}
t
class DataOnly {
  int i;
  float f;
  boolean b;
}
t t t
This class doesn’t do anything, but you can create an object: t Cette classe ne fait rien mais on peut créer un objet :
t t t
DataOnly d = new DataOnly();
t
DataOnly d = new DataOnly();
t t t
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:

t 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 :
t t t
objectReference.member
t
objectReference.member
t t t
For example:

t Par exemple :
t t t
d.i = 47;
d.f = 1.1f;
d.b = false;
t
d.i = 47;
d.f = 1.1f;
d.b = false;
t t t
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: t 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 :
t t t
myPlane.leftTank.capacity = 100;
t
myPlane.leftTank.capacity = 100;
t t t
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.
t 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.
t t t


Default values for primitive members


t

Valeurs par défaut des membres primitifs

t t t
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:
t 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 :
t t t






































Primitive type

Default

boolean

false

char

‘\u0000’
(null)


byte

(byte)0

short

(short)0

int

0

long

0L

float

0.0f

double

0.0d

t
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
t t t
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.
t 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.
t t t
This guarantee doesn’t apply to
“local” variables—those that are not fields of a class. Thus,
if within a function definition you have:

t 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 :
t t t
int x;
t
int x;
t t t
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.)
t 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).
t t t


Methods, arguments, and return values


t

Méthodes, paramètres et valeurs de retour

t t t
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.”
t 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.
t t t
Methods in Java determine the messages an
object can receive. In this section you will learn how simple it is to define a
method.
t 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.
t t t
The fundamental parts of a method are the
name, the arguments, the return type, and the body. Here is the basic
form:

t 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 :
t t t
returnType methodName( /* argument list */ ) {
  /* Method body */
}
t
returnType methodName( /* liste de paramètres */ ) {
  /* corps de la méthode */
}
t t t
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. t 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.
t t t
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: t 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 :
t t t
int x = a.f();
t
int x = a.f();
t t t
The type of the return value must be
compatible with the type of x.
t Le type de la valeur de retour doit être compatible avec le type de x.
t t t
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.”
t 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 ».
t t t


The argument list


t

La liste de paramètres

t t t
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.
t 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.
t t t
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:

t 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 :
t t t
int storage(String s) {
  return s.length() * 2;
}
t
int storage(String s) {
  return s.length() * 2;
}
t t t
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. t 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.
t t t
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. t 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.
t t t
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: t 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 :
t t t
boolean flag() { return true; }
float naturalLogBase() { return 2.718f; }
void nothing() { return; }
void nothing2() {}
t
boolean flag() { return true; }
float naturalLogBase() { return 2.718f; }
void nothing() { return; }
void nothing2() {}
t t t
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. t 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.
t t t
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. t À 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.
t t t

Building a Java program

t

Construction d'un programme Java

t t t
There are several other issues you must understand before seeing your first Java program. t Il y a plusieurs autres éléments à comprendre avant de voir le premier programme Java.
t t t

Name visibility

t

Visibilité des noms

t t t
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. t 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.
t t t
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. t 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.
t t t
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. t 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.
t t t
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. t 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.
t t t

Using other components

t

Utilisation d'autres composantes

t t t
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. t 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.
t t t
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. t 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.
t t t
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.) t 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).
t t t
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: t 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 :
t t t
import java.util.ArrayList;
t
import java.util.ArrayList;
t t t
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:

t 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 :
t t t
import java.util.*;
t
import java.util.*;
t t t
It is more common to import a collection
of classes in this manner than to import classes
individually.
t Il est plus courant d'importer une collection de classes de cette manière que d'importer les classes individuellement.
t t t


The static keyword


t

Le mot-clef static

t t t
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.
t 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.
t t t
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).
t 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).
t t t
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.
t 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.
t t t
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:

t 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 :
t t t
class StaticTest {
    static int i = 47;
}
t
class StaticTest {
    static int i = 47;
}
t t t
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: t 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 :
t t t
StaticTest st1 = new StaticTest();
StaticTest st2 = new StaticTest();
t
StaticTest st1 = new StaticTest();
StaticTest st2 = new StaticTest();
t t t
At this point, both st1.i and st2.i have the same value of 47 since they refer to the same piece of memory. t à 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.
t t t
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.) t 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).
t t t
StaticTest.i++;
t
StaticTest.i++;
t t t
The ++ operator increments the
variable. At this point, both st1.i and st2.i will have the value
48.
t L'opérateur ++ incrémente la variable. À ce point, st1.i et st2.i auront tous deux la valeur 48.
t t t
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:

t 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 :
t t t
class StaticFun {
  static void incr() { StaticTest.i++; }
}
t
class StaticFun {
  static void incr() { StaticTest.i++; }
}
t t t
You can see that the StaticFun method incr( ) increments the static data i. You can call incr( ) in the typical way, through an object: t 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 :
t t t
StaticFun sf = new StaticFun();
sf.incr();
t
StaticFun sf = new StaticFun();
sf.incr();
t t t
Or, because incr( ) is a static method, you can call it directly through its class: t Ou, parce que incr( ) est une méthode statique, il est possible de l'appeler directement par sa classe :
t t t
StaticFun.incr();
t
StaticFun.incr();
t t t
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.
t 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.
t t t
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.
t 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.
t t t


Your first Java program


t

Votre premier programme Java

t t t
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:

t 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.
t t t
// 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());
  }
}
t
// 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());
  }
}
t t t
t t t
t t
\\\
///
t t t
t
     
Sommaire Le site de Bruce Eckel