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
28.04.2001 - version 1.2 [Armel]
- Remise en forme du code html (DIR et PRE en blockquote et pre),
   Ajout des tags de s?aration de pages pour le site (Armel).
   Suppression des balises TIJ.
02.02.2001 - version 1.1 [Raczy]
- Tags + html nettoye
27.06.2000 - version 1.0 [Raczy]
- Derni?e modification : 27 juin 2000
Traducteur :
- Raczy
Texte original :
-Thinking in Java, 2nd edition, Revision 10
? 2000 by Bruce Eckel
t t t
2: Everythingis an Object t 2 : Tout est Objet
t t t
Although it is based on C++, Java is more of a “pure” object-oriented language. t Bien qu'il soit bas sur C++, Java est un langage orient objet plus ? pur ?.
t t t
Both C++ and Java are hybrid languages, but in Java the designers felt that the hybridization was not as important as it was in C++. A hybrid language allows multiple programming styles; the reason C++ is hybrid is to support backward compatibility with the C language. Because C++ is a superset of the C language, it includes many of that language’s undesirable features, which can make some aspects of C++ overly complicated. t C++ et Java sont tous les deux des langages hybrides, mais dans Java, les concepteurs ont pens que l'hybridation est moins importante qu'elle ne l'est en C++. Un langage hybride autorise plusieurs styles de programmation : C++ est hybride pour assurer la compatibilit avec le langage C. Comme C++ est une extension du langage C, il contient un grand nombre des particularit? ind?irables de ce langage, ce qui peut rendre certains aspects du C++ particuli?ement embrouill?.
t t t
The Java language assumes that you want to do only object-oriented programming. This means that before you can begin you must shift your mindset into an object-oriented world (unless it’s already there). The benefit of this initial effort is the ability to program in a language that is simpler to learn and to use than many other OOP languages. In this chapter we’ll see the basic components of a Java program and we’ll learn that everything in Java is an object, even a Java program. t Le langage Java suppose qu'on ne veut faire que de la programmation orient? objet (POO). Ceci signifie qu'avant de pouvoir commencer il faut tourner sa vision des choses vers un monde orient objets ( moins qu'elle ne le soit d??. L'avantage de cet effort pr?iminaire est la capacit programmer dans un langage qui est plus simple apprendre et utiliser que beaucoup d'autres langages de POO. Dans ce chapitre nous verrons les composantes de base d'un programme Java et nous apprendrons que tout dans Java est objet, m?e un programme Java.
t t t

You manipulate objects with references

t

Les objets sont manipul? avec des r??ences

t t t
Each programming language has its own means of manipulating data. Sometimes the programmer must be constantly aware of what type of manipulation is going on. Are you manipulating the object directly, or are you dealing with some kind of indirect representation (a pointer in C or C++) that must be treated with a special syntax? t Chaque langage de programmation a ses propres fa?ns de manipuler les donn?s. Parfois le programmeur doit ?re constamment conscient du type des manipulations en cours. Manipulez-vous l'objet directement, ou avez-vous affaire une sorte de repr?entation indirecte (un pointeur en C ou C++) qui doit ?re trait avec une syntaxe particuli?e ?
t t t
All this is simplified in Java. You treat everything as an object, so there is a single consistent syntax that you use everywhere. Although you treat everything as an object, the identifier you manipulate is actually a “reference” to an object[20]. You might imagine this scene as a television (the object) with your remote control (the reference). As long as you’re holding this reference, you have a connection to the television, but when someone says “change the channel” or “lower the volume,” what you’re manipulating is the reference, which in turn modifies the object. If you want to move around the room and still control the television, you take the remote/reference with you, not the television. t Tout ceci est simplifi en Java. On consid?e tout comme des objets, ainsi il n'y a qu'une seule syntaxe coh?ente qui est utilis? partout. Bien qu'on traite tout comme des objets, les identificateurs qui sont manipul? sont en r?lit des ? r??ences ? vers des objets [21]. On pourrait imaginer cette situation comme une t??ision (l'objet) avec une t??ommande (la r??ence). Tant qu'on conserve cette r??ence, on a une liaison vers la t??ision, mais quand quelqu'un dit ? change de cha?e ? ou ? baisse le volume ?, ce qu'on manipule est la r??ence, qui en retour modifie l'objet. Si on veut se d?lacer dans la pi?e tout en contr?ant la t??ision, on emporte la t??ommande/r??ence, pas la t??ision.
t t t
Also, the remote control can stand on its own, with no television. That is, just because you have a reference doesn’t mean there’s necessarily an object connected to it. So if you want to hold a word or sentence, you create a String reference: t De plus, la t??ommande peut exister par elle m?e sans t??ision. C'est dire que le fait d'avoir une r??ence ne signifie pas n?essairement qu'un objet y soit associ? Ainsi, si on veut avoir avoir un mot ou une phrase, on cr? une r??ence sur une String :
t t t
String s;
t
String s;
t t t
But here you’ve created only
the reference, not an object. If you decided to send a message to s at
this point, you’ll get an error (at run-time) because s isn’t
actually attached to anything (there’s no television). A safer practice,
then, is always to initialize a reference when you create it:

t Mais on a seulement cr? la r??ence, pas un objet. ? ce point, si on d?idait d'envoyer un message s, on aurait une erreur (lors de l'ex?ution) parce que s n'est pas rattach? quoi que ce soit (il n'y a pas de t??ision). Une pratique plus s?e est donc de toujours initialiser une r??ence quand on la cr? :
t t t
String s = "asdf";
t
String s = "asdf";
t t t
However, this uses a special Java
feature: strings can be initialized with quoted text. Normally, you must use a
more general type of initialization for
objects.
t Toutefois, ceci utilise une caract?istique sp?iale de Java : les cha?es de caract?es peuvent ?re initialis?s avec du texte entre guillemets. Normalement, on doit utiliser un type d'initialisation plus g??al pour les objets.
t t t


You must create all the objects


t

Vous devez cr?r tous les objets

t t t
When you create a reference, you want to
connect it with a new object. You do so, in general, with the new
keyword. new says, “Make me a new one of these objects.” So
in the above example, you can say:

t Quand on cr? une r??ence, on veut la connecter un nouvel objet. Ceci se fait, en g??al, avec le mot-clef new. new veut dire ? fabrique moi un de ces objets ?. Ainsi, dans l'exemple pr??ent, on peut dire :
t t t
String s = new String("asdf");
t
String s = new String("asdf");
t t t
Not only does this mean “Make me a
new String,” but it also gives information about how to make
the String by supplying an initial character string.
t Ceci ne veut pas seulement dire ? fabrique moi un nouvel objet String ?, mais cela donne aussi une information sur comment fabriquer l'objet String en fournissant une cha?e de caract?es initiale.
t t t
Of course, String is not the only
type that exists. Java comes with a plethora of ready-made types. What’s
more important is that you can create your own types. In fact, that’s the
fundamental activity in Java programming, and it’s what you’ll be
learning about in the rest of this
book.
t Bien s?, String n'est pas le seul type qui existe. Java propose une pl?hore de types tout pr?s. Le plus important est qu'on puisse cr?r ses propres types. En fait, c'est l'activit fondamentale en programmation Java et c'est ce qu'on apprendra faire dans la suite de ce livre.
t t t


Where storage lives


t

O r?ide la m?oire ?

t t t
It’s useful to visualize some
aspects of how things are laid out while the program is running, in particular
how memory is arranged. There are six different places to store
data:
t Il est utile de visualiser certains aspects de comment les choses sont arrang?s lorsque le programme tourne, en particulier comment la m?oire est organis?. Il y a six endroits diff?ents pour stocker les donn?s :
t t t

  1. Registers
    .
    This is the fastest storage because it exists in a place different from that of
    other storage: inside the processor. However, the number of registers is
    severely limited, so registers are allocated by the compiler according to its
    needs. You don’t have direct control, nor do you see any evidence in your
    programs that registers even
    exist.

  2. The
    stack
    . This lives in the general RAM (random-access memory) area, but has
    direct support from the processor via its stack pointer. The stack
    pointer is moved down to create new memory and moved up to release that memory.
    This is an extremely fast and efficient way to allocate storage, second only to
    registers. The Java compiler must know, while it is creating the program, the
    exact size and lifetime of all the data that is stored on the stack, because it
    must generate the code to move the stack pointer up and down. This constraint
    places limits on the flexibility of your programs, so while some Java storage
    exists on the stack—in particular, object references—Java objects
    themselves are not placed on the
    stack.

  3. The
    heap
    . This is a general-purpose pool of memory (also in the RAM area) where
    all Java objects live. The nice thing about the heap is that, unlike the stack,
    the compiler doesn’t need to know how much storage it needs to allocate
    from the heap or how long that storage must stay on the heap. Thus,
    there’s a great deal of flexibility in using storage on the heap. Whenever
    you need to create an object, you simply write the code to create it using
    new, and the storage is allocated on the heap when that code is
    executed. Of course there’s a price you pay for this flexibility: it takes
    more time to allocate heap storage than it does to allocate stack storage (that
    is, if you even could create objects on the stack in Java, as you can in
    C++).

  4. Static
    storage
    . “Static” is used here in the sense of “in a fixed
    location” (although it’s also in RAM). Static storage contains data
    that is available for the entire time a program is running. You can use the
    static keyword to specify that a particular element of an object is
    static, but Java objects themselves are never placed in static
    storage.

  5. Constant
    storage
    . Constant values are often placed directly in the program code,
    which is safe since they can never change. Sometimes constants are cordoned off
    by themselves so that they can be optionally placed in read-only memory
    (ROM).

  6. Non-RAM
    storage
    . If data lives completely outside a program it can exist while the
    program is not running, outside the control of the program. The two primary
    examples of this are streamed objects, in which objects are turned into
    streams of bytes, generally to be sent to another machine, and persistent
    objects,
    in which the objects are placed on disk so they will hold their
    state even when the program is terminated. The trick with these types of storage
    is turning the objects into something that can exist on the other medium, and
    yet can be resurrected into a regular RAM-based object when necessary. Java
    provides support for lightweight persistence, and future versions of Java
    might provide more complete solutions for
    persistence.
t
  1. Les registres. C'est le stockage le plus rapide car il se trouve un endroit diff?ent des autres zones de stockage : dans le processeur. Toutefois, le nombre de registres est s??ement limit? donc les registres sont allou? par le compilateur en fonction de ses besoins. On n'a aucun contr?e direct et il n'y a m?e aucune trace de l'existence des registres dans les programmes.
  2. La pile. Elle se trouve dans la RAM (random access memory) mais elle est prise en compte directement par le processeur via son pointeur de pile. Le pointeur de pile est d?lac vers le bas pour cr?r plus d'espace m?oire et d?lac vers le haut pour lib?er cet espace. C'est un moyen extr?ement efficace et rapide d'allouer de la m?oire, supplant seulement par les registres. Le compilateur Java doit conna?re, lorsqu'il cr? le programme, la taille et la dur? de vie exacte de toutes les donn?s qui sont rang?s sur la pile, parce qu'il doit g??er le code pour d?lacer le pointeur de pile vers le haut et vers le bas. Cette contrainte met des limites la flexibilit des programmes, donc, bien qu'il y ait du stockage Java sur la pile -- en particulier les r??ences aux objets -- les objets Java eux m?e ne sont pas plac? sur la pile.
  3. Le segment. C'est une r?erve de m?oire d'usage g??al (aussi en RAM) o r?ident tous les objets java. La bonne chose propos du segment est que, contrairement la pile, le compilateur n'a pas besoin de savoir de combien de place il a besoin d'allouer sur le segment ni combien de temps cette place doit rester sur le segment.Ainsi, il y a une grande flexibilit utiliser la m?oire sur le segment. Lorsqu'on a besoin de cr?r un objet, il suffit d'?rire le code pour le cr?r en utilisant new et la m?oire est allou? sur le segment lorsque le programme s'ex?ute. Bien entendu il y a un prix payer pour cette flexibilit?nbsp;: il faut plus de temps pour allouer de la m?oire sur le segment qu'il n'en faut pour allouer de la m?oire sur la pile (c'est dire si on avait la possibilit de cr?r des objets sur la pile en Java, comme on peut le faire en C++).
  4. La m?oire statique. ? Statique ? est utilis ici dans le sens ?  un endroit fixe ? (bien que ce soit aussi dans la RAM). La m?oire statique contient les donn?s qui sont disponibles pendant tout le temps d'ex?ution du programme. On peut utiliser le mot-clef static pour sp?ifier qu'un ??ent particulier d'un objet est statique, mais les objets Java par eux-m?es ne sont jamais plac? dans la m?oire statique.
  5. Les constantes. Les valeurs des constantes sont souvent plac?s directement dans le code du programme, ce qui est s? puisqu'elles ne peuvent jamais changer. Parfois les constantes sont isol?s de fa?n pouvoir ?re optionnellement plac?s dans une m?oire accessible en lecture seulement (ROM).
  6. Stockage hors RAM. Si les donn?s r?ident enti?ement hors du programme, elles peuvent exister m?e quand le programme ne tourne pas, en dehors du contr?e du programme. Les deux exemples de base sont les flots de donn?s, pour lesquels les donn?s sont transform?s en flots d'octets, g??alement pour ?re transmises vers une autre machine, et les objets persistants, pour lesquels les objets sont plac? sur disque de fa?n ce qu'ils conservent leur ?at m?e apr? que le programme soit termin? L'astuce avec ces types de stockage est de transformer les objets en quelque chose qui peut exister sur l'autre support, tout en pouvant ?re ressuscit en un objet normal en m?oire, lorsque c'est n?essaire. Java fournit des outils pour la persistance l??e, et les versions futures pourraient fournir des solutions plus compl?es pour la persistance.
t t t


Special case: primitive
types


t

Cas particulier : les types primitifs

t t t
There is a group of types that gets
special treatment; you can think of these as “primitive” types that
you use quite often in your programming. The reason for the special treatment is
that to create an object with new—especially a small, simple
variable—isn’t very efficient because new places objects on
the heap. For these types Java falls back on the approach taken by C and C++.
That is, instead of creating the variable using new, an
“automatic” variable is created that is not a reference. The
variable holds the value, and it’s placed on the stack so it’s much
more efficient.
t Il y a un ensemble de types qui sont soumis un traitement particulier ; ils peuvent ?re consid?? comme les types ? primitifs ? fr?uemment utilis? en programmation. La raison de ce traitement particulier est que la cr?tion d'un objet avec new -- en particulier une simple variable -- n'est pas tr? efficace parce que new place les objets sur le segment. Pour ces types, Java a recours l'approche retenue en C et en C++. Au lieu de cr?r la variable en utilisant new, une variable ? automatique ?, qui n'est pas une r??ence, est cr?e. La variable contient la valeur et elle est plac? sur la pile, ce qui est beaucoup plus efficace.
t t t
Java determines the size of each
primitive type. These sizes don’t change from one machine architecture to
another as they do in most languages. This size invariance is one reason Java
programs are so portable.

t Java fixe la taille de chacun des types primitifs. Ces tailles ne changent pas d'une architecture de machine une autre, comme c'est le cas dans la plupart des langages. L'invariance de la taille de ces types est l'une des raisons pour lesquelles Java est si portable.
t t t

  
    
    
    
    
    
  
  
    
    
    
    
    
  
  
    
    
    
    
    
  
  
    
    
    
    
    
  
  
    
    
    
    
    
  
  
    
    
    
    
    
  
  
    
    
    
    
    
  
  
    
    
    
    
    
  
  
    
    
    
    
    
  
  
    
    
    
    
    
  
Primitive type

      
Size

      
Minimum

      
Maximum

      
Wrapper type

      
boolean

      

      

      

      
Boolean

      
char

      
16-bit

      
Unicode 0

      
Unicode 216- 1

      
Character

      
byte

      
8-bit

      
-128

      
+127

      
Byte

      
short

      
16-bit

      
-215

      
+215—1

      
Short

      
int

      
32-bit

      
-231

      
+231—1

      
Integer

      
long

      
64-bit

      
-263

      
+263—1

      
Long

      
float

      
32-bit

      
IEEE754

      
IEEE754

      
Float

      
double

      
64-bit

      
IEEE754

      
IEEE754

      
Double

      
void

      

      

      

      
Void

      

t
Type primitif Taille Minimum Maximum Type wrapper
boolean - - - Boolean
char 16-bit Unicode 0 Unicode 216- 1 Character
byte 8-bit -128 +127 Byte
short 16-bit -215 +215-1 Short
int 32-bit -231 +231-1 Integer
long 64-bit -263 +263-1 Long
float 32-bit IEEE754 IEEE754 Float
double 64-bit IEEE754 IEEE754 Double
void - - - Void
t t t
All numeric types are signed, so
don’t go looking for unsigned types.
t Tous les types num?iques sont sign?, il est donc inutile d'aller chercher apr? des types non sign?.
t t t
The size of the boolean type is
not explicitly defined; it is only specified to be able to take the literal
values true or false.
t
t t t
The primitive data types also have
“wrapper” classes for them. That means that if you want to
make a nonprimitive object on the heap to represent that primitive type, you use
the associated wrapper. For example:

t Les types de donn?s primitifs sont aussi associ? des classes ? wrapper ?. Ceci signifie que pour faire un objet non primitif sur le segment pour repr?enter ce type primitif il faut utiliser le wrapper associ? Par exemple :
t t t
char c = 'x';
Character C = new Character(c);
t
char c = 'x';Character C =
  new Character(c);
t t t
Or you could also use: t On peut aussi utiliser :
t t t
Character C = new Character('x');
t
Character C = new
  Character('x');
t t t
The reasons for doing this will be shown
in a later chapter.
t Les raisons pour lesquelles on fait ceci seront indiqu?s dans un prochain chapitre.
t t t


High-precision numbers


t

Nombres de grande pr?ision

t t t
Java includes two classes for performing
high-precision arithmetic: BigInteger and BigDecimal. Although
these approximately fit into the same category as the “wrapper”
classes, neither one has a primitive analogue.
t Java contient deux classes pour effectuer des op?ations arithm?iques de grande pr?ision : BigInteger et BigDecimal. Bien que ceux-ci soient dans la m?e cat?orie que les classes ? wrapper ?, aucun d'eux n'a d'analogue primitif.
t t t
Both classes have methods that provide
analogues for the operations that you perform on primitive types. That is, you
can do anything with a BigInteger or BigDecimal that you can with
an int or float, it’s just that you must use method calls
instead of operators. Also, since there’s more involved, the operations
will be slower. You’re exchanging speed for accuracy.
t Chacune de ces classes a des m?hodes qui fournissent des op?ations analogues celles qu'on peut faire sur les types primitifs. C'est dire qu'avec un BigInteger ou un BigDecimal on peut faire tout ce qu'on peut faire avec un int ou un float, seulement il faut utiliser des appels de m?hodes au lieu des op?ateurs. Par ailleurs, comme elles en font plus, les op?ations sont plus lentes. On ?hange la vitesse contre la pr?ision.
t t t
BigInteger supports
arbitrary-precision integers. This means that you can accurately represent
integral values of any size without losing any information during
operations.
t BigInteger sert aux entiers de pr?ision arbitraire. C'est dire qu'ils permettent de repr?enter des valeurs enti?es de n'importe quelle taille sans perdre aucune information au cours des op?ations.
t t t
BigDecimal is for
arbitrary-precision fixed-point numbers; you can use these for accurate monetary
calculations, for example.
t BigDecimal sert aux nombres virgule fixe de pr?ision arbitraire ; par exemple, on peut les utiliser pour des calculs mon?aires pr?is.
t t t
Consult your online documentation for
details about the constructors and methods you can call for these two
classes.
t Il faut se reporter la documentation en ligne pour obtenir des d?ails sur les constructeurs et m?hodes utilisables avec ces deux classes.
t t t


Arrays in Java


t

Tableaux en Java

t t t
Virtually all programming languages
support arrays. Using arrays in C and C++ is perilous because those arrays are
only blocks of memory. If a program accesses the array outside of its memory
block or uses the memory before initialization (common programming errors) there
will be unpredictable results.
t Pratiquement tous les langages de programmation g?ent les tableaux. Utiliser des tableaux en C ou C++ est dangereux car ces tableaux ne sont que des blocs de m?oire. Si un programme acc?e un tableau en dehors de son bloc m?oire, ou s'il utilise la m?oire avant initialisation (erreurs de programmation fr?uentes) les r?ultats seront impr?isibles.
t t t
One of the primary goals of Java is
safety, so many of the problems that plague programmers in C and C++ are not
repeated in Java. A Java array is guaranteed to be initialized and cannot be
accessed outside of its range. The range checking comes at the price of having a
small amount of memory overhead on each array as well as verifying the index at
run-time, but the assumption is that the safety and increased productivity is
worth the expense.
t Un des principaux objectifs de Java est la s?urit? aussi, un grand nombre des probl?es dont souffrent C et C++ ne sont pas r??? en Java. On est assur qu'un tableau Java est initialis et qu'il ne peut pas ?re acc? en dehors de ses bornes. La v?ification des bornes se fait au prix d'un petit exc?ent de m?oire pour chaque tableau ainsi que de la v?ification de l'index lors de l'ex?ution, mais on suppose que le gain en s?urit et en productivit vaut la d?ense.
t t t
When you create an array of objects, you
are really creating an array of references, and each of those references is
automatically initialized to a special value with its own keyword:
null. When Java sees
null, it recognizes that the reference in question isn’t pointing
to an object. You must assign an object to each reference before you use
it, and if you try to use a reference that’s still null, the
problem will be reported at run-time. Thus, typical array errors are prevented
in Java.
t Quand on cr? un tableau d'objets, on cr? en r?lit un tableau de r??ences, et chacune de ces r??ences est automatiquement initialis? une valeur particuli?e avec son propre mot cl?nbsp;: null. Quand Java voit null, il reconna? que la r??ence en question ne pointe pas vers un objet. Il faut affecter un objet chaque r??ence avant de l'utiliser et si on essaye d'utiliser une r??ence encore null, le probl?e sera signal lors de l'ex?ution. Ainsi, les erreurs typiques sur les tableaux sont ?it?s en Java.
t t t
You can also create an array of
primitives. Again, the compiler guarantees initialization because it zeroes the
memory for that array.
t On peut aussi cr?r des tableaux de variables de type primitif. ? nouveau, le compilateur garantit l'initialisation car il met z?o la m?oire utilis? par ces tableaux.
t t t
Arrays will be covered in detail in later
chapters.
t Les tableaux seront trait? plus en d?ails dans d'autres chapitres.
t t t


You never need to destroy an object


t

Vous n'avez jamais besoin de d?ruire un objet

t t t
In most programming languages, the
concept of the lifetime of a variable occupies a significant portion of the
programming effort. How long does the variable last? If you are supposed to
destroy it, when should you? Confusion over variable lifetimes can lead to a lot
of bugs, and this section shows how Java greatly simplifies the issue by doing
all the cleanup work for
you.
t Dans la plupart des langages de programmation, le concept de dur? de vie d'une variable monopolise une part significative des efforts de programmation. Combien de temps une variable existe-t-elle ? S'il faut la d?ruire, quand faut-il le faire ? Des erreurs sur la dur? de vie des variables peuvent ?re la source de nombreux bugs et cette partie montre comment Java simplifie ?orm?ent ce probl?e en faisant le m?age tout seul.
t t t


Scoping


t

Notion de port?

t t t
Most procedural languages have the
concept of scope. This determines both the visibility and lifetime of the
names defined within that scope. In C, C++, and Java, scope is determined by the
placement of curly braces {}. So for example:

t La plupart des langages proc?uraux ont le concept de port?. Il fixe simultan?ent la visibilit et la dur? de vie des noms d?inis dans cette port?. En C, C++ et Java, la port? est fix? par l'emplacement des accolades {}. Ainsi, par exemple :
t t t
{
  int x = 12;
  /* only x available */
  {
    int q = 96;
    /* both x & q available */
  }
  /* only x available */
  /* q “out of scope” */
}
t
{
  int x = 12;
  /* seul x est accessible */
  {
    int q = 96;
    /* x & q sont tous les deux accessibles */
  }
  /* seul x est accessible */
  /* q est ? hors de port? ? */
}
t t t
A variable defined within a scope is available only to the end of that scope. t Une variable d?inie dans une port? n'est accessible que jusqu' la fin de cette port?.
t t t
Indentation makes Java code easier to read. Since Java is a free-form language, the extra spaces, tabs, and carriage returns do not affect the resulting program. t L'indentation rend le code Java plus facile lire. ?tant donn que Java est un langage ind?endant de la mise en page, les espaces, tabulations et retours chariots suppl?entaires ne changent pas le programme.
t t t
Note that you cannot do the following, even though it is legal in C and C++: t Il faut remarquer qu'on ne peut pas faire la chose suivante, bien que cela soit autoris en C et C++ :
t t t
{
  int x = 12;
  {
    int x = 96; /* illegal */
  }
}
t
{
  int x = 12;
  {
    int x = 96; /* illegal */
  }
}
t t t
The compiler will announce that the variable x has already been defined. Thus the C and C++ ability to “hide” a variable in a larger scope is not allowed because the Java designers thought that it led to confusing programs. t Le compilateur annoncera que la variable x a d? ? d?inie. Ainsi, la facult du C et du C++ ? cacher ? une variable d'une port? plus ?endue n'est pas autoris? parce que les concepteurs de Java ont pens que ceci m?e des programmes confus.
t t t

Scope of objects

t

Port? des objets

t t t
Java objects do not have the same lifetimes as primitives. When you create a Java object using new, it hangs around past the end of the scope. Thus if you use: t Les objets Java n'ont pas la m?e dur? de vie que les variables primitives. Quand on cr? un objet Java avec new, il existe toujours apr? la fin de la port?. Ainsi, si on fait :
t t t
{
  String s = new String("a string");
} /* end of scope */
t
{
  String s = new String("a string");
} /* fin de port? */
t t t
the reference s vanishes at the end of the scope. However, the String object that s was pointing to is still occupying memory. In this bit of code, there is no way to access the object because the only reference to it is out of scope. In later chapters you’ll see how the reference to the object can be passed around and duplicated during the course of a program. t la r??ence s dispara? la fin de la port?. Par contre l'objet String sur lequel s pointait occupe toujours la m?oire. Dans ce bout de code, il n'y a aucun moyen d'acc?er l'objet parce que son unique r??ence est hors de port?. Dans d'autres chapitres on verra comment la r??ence un objet peut ?re transmise et dupliqu? dans un programme.
t t t
It turns out that because objects created with new stay around for as long as you want them, a whole slew of C++ programming problems simply vanish in Java. The hardest problems seem to occur in C++ because you don’t get any help from the language in making sure that the objects are available when they’re needed. And more important, in C++ you must make sure that you destroy the objects when you’re done with them. t Il s'av?e que du simple fait qu'un objet cr? avec new reste disponible tant qu'on le veut, tout un tas de probl?es de programmation du C++ disparaissent tout simplement en Java. Il semble que les probl?es les plus durs surviennent en C++ parce que le langage ne fournit aucune aide pour s'assurer que les objets sont disponibles quand on en a besoin. Et, encore plus important, en C++ on doit s'assurer qu'on d?ruit bien les objets quand on en a termin avec eux.
t t t
That brings up an interesting question. If Java leaves the objects lying around, what keeps them from filling up memory and halting your program? This is exactly the kind of problem that would occur in C++. This is where a bit of magic happens. Java has a garbage collector, which looks at all the objects that were created with new and figures out which ones are not being referenced anymore. Then it releases the memory for those objects, so the memory can be used for new objects. This means that you never need to worry about reclaiming memory yourself. You simply create objects, and when you no longer need them they will go away by themselves. This eliminates a certain class of programming problem: the so-called “memory leak,” in which a programmer forgets to release memory. t Ceci am?e une question int?essante. Si Java laisse les objets tra?er, qu'est-ce qui les emp?he de compl?ement remplir la m?oire et d'arr?er le programme ? C'est exactement le probl?e qui surviendrait dans un programme C++. C'est l qu'un peu de magie appara?. Java a un ramasse-miettes qui surveille tous les objets qui ont ? cr?s avec new et qui arrive deviner lesquels ne sont plus r??enc?. Ensuite il lib?e la m?oire de ces objets de fa?n ce que cette m?oire puisse ?re utilis? pour de nouveaux objets. Ceci signifie qu'il ne faut jamais s'emb?er r?up?er la m?oire soi-m?e. On cr? simplement les objets, et quand on n'en a plus besoin, ils disparaissent d'eux m?e. Ceci ?imine toute une classe de probl?es de programmation : les soi-disant ? fuites de m?oire ? qui arrivent quand un programmeur oublie de lib?er la m?oire.
t t t

Creating new data types: class

t

Cr?r de nouveaux types de donn?s : class

t t t
If everything is an object, what determines how a particular class of object looks and behaves? Put another way, what establishes the type of an object? You might expect there to be a keyword called “type,” and that certainly would have made sense. Historically, however, most object-oriented languages have used the keyword class to mean “I’m about to tell you what a new type of object looks like.” The class keyword (which is so common that it will not be emboldened throughout this book) is followed by the name of the new type. For example: t Si tout est objet, qu'est-ce qui d?init quoi ressemble une classe particuli?e d'objets et comment elle se comporte ? Autrement dit, qu'est-ce qui constitue le type d'un objet ? On pourrait s'attendre avoir un mot-clef appel ? type ?, et cela serait parfaitement sens? Historiquement, toutefois, la plupart des langages orient? objet ont utilis le mot-clef class qui signifie ? je vais d?rire quoi ressemble un nouveau type d'objet ?. Le mot-clef class (qui est si commun qu'il ne sera plus mis en gras dans la suite de ce livre) est suivi par le nom du nouveau type. Par exemple :
t t t
class ATypeName { /* class body goes here */ }
t
class ATypeName { /* le corps de la classe vient ici */ }
t t t
This introduces a new type, so you can
now create an object of this type using new:

t Ceci introduit un nouveau type, on peut alors cr?r un objet de ce type en utilisant new :
t t t
ATypeName a = new ATypeName();
t
ATypeName a = new ATypeName();
t t t
In ATypeName, the class body
consists only of a comment (the stars and slashes and what is inside, which will
be discussed later in this chapter), so there is not too much that you can do
with it. In fact, you cannot tell it to do much of anything (that is, you cannot
send it any interesting messages) until you define some methods for
it.


t Dans ATypeName, le corps de la classe ne consiste qu'en un commentaire (les ?oiles et barres obliques et ce qu'il y a l'int?ieur, ce qui sera d?rit ult?ieurement dans ce chapitre), donc il n'y pas grand chose faire avec. En fait, on ne peut pas lui dire de faire quoi que ce soit (c'est dire qu'on ne peut pas lui transmettre de message int?essant) tant qu'on n'y d?init pas de m?hodes.
t t t
t t t
t t
    
///
t t t
t
     
Sommaire Le site de Bruce Eckel