Java Programming
Java Programming
[Link]
June 28, 2024
On the 28th of April 2012 the contents of the English as well as German Wikibooks and Wikipedia
projects were licensed under Creative Commons Attribution-ShareAlike 3.0 Unported license. A
URI to this license is given in the list of figures on page 325. If this document is a derived work
from the contents of one of these projects and the content was still licensed by the project under
this license at the time of derivation this document has to be licensed under the same, a similar or a
compatible license, as stated in section 4b of the license. The list of contributors is included in chapter
Contributors on page 313. The licenses GPL, LGPL and GFDL are included in chapter Licenses on
page 331, since this book and/or parts of it may or may not be licensed under one or more of these
licenses, and thus require inclusion of these licenses. The licenses of the figures are given in the list of
figures on page 325. This PDF was generated by the LATEX typesetting software. The LATEX source
code is included as an attachment ([Link]) in this PDF file. To extract the source from
the PDF file, you can use the pdfdetach tool including in the poppler suite, or the [Link]
[Link]/tools/pdftk-the-pdf-toolkit/ utility. Some PDF viewers may also let you save
the attachment to a file. After extracting it from the PDF file you have to rename it to source.7z.
To uncompress the resulting archive we recommend the use of [Link] The LATEX
source itself was generated by a program written by Dirk Hünniger, which is freely available under
an open source license from [Link]
Contents
1 Overview 3
2 Preface 5
2.1 Are you new to programming? . . . . . . . . . . . . . . . . . . . . . . . . . 5
2.2 Programming with Java™ . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5
2.3 What can Java not do? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6
4 History 11
4.1 Earlier programming languages . . . . . . . . . . . . . . . . . . . . . . . . . 11
4.2 The Green team . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12
4.3 Reshaping thought . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13
4.4 The demise of an idea, birth of another . . . . . . . . . . . . . . . . . . . . 14
4.5 Versions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15
4.6 References . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19
5 Java Overview 21
5.1 Object orientation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21
5.2 Platform dependence . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22
5.3 Standardization . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25
5.4 Secure execution . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26
5.5 Error handling . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27
5.6 Networking capabilities . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27
5.7 Dynamic class loading . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28
5.8 Automatic memory garbage collection . . . . . . . . . . . . . . . . . . . . . 28
5.9 Applet . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28
5.10 Forbidden bad practices . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29
5.11 Evaluation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29
7 Getting started 43
7.1 Understanding systems . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 43
7.2 The process of abstraction . . . . . . . . . . . . . . . . . . . . . . . . . . . . 44
III
Contents
8 Installation 51
9 Compilation 59
9.1 Quick compilation procedure . . . . . . . . . . . . . . . . . . . . . . . . . . 59
9.2 Automatic Compilation of Dependent Classes . . . . . . . . . . . . . . . . . 61
9.3 Packages, Subdirectories, and Resources . . . . . . . . . . . . . . . . . . . . 61
9.4 Filename Case . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 62
9.5 Compiler Options . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 62
9.6 The JIT compiler . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 63
10 Execution 65
10.1 JSE code execution . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 65
10.2 J2EE code execution . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 67
10.3 Jini . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 71
12 Java IDEs 87
12.1 What is a Java IDE? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 87
12.2 Eclipse . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 87
12.3 NetBeans . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 88
12.4 JCreator . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 88
12.5 Processing . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 88
12.6 BlueJ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 88
12.7 Kawa . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 89
12.8 JBuilder . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 89
12.9 DrJava . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 89
12.10Other IDEs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 89
13 Language Fundamentals 91
13.1 The Java programming syntax . . . . . . . . . . . . . . . . . . . . . . . . . 91
14 Statements 93
14.1 Variable declaration statement . . . . . . . . . . . . . . . . . . . . . . . . . 93
14.2 Assignment statements . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 94
14.3 Assertion . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 95
14.4 Program Control Flow . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 96
14.5 Statement Blocks . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 96
14.6 Branching Statements . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 96
14.7 Return statement . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 97
14.8 Iteration Statements . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 101
14.9 The continue and break statements . . . . . . . . . . . . . . . . . . . . . . . 103
14.10Throw statement . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 103
IV
Contents
14.11try/catch . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 104
18 Variables 129
18.1 Variables in Java programming . . . . . . . . . . . . . . . . . . . . . . . . . 129
18.2 Kinds of variables . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 129
18.3 Creating variables . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 131
18.4 Assigning values to variables . . . . . . . . . . . . . . . . . . . . . . . . . . 132
18.5 Grouping variable declarations and assignment operations . . . . . . . . . . 132
18.6 Identifiers . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 133
18.7 Naming conventions for identifiers . . . . . . . . . . . . . . . . . . . . . . . 134
18.8 Literals (values) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 135
21 Literals 151
21.1 Boolean Literals . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 151
21.2 Numeric Literals . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 151
21.3 String Literals . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 153
21.4 null . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 154
21.5 Mixed Mode Operations . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 154
22 Methods 157
22.1 Parameter passing . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 159
22.2 Variable argument list . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 161
22.3 Return parameter . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 162
22.4 Special method, the constructor . . . . . . . . . . . . . . . . . . . . . . . . . 163
22.5 Static methods . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 164
V
Contents
23 API/[Link] 167
23.1 Immutability . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 167
23.2 Concatenation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 168
23.3 Using StringBuilder/StringBuffer to concatenate strings . . . . . . . . . . . 169
23.4 Comparing Strings . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 170
23.5 Splitting a String . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 171
23.6 Substrings . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 172
23.7 String cases . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 173
23.8 See also . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 175
25 Keywords 185
25.1 abstract . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 186
25.2 assert . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 187
25.3 boolean . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 187
25.4 break . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 188
25.5 byte . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 188
25.6 case . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 189
25.7 catch . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 189
25.8 char . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 190
25.9 class . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 191
25.10const . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 191
25.11continue . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 192
25.12See also . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 192
25.13default . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 192
25.14do . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 193
25.15double . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 193
25.16else . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 194
25.17enum . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 194
25.18extends . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 195
25.19final . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 196
25.20For a variable . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 196
25.21For a class . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 197
25.22For a method . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 198
25.23Interest . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 198
25.24finally . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 198
25.25float . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 200
25.26for . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 201
25.27goto . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 201
25.28if . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 202
25.29implements . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 202
25.30import . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 203
25.31instanceof . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 203
VI
Contents
25.32int . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 205
25.33interface . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 206
25.34long . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 206
25.35native . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 207
25.36See also . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 207
25.37new . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 207
25.38package . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 208
25.39private . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 208
25.40protected . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 209
25.41public . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 209
25.42return . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 210
25.43short . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 210
25.44static . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 211
25.45Interest . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 212
25.46strictfp . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 212
25.47super . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 213
25.48switch . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 214
25.49synchronized . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 216
25.50Singleton example . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 217
25.51this . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 217
25.52throw . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 218
25.53See also . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 219
25.54throws . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 219
25.55transient . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 220
25.56try . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 220
25.57void . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 222
25.58volatile . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 222
25.59while . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 223
26 Packages 225
26.1 Package declaration . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 225
26.2 Import and class usage . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 225
26.3 Wildcard imports . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 226
26.4 Package convention . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 227
26.5 Importing packages from .jar files . . . . . . . . . . . . . . . . . . . . . . . . 227
26.6 Class loading/package . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 227
27 Arrays 229
27.1 Fundamentals . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 229
27.2 Two-Dimensional Arrays . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 231
27.3 Multidimensional Array . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 232
VII
Contents
31 Unicode 253
31.1 Unicode escape sequences . . . . . . . . . . . . . . . . . . . . . . . . . . . . 253
31.2 International language support . . . . . . . . . . . . . . . . . . . . . . . . . 254
31.3 References . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 254
32 Comments 255
32.1 Syntax . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 255
32.2 Comments and unicode . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 257
32.3 Javadoc comments . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 258
36 Inheritance 269
36.1 The Object class . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 269
36.2 The super keyword . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 270
37 Interfaces 273
37.1 Interest . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 273
37.2 Extending interfaces . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 275
40 Scope 293
40.1 Scope . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 293
VIII
Contents
42 Generics 303
42.1 Generic class . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 303
42.2 Generic method . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 305
42.3 Wildcard Types . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 306
42.4 Class<T> . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 309
42.5 Motivation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 310
42.6 Note for C++ programmers . . . . . . . . . . . . . . . . . . . . . . . . . . . 310
43 Contributors 313
44 Licenses 331
44.1 GNU GENERAL PUBLIC LICENSE . . . . . . . . . . . . . . . . . . . . . 331
44.2 GNU Free Documentation License . . . . . . . . . . . . . . . . . . . . . . . 332
44.3 GNU Lesser General Public License . . . . . . . . . . . . . . . . . . . . . . 333
1
1 Overview
3
2 Preface
The beautiful thing about learning is nobody can take it away from you.
Learning a computer programming language is like a toddler's first steps. You stumble, and
fall, but when you start walking, programming becomes second nature. And once you start
programming, you never cease evolving or picking up new tricks. Learn one programming
language, and you will ”know” them all — the logic of the world will begin to unravel around
you.
If you have chosen Java as your first programming language, be assured that Java is also
the first choice for computer science programs in many universities. Its simple and intuitive
syntax1 , or grammar, helps beginners feel at ease with complex programming constructs
quickly.
However, Java is not a basic programming language. In fact, NASA used Java as the driving
force (quite literally) behind its Mars Rover missions. Robots, air traffic control systems
and the self-checkout barcode scanners in your favorite supermarkets can all be programmed
in Java.
1 [Link]
5
Preface
daily life is somewhat humble in that respect. Software in Java, however, covers a vast area
of the computing ecosphere. Here are just a few examples of the ubiquitous nature of Java
applications in real-life:
• OpenOffice.org2 , a desktop office management suite that rivals the Microsoft Office suite
has been written in Java.
• The popular building game Minecraft3 is written in Java.
• Online browser-based games like Runescape4 , a 3D massively multi-player online role
playing game (MMORPG), run on graphics routines, 3D rendering and networking ca-
pabilities powered by the Java programming language.
• Two of the world's renowned digital video recorders, TiVo5 and BSkyB's Sky+6 use built-
in live television recording software to record, rewind and play your favorite television
shows. These applications make extensive use of the Java programming language.
The above mentioned applications illustrate the reach and ubiquity of Java applications.
Here's another fact: almost 80% of mobile phone vendors adopt Java as their primary
platform for the development of applications. The most widely used mobile-based operat-
ing system, Android7 , uses Java as one of its key application platforms — developers are
encouraged to develop applications for Android in the Java programming language.
2 [Link]
3 [Link]
4 [Link]
5 [Link]
6 [Link]
7 [Link]
6
3 About This Book
1 [Link]
2 [Link]
3 [Link]
4 [Link]
5 [Link]
6 [Link]
7 [Link]
7
About This Book
• You already know and have been introduced to programming in earlier versions of Java.
• You are an experienced developer and know how to program in other languages like
C++8 , Visual Basic9 , Python10 , Ruby11 , etc.
• You've heard that Java is great for web applications and web services programming.
Although this book is generally meant to be for readers who are beginning to learn program-
ming, it can be highly beneficial for intermediate and advanced programmers who may have
missed out on some vital information. After completing this book you should be able to
solve many complicated problems using the Java skills presented in the following chapters.
Once you finish, you are also encouraged to undertake ambitious programming projects of
your own.
This book assumes that the reader has no prior knowledge of programming in Java, or for
that matter, any object-oriented programming language. Practical examples and exercises
following each topic and module make it easy to understand the software development
methodology. If you are a complete beginner, we suggest that you move slowly through this
book and complete each exercise at your own pace.
3.3.1 As a reader
If you are interested in reading the content present in this book, we encourage you to:
8 [Link]
9 [Link]
10 [Link]
11 [Link]
8
How can you participate
• share comments about the technical accuracy, content, or organization of this book by
telling the contributors in the Discussion section for each page. You can find the link
Discussion on each page in this book leading you to appropriate sections for discussion.
Leave a signature when providing feedback, writing comments, or giving suggestion on
the Discussion pages. This can be achieved by appending -- ~~~~ to your messages.
Do not add your signatures to the Book pages, they are only meant for the Discussion
pages.
• share news about the Java Programming Wikibook with your family and friends and let
them know about this comprehensive Java guide online.
• become a contributing author, if you think that you have information that could fill in
some missing gaps in this book.
3.3.2 As a contributor
If you are intent on writing content for this book, you need to do the following:
• When writing content for this book, you can always pose as an anonymous contributor,
however we recommend you sign-in into the Wikibooks website when doing so. It becomes
easier to track and acknowledge changes to certain parts of the book. Furthermore, the
opinions and views of logged-in users are given precedence over anonymous users.
• Once you have started contributing content for this book, make sure that you add your
name to the contributor list12 .
• Be bold13 and try to follow the conventions14 for this Wikibook. It is important that the
conventions for this book be followed to the letter to make content consistent and reliable
throughout.
12 [Link]
13 [Link]
14 [Link]
9
4 History
On 23 May 1995, John Gage1 , the director of the Science Office of the Sun Microsystems2
along with Marc Andreesen3 , co-founder and executive vice president at Netscape4 an-
nounced to an audience of SunWorldTM that Java technology wasn't a myth and that it was
going to be incorporated into Netscape Navigator5 .6
At the time the total number of people working on Java was less than 30.8 This team
would shape the future in the next decade and no one had any idea as to what was in store.
From running an unmanned vehicle on Mars to serving as the operating environment of
most consumer electronics, e.g. cable set-top boxes, VCRs, toasters and PDAs10 ,11 Java
has come a long way from its inception. Let's see how it all began.
1 [Link]
2 [Link]
3 [Link]
4 [Link]
5 [Link]
6 Java Technology: The Early Years 7 . Sun Microsystems . Retrieved 9 May 2008
8 Java Technology: The Early Years 9 . Sun Microsystems . Retrieved 9 May 2008
10 [Link]
11 History of Java 12 . Lindsey, Clark S. . Retrieved 7 May 2008
13 [Link]
14 [Link]
15 [Link]
16 [Link]
11
History
syntax.17 Although people attempted to solve this problem, it would be later that a new de-
velopment philosophy was introduced, one named Object-Oriented Programming18 (OOP).
With OOP, one can write code that can be reused later without needing to rewrite the code
over and over again. In 1979, Bjarne Stroustrup19 developed C++, an enhancement to the
C language with included OOP fundamentals and features. Sun generated revenue from
Java through the selling of licenses for specialized products such as the Java Enterprise
System20 .
In December 1990, a project was initiated behind closed doors with the aim to create
a programming tool that could render obsolete the C and C++ programming languages.
Engineer Patrick Naughton21 had become extremely frustrated with the state of Sun's C++
and C APIs (Application Programming Interfaces22 ) and tools. While he was considering to
move towards NeXT23 , he was offered a chance to work on new technology and the Stealth
Project was started, a secret nobody but he knew.
17 Structural syntax is a linear way of writing code. A program is interpreted usually at the first line of the
program's code until it reaches the end. One cannot hook a later part of the program to an earlier one.
The flow follows a linear top-to-bottom approach.
18 [Link]
19 [Link]
20 [Link]
21 [Link]
22 [Link]
23 [Link]
12
Reshaping thought
This Stealth Project was later named the Green Project when James Gosling24 and Mike
Sheridan joined Patrick.25 As the Green Project teethed, the prospects of the project
started becoming clearer to the engineers working on it. No longer did it aim to create a
new language far superior to the present ones, but it aimed to target devices other than the
computer.
Staffed at 13 people, they began work in a small office on Sand Hill Road in Menlo Park27 ,
California. This team came to be called the Green Team henceforth in time. The project
they underwent was chartered by Sun Microsystems to anticipate and plan for the ”next
wave” in computing. For the team, this meant at least one significant trend, that of the
convergence of digitally controlled consumer devices and computers.28
24 [Link]
25 Java Technology: The Early Years 26 . Sun Microsystems . Retrieved 9 May 2008
27 [Link]
28 Java Technology: The Early Years 29 . Sun Microsystems . Retrieved 9 May 2008
30 [Link]
31 Java Technology: The Early Years 32 . Sun Microsystems . Retrieved 9 May 2008
13
History
35 [Link]
36 [Link]
14
Versions
• .. get rid of concepts requiring direct manipulation of hardware (in this case, memory) to
make the language safe,
• .. be platform independent and may be written for every platform once (giving birth to
the WORA37 idiom),
• .. be able to manipulate network programming out-of-the-box,
• .. be embeddable in web browsers, and ...
• .. have the ability for a single program to multi-task and do multiple things at the same
time.
The team now needed a proper identity and they decided on naming the new technology
they created Java ushering a new generation of products for the internet boom. A by-
product of the project was a cartoon named ”Duke38 ” created by Joe Parlang which became
its identity then.
Finally at the SunWorldTM conference, Andreesen unveiled the new technology to the
masses. Riding along with the explosion of interest and publicity in the Internet, Java
quickly received widespread recognition and expectations grew for it to become the dominant
software for browser and consumer applications.39
Initially Java was owned by Sun Microsystems, but later it was released to open source;
the term Java was a trademark of Sun Microsystems. Sun released the source code for its
HotSpot Virtual Machine and compiler in November 2006, and most of the source code of
the class library in May 2007. Some parts were missing because they were owned by third
parties, not by Sun Microsystems. The released parts were published under the terms of
the GNU General Public License41 , a free software license.
4.5 Versions
Unlike C and C++, Java's growth is pretty recent. Here, we'd quickly go through the
development paths that Java took with age.
Figure 16 Development of Java over the years. From version 1.0 to version 1.7, Java
has displayed a steady growth.
37 [Link]
38 [Link]
39 History of Java 40 . Lindsey, Clark S. . Retrieved 7 May 2008
41 [Link]
15
History
42 [Link]
43 [Link]
44 [Link]
45 [Link]
46 [Link]
16
Versions
17
History
• Monitoring and Management - The really big deal here is that you don't need to do
anything special to the startup to be able to attach on demand with any of the monitoring
and management tools in the Java SE platform.
• Compiler Access - Really aimed at people who create tools for Java development and for
frameworks like JavaServer Pages (JSP) or Personal Home Page construction kit (PHP)
engines that need to generate a bunch of classes on demand, the compiler API opens up
programmatic access to javac for in-process compilation of dynamically generated Java
code. The compiler API is not directly intended for the everyday developer, but for those
of you deafened by your screaming inner geek, roll up your sleeves and give it a try. And
the rest of us will happily benefit from the tools and the improved Java frameworks that
use this.
• Pluggable Annotations allows programmer to write annotation processor so that it can
analyse your code semantically before javac compiles. For example, you could write an
annotation processor that verifies whether your program obeys naming conventions.
• Desktop Deployment - At long last, Java SE 6 unifies the Java Plug-in technology and Java
WebStart engines, which just makes sense. Installation of the Java WebStart application
got a much needed makeover.
• Security - Java SE 6 has simplified the job of its security administrators by providing
various new ways to access platform-native security services, such as native Public Key
Infrastructure (PKI) and cryptographic services on Microsoft Windows for secure authen-
tication and communication, Java Generic Security Services (Java GSS) and Kerberos
services for authentication, and access to LDAP servers for authenticating users.
• The -lities: Quality, Compatibility, Stability - Bug fixes ...
50 [Link]
18
References
• New file I/O library to enhance platform independence and add support for metadata
and symbolic links. The new packages are [Link] and [Link]
• Library-level support for Elliptic curve cryptography algorithms
• An XRender pipeline for Java 2D, which improves handling of features specific to modern
GPUs
• New platform APIs for the graphics features originally planned for release in Java version
6u10
• Enhanced library-level support for new network protocols, including SCTP and Sockets
Direct Protocol
• Upstream updates to XML and Unicode
Lambda (Java's implementation of lambda functions), Jigsaw (Java's implementation of
modules), and part of Coin were dropped from Java 7.
4.6 References
19
5 Java Overview
The new features and upgrades included into Java changed the face of programming en-
vironment and gave a new definition to Object Oriented Programming1 (OOP in short).
But unlike its predecessors, Java needed to be bundled with standard functionality and be
independent of the host platform.
The primary goals in the creation of the Java language:
• It is simple.
• It is object-oriented.
• It is independent of the host platform.
• It contains language facilities and libraries for networking.
• It is designed to execute code from remote sources securely.
The Java language introduces some new features that didn't exist in other languages like
C and C++.
Object orientation (”OO”) refers to a method of programming and language technique. The
main idea of OO is to design software around the ”things” (i.e. objects) it manipulates,
rather than the actions it performs.
1 [Link]
21
Java Overview
As the hardware of the computer advanced, it brought about the need to create better
software techniques to be able to create ever increasing complex applications. The intent is
to make large software projects easier to manage, thus improving quality and reducing the
number of failed projects. Object oriented solution is the latest software technique.
Assembly languages
Software techniques started with the assembly languages, that were close to machine in-
struction and were easy to convert into executable code. Each hardware had its own
assembly language. Assembly language contains low level instructions like move data from
memory to hardware registers, do arithmetic operations, and move data back to memory.
Programmers had to know the detailed architecture of the computer in order to write
programs.
Procedural languages
After the assembly languages, high level languages were developed. Here the language
compiler is used to convert the high level program to machine instructions, freeing the pro-
grammers from the burden of knowing the computer hardware architecture. To promote
the re-use of code and to minimize the use of GOTO instructions, ”procedural” techniques
were introduced. This simplified the creation and maintenance of software control flow,
but left out the organization of data. It became a nightmare to debug and maintain pro-
grams having many global variables (i.e. variables that contain data that can be modified
anywhere in the application).
Object oriented languages
In OO languages, data is taken seriously with information hiding. Data that is specific to
an object can only be accessed by procedures in that object. As a result, objects contain
data as well as control flow and a program becomes a series of interactions between objects.
22
Platform dependence
In this situation, the machine code file and its execution are specific to the platform (Win-
dows, Linux, macOS, ...) it was compiled for, that is to say to the targeted platform:
... because the compiled file is a machine code file designed to work on a specific platform
and hardware. It would have produced different results/output for another platform. So
if you want your program to run on several platforms, you have to compile your program
several times:
It poses greater vulnerability risks. Note here that when a certain code is compiled into
an executable format, the executable cannot be changed dynamically. It would need to be
recompiled from the changed code for the changes to be reflected in the finished executable.
Modularity (dividing code into modules) is not present in Java's predecessors. If instead
of a single executable, the output application was in the form of modules, one could easily
23
Java Overview
change a single module and review changes in the application. In C/C++ on the other
hand, a slight change in code required the whole application to be recompiled.
The idea of Java is to compile the source code into an intermediate language that will be
interpreted.
The intermediate language is the byte code. The interpreter is the Java Virtual Machine
(JVM). The byte code file is universal and the JVM is platform specific:
So a JVM should be coded for each platform. And that's the case. So you just have to
generate a unique byte code file (a .class file).
The first implementations of the language used an interpreted virtual machine to achieve
portability, and many implementations still do. These implementations produce programs
that run more slowly than the fully-compiled programs created by the typical C++ compiler,
so the language suffered a reputation for producing slow programs. Since Java 1.2, Java
VM produces programs that run much faster, using multiple techniques.
The first of these is to simply compile directly into native code like a more traditional
compiler, skipping bytecode entirely. This achieves great performance, but at the expense
of portability. This is not really used any more.
Another technique, the just-in-time (JIT) compiler, compiles the Java bytecode into native
code at the time the program is run, and keep the compiled code to be used again and again.
More sophisticated VMs even use dynamic recompilation, in which the VM can analyze the
behavior of the running program and selectively recompile and optimize critical parts of
the program. Both of these techniques allow the program to take advantage of the speed of
native code without losing portability.
24
Standardization
Portability is a technically difficult goal to achieve, and Java's success at that goal is a
matter of some controversy. Although it is indeed possible to write programs for the Java
platform that behave consistently across many host platforms, the large number of available
platforms with small errors or inconsistencies led some to parody Sun's ”Write once, run
anywhere” slogan as ”Write once, debug everywhere”.
5.3 Standardization
C++ was built atop the C language and as a result divergent ways of doing the same thing
manifested around the language. For instance, creating an object could be done in three
different ways in C++. Furthermore, C++ did not come with a standard library bundled
with its compilers. Instead, it relied on resources created by other programmers; code which
rarely fit together.
In Java, standardized libraries are provided to allow access to features of the host machines
(such as graphics and networking) in unified ways. The Java language also includes support
for multi-threaded programs—a necessity for many networking applications.
Platform independent Java is, however, very successful with server side applications, such
as web services, servlets, or Enterprise JavaBeans.
25
Java Overview
Java also made progress on the client side: first it had Abstract Window Toolkit2 (AWT),
then Swing3 , and the most recent client side library is the Standard Widget Toolkit4 (SWT).
It is interesting to see how they tried to handle the two opposing consuming forces. Those
are :
Efficient, fast code; port to most popular hardware (write once, test anywhere)
Use the underlying native subroutine to create a GUI component. This approach was
taken by AWT, and SWT.
Portability to any hardware where JVM ported (write once, run anywhere)
To achieve this to the latter, the Java toolkit should not rely on the underlying native user
interface. Swing took this approach.
It is interesting to see how the approach was switched back and forth. AWT → Swing →
SWT.
With the high-level of control built into the language to manipulate hardware, a C/C++
programmer could access almost any resource, either hardware or software on the system.
This was intended to be one of the languages' strong points, but this very flexibility led to
confusion and complex programming practices.
2 [Link]
3 [Link]
4 [Link]
26
Error handling
5 [Link]
6 [Link]
7 [Link]
27
Java Overview
5.9 Applet
The Java creators created the concept of the applet. A Java program can be run in a client
browser program. Java was released in 1995; the time when the Internet was becoming
28
Forbidden bad practices
more available and familiar to the general public. The promise of Java was in the client
browser-side in that code would be downloaded and executed as a Java applet in the client
browser program.
See also Java Programming/Applets8 .
5.11 Evaluation
In most people's opinions, Java technology delivers reasonably well on all these goals. The
language is not, however, without drawbacks. Java tends to be more high-level than sim-
ilar languages (such as C++), which means that the Java language lacks features such as
hardware-specific data types, low-level pointers to arbitrary memory addresses, or program-
ming methods like operator overloading. Although these features are frequently abused or
misused by programmers, they are also powerful tools. However, Java technology includes
Java Native Interface9 (JNI), a way to call native code from Java language code. With JNI,
it is still possible to use some of these features.
Some programmers also complain about Java's lack of multiple inheritance, a powerful fea-
ture of several other object-oriented languages, such as C++. The Java language separates
inheritance of type and implementation, allowing inheritance of multiple type definitions
through interfaces, but only single inheritance of type implementation via class hierarchies.
This allows most of the benefits of multiple inheritance while avoiding many of its dangers.
In addition, through the use of concrete classes, abstract classes, as well as interfaces, a
Java language programmer has the option of choosing full, partial, or zero implementation
for the object type they define, thus ensuring maximum flexibility in application design.
There are some who believe that for certain projects, object orientation makes work harder
instead of easier. This particular complaint is not unique to the Java language but applies
to other object-oriented languages as well.
8 [Link]
9 [Link]
29
6 The Java Platform
The Java platform is the name given to the computing platform from Oracle that helps
users to run and develop Java applications. The platform does not just enable a user to
run and develop a Java application, but also features a wide variety of tools that can help
developers work efficiently with the Java programming language.
The platform consists of two essential pieces of software:
• the Java Runtime Environment (JRE), which is needed to run Java applications
and applets; and,
• the Java Development Kit (JDK), which is needed to develop those Java applications
and applets. If you have installed the JDK, you should know that it comes equipped with
a JRE as well. So, for all the purposes of this book, you would only require the JDK.
In this section, we will explore in further detail what these two software components of the
Java platform do.
31
The Java Platform
Figure 43
Console:
Execution
$ java SomeApplication
1 [Link]
32
Java Runtime Environment (JRE)
If you want to execute a Java byte-code with a .jar extension (say, [Link]
), you would need to use the following command in Command Prompt (on Windows) or
Terminal (on Linux or Mac OS):
Console:
Execution with a jar
$ java -jar [Link]
Note:
Not all Java class files or Java archives are executable. Therefore, the java tool would
only be able to execute files that are executable. Non-executable class files and Java
archives are simply called class libraries.
Console:
Java version
$ java -version
33
The Java Platform
Figure 44
Just-in-Time Compilation
Since version 1.2, the JRE features a more robust JVM. Instead of interpreting byte-code, it
down-right converts the code straight into equivalent native code for the local system. This
process of conversion is called just-in-time compilation2 or JIT-compilation. This process
only occurs when the byte-code is executed for the first time. Unless the byte-code itself is
changed, the JVM uses the compiled version of the byte-code on every successive execution.
Doing so saves a lot of time and processor effort, allowing applications to execute much
faster at the cost of a small delay on first execution.
Figure 3: A just-in-time compiler only compiles the byte-code to equivalent native code at
first execution. Upon every successive
execution, the JVM merely uses the already compiled native code to optimize performance.
Figure 45
Native optimization
The JVM is an intelligent virtual processor. It has the ability to identify areas within the
Java code itself that can be optimized for faster and better performance. Based on every
successive run of your Java applications, the JVM would optimize it to run even better.
2 [Link]
34
Java Development Kit (JDK)
Note:
There are portions of Java code that do not require it to be JIT-compiled at runtime,
e.g., the Reflection APIa ; therefore, code that uses such functions are not necessarily
fully compiled to native code.
a [Link]
Console:
Compilation
javac [Link]
This command would convert the [Link] source file into its equivalent
Java byte-code. The resultant byte-code would exist in a newly created file named
[Link]. This process of converting Java source files into their equiva-
lent byte-codes is known as compilation.
3 [Link]
35
The Java Platform
Figure 46
There are a huge array of tools available with the JDK that will all be explained in due
time as you progress with the book. These tools are briefly listed below in order of their
usage:
4 [Link]
36
Java Development Kit (JDK)
Interface). Commonly, native code is written in C (or C++). The JDK tool javah helps
to write the necessary C code, by generating C header files and C stub code.
5 [Link]
6 [Link]
37
The Java Platform
• javadoc — Java provides the user with a way to easily publish documentation about
the code using a special commenting system and the javadoc tool. The javadoc tool
generates documentation about the Application Programming Interface (API) of a set of
user-created Java classes. javadoc reads source file comments from the .java source files
and generates HTML documents that are easier to read and understand without looking
at the code itself.
• javap — Where Javadoc provide a detailed view into the API and documentation of a
Java class, the javap tool prints information regarding members (constructors, methods
and variables) in a class. In other words, it lists the class' API and/or the compiled
instructions of the class. javap is a formatting disassembler for Java bytecode.
[Link]
7
20Sequences
38
Similar concepts
The troubleshooting tools provide rather esoteric insight into aspects of the virtual machine.
(Interestingly, the Java debugger is not categorized as a troubleshooting tool.)
All the monitoring and management and troubleshooting tools are currently marked as
”experimental” (which does not affect jdb). So they might disappear in future JDKs.
8 [Link]
9 [Link]
10 [Link]
11 [Link]
12 [Link]
13 [Link]
14 [Link]
39
The Java Platform
J# is normally not supported with the JVM because instead of compiling it in Java byte-
code, the .NET platform compiles the code into CIL, thus making J# different from the
Java programming language. Furthermore, because J# implements the .NET Base Class
Libraries (BCL) instead of the Java Class Libraries, J# is nothing more than a non-standard
extension of the Java programming language. Due to the lack of interest from developers,
Microsoft had to withdraw their support for J#, and focused on a similar programming
language: C#.
Figure 47
15 [Link]
16 [Link]
40
Similar concepts
Of late, JVM-targeted third-party programming and scripting languages have seen tremen-
dous growth. Some of these languages are also used to extend the functionalities of the
Java language itself. A few examples include the following:
• Groovy17
• Pizza18
• GJ19 (Generic Java) − later officially incorporated into Java SE 5.
• NetREXX20
17 [Link]
18 [Link]
19 [Link]
20 [Link]
41
7 Getting started
Figure 48
Life is a complicated mess of interconnected objects sending signals and messages. See the
illustration below in figure 2 demonstrating a complex system for an economic ecosphere
for a single company. Imagine what this system diagram would be like if you were to add
a few more companies and their sub-systems. Computer software systems in general are a
complex web of further interconnected sub-systems − where each sub-system may or may
1 [Link]
43
Getting started
not be divided into further sub-systems. Each sub-system communicates with others using
feedback messages − that is, inputs and outputs.
Figure 2: Example of a complex system with multiple sub-systems and interactions
Figure 49
2 [Link]
44
The process of abstraction
class Animal { }
The code above creates a space within your code where you can start defining an object;
this space is called a class (or type) definition. All objects need to be defined using a
class definition in order for them to be used in your program. Notice the curly brackets
− anything you write within these brackets would serve as a definition or specification for
your object. In the case of the example above, we created a class definition called Animal
for objects that could serve as an abstract representation of any animal in real-life. The
way that a Java environment evaluates this code to be a class definition is by looking at
the prefix word we used to begin our class definition (i.e., class). Such predefined words
in the Java language are known as keywords and make up the grammar for the language
(known as programming syntax).
Note:
Class definitions have different names in different languages. They are sometimes called
type definitions, object specifications or templates as well
The code above effectively creates an object called dog based on the class definition for
Animal. In non-programmer parlance, the code above would translate into something akin
to saying, ”Create a new object dog of type Animal.” A single class definition enables you
to create multiple objects as the code below indicates:
Animal dog = new Animal();
Animal cat = new Animal();
Animal camel = new Animal();
3 [Link]
45
Getting started
Basically, you just have to write the code for your class or type definition once, and then use
it to create countless numbers of objects based on that specification. Although you might
not grasp the importance of doing so, this little exercise saves you a lot of time (a luxury
that was not readily available to programmers in the pre-Java days).
class Animal {
String name;
int legs;
}
Note:
Fields are called different things in different languages. They may be called state
identifiers, properties or member variables in other programming language syntax.
Java uses the words fields and properties in different contexts, as would be understood
from upcoming sections.
Figure 3: In order to denote the Animal object as a system within the Java Environment,
you present it as such. Note how fields are presented.
46
The process of abstraction
Figure 50
In order to demonstrate how fields work, we will go ahead and create objects from this
amended version of our class definition as such:
Animal animal1 = new Animal();
Animal animal2 = new Animal();
[Link] = "dog";
[Link] = 4;
[Link] = "duck";
[Link] = 2;
You can access the fields of your created objects by using the . (dot) or membership
operator. In the example above, we created two objects: animal1 and animal2 of type
Animal. And since, we had established that each Animal has two fields namely name and
legs, we accessed and modified these fields for each of our objects using the membership
operator to set the two apart. By declaring different values for different objects, we can
manipulate their current state. So, for instance:
• the animal1 object is a "dog" with 4 legs to walk with; while,
• the animal2 object is a "duck" with 2 legs to walk with.
What sets the two objects apart is their current state. Both the objects have different states
and thus stand out as two different objects even though they were created from the same
template or class definition.
47
Getting started
class Animal {
String name;
int legs;
void walk() { }
}
As you write this code, one thing becomes immediately apparent. Just like the class de-
scription, a method has curly brackets as well. Generally, curly brackets are used to define
an area (or scope) within your object. So the first set of curly brackets defined a scope for
your class definition called the class-level scope. This new set of curly brackets alongside
a method defines a scope for the further definition of your method called the method-level
scope.
In this instance, the name of our method is walk. Notice however that the name of our
method also features a set of round brackets as well. More than just being visual identifiers
for methods, these round brackets are used to provide our methods with additional input
information called arguments.
A method therefore enables an object to:
1. Accept input: Receive some argument(s);
2. Process information: work on the received argument(s) within its curly brackets; and,
3. Generate ouput: occasionally, return something back.
In essence, methods are what makes an object behave more like a system.
Notice the keyword void before the name of the method − this tells us that the method
walk returns nothing. You can set a method to return any data type − it can be a String
or an int as well.
Note:
Methods are known by different names in different programming language. They might
be called functions, procedures, routines or behaviors.
48
The process of encapsulation
Figure 4: The Animal object can now be denoted as having an interaction behavior within
the Java Environment
as illustrated here. Note the difference between the presentation of fields and methods.
Figure 51
49
Getting started
By declaring all fields and methods public, we have ensured that they can be used outside
the scope of the Animal class. This means that any other object (other than Animal) has
access to these member elements. However, to restrict access to certain member elements
of a class, we can always use the private access modifier (as demonstrated below).
class Animal {
In this example, the fields name and legs can only be accessed within the scope of the
Animal class. No object outside the scope of this class can access these two fields. However,
since the walk() method still has public access, it can be manipulated by actors and
objects outside the scope of this class. Access modifiers are not just limited to fields or
methods, they can be used for class definitions as well (as is demonstrated below).
public class Animal {
The following list of keywords show the valid access modifiers that can be used with a Java
program:
keyword description
public Opens access to a certain field or method to be used outside the scope
of the class.
private Restricts access to a certain field or method to only be used within the
scope of the class.
protected Access to certain field or methods is reserved for classes that inherit
the current class.
More on this would be discussed in the section on inheritance.
50
8 Installation
In order to make use of the content in this book, you would need to follow along each and
every tutorial rather than simply reading through the book. But to do so, you would need
access to a computer with the Java platform installed on it — the Java platform is the
basic prerequisite for running and developing Java code, thus it is divided into two essential
pieces of software:
• the Java Runtime Environment (JRE), which is needed to run Java applications
and applets;
• the Java Development Kit (JDK), which is needed to develop those Java applications
and applets.
However as a developer, you would only require the JDK which comes equipped with a JRE
as well.
As Java is just a programming language that allows you to program the computer, it
has multiple implementations available. The most popular implementation of JDK and
JRE are the ”Oracle Java SE” (formerly known as Sun JDK), maintained by Oracle as a
commercial release. However another similarly popular implementation is the OpenJDK,
with the benefit of being free software that could distribute freely under GPL v2 without
the requirement of accepting the ”Oracle Binary Code License Agreement for the Java SE
Platform Products and JavaFX”. The third option - the GCJ, as part of the GNU Compiler
Collection, would also supply the JDK and JRE.
Given below are installation instruction for the Oracle Java SE JDK for various operating
systems:
1. For Windows Vista or Windows 7, click Start › Control Panel › System and
Maintenance › System.
For Windows XP, click Start › Control Panel › System.
For Windows 2000, click Start › Settings › Control Panel › System.
Alternatively, you can also press Win + R to open the Run dialog. With the
dialog open, type cmd at the prompt:
51
Installation
2. In the command window with black background graced with white text, type
the following command:
Console:
JRE availability check
java -version
..then the JDK may not be installed or it may not be in your path.
To learn more about the Command Prompt syntax, take a look at this MS-DOS tutorial1 .
You may have other versions of Java installed; this command will only show the first in your
PATH. You will be made familiar with the PATH environment variable later in this text.
For now, if you have no idea what this is all about. Read through towards the end and we
will provide you with a step-by-step guide on how to set your own environment variables.
You can use your system's file search utilities to see if there is a [Link] executable
installed. If it is, and it is a recent enough version (Java 1.4.2 or Java 1.5, for example), you
should put the bin directory that contains javac in your system path. The Java runtime,
java, is often in the same bin directory.
If the installed version is older (i.e. it is Java 1.3.1 or Java 1.4.2 and you wish to use the
more recent Java 5 release), you should proceed below with downloading and installing a
JDK.
It is possible that you have the Java runtime (JRE), but not the JDK. In that case the
javac program won't be found, but the java -version will print the JRE version number.
Console:
Availability check
javac -version
If the JDK is installed and on your executable path, you should see some output which
tells you the command line options. The output will vary depending on which version is
installed and which vendor provided the Java installation.
1 [Link]
52
The process of encapsulation
Note:
Caution should be exercised when traversing through the Registry Editor. Any changes
to the keys and other entries may change the way your Windows operating system
normally works. Even minor changes may result into catastrophic failures of the normal
working of your machine. Better that you don't modify or tend to modify anything
whilst you are in the Registry Editor.
Download instructions
To acquire the latest JDK (version 7), you can manually download the Java software4 from
the Oracle website.
For the convenience of our readers, the following table presents direct links to the latest
JDK for the Windows operating system.
You must follow the instructions for the setup installer wizard step-by-step with the de-
fault settings to ensure that Java is properly installed on your system. Once the setup is
completed, it is highly recommended to restart your Windows operating system.
If you kept the default settings for the setup installer wizard, your JDK should
now be installed at C:\Program Files\Java\jdk1.7.0_01. You would require
2 [Link]
3 Chapter 8 on page 54
4 [Link]
5 [Link]
[Link]
6
[Link]
7 [Link]
[Link]
8
[Link]
53
Installation
the location to your bin folder at a later time — this is located at C:\Program
Files\Java\jdk1.7.0_01\bin It may be a hidden file, but no matter. Just don't use
Program Files (x86)\ by mistake unless that's where the files were installed by Java.
1. To open System Properties dialog box use, the Control Panel or type the fol-
lowing command in the command window:
Console:
System properties
rundll32 [Link],Control_RunDLL [Link]
2. Navigate to the Advanced tab on the top, and select Environment Vari-
ables...
3. Under System variables, select the variable named Path and click Edit...
4. In the Edit System Variable dialog, go to the Variable value field. This
field is a list of directory paths separated by semi-colons (;).
5. To add a new path, append the location of your JDK bin folder separated by a
semi-colon (;).
6. Click OK on every opened dialog to save changes and get past to where you
started.
2. Once the Notepad application has fired up, you can use the editor to write
code for the Java programming language.
54
The process of encapsulation
... then the JDK may not be installed or it may not be in your PATH.
You may have other versions of Java installed; this command will only show the first in your
PATH. You will be made familiar with the PATH environment variable later in this text.
For now, if you have no idea what this is all about, read through towards the end and we
will provide you with a step-by-step guide on how to set your own environment variables.
You can use your system's file search utilities to see if there is a javac executable installed.
If it is, and it is a recent enough version, you should put the bin directory that contains
javac in your system PATH. The Java runtime, java, is often in the same bin directory.
If the installed version is older (i.e. it is Java 5 and you wish to use the more recent Java 7
release), you should proceed below with downloading and installing a JDK.
It is possible that you have the Java runtime (JRE), but not the JDK. In that case the
javac program won't be found, but the java -version will print the JRE version number.
55
Installation
Console:
Availability check
javac -version
If the JDK is installed and on your executable path, you should see some output which
tells you the command line options. The output will vary depending on which version is
installed and which vendor provided the Java installation.
Download instructions
Alternatively, you can manually download the Java software9 from the Oracle website.
9 [Link]
56
The process of encapsulation
For the convenience of our readers, the following table presents direct links to the latest
JDK for the Linux operating system.
3. You should now be able to use SciTE for your programming needs. You may
also want to try Geany. Installation instructions are similar to those for SciTE.
On Mac OS, both the JRE and the JDK are already installed. However, the version installed
was the latest version when the computer was purchased, so you may want to update it.
10 [Link]
11 [Link]
[Link]
12
[Link]
13 [Link]
14 [Link]
[Link]
15
[Link]
16 [Link]
57
Installation
Console:
Availability check
java -version
If the JDK is installed and on your executable path, you should see some output which
tells you the command line options. The output will vary depending on which version is
installed and which vendor provided the Java installation.
If you already have the JRE installed, you can use the Java Wiki Integrated Development
Environment (JavaWIDE) to code directly in your browser, no account or special software
required.
Click here to visit the JavaWIDE Sandbox to get started.17
For more information, click here to visit the JavaWIDE site.18
17 [Link]
18 [Link]
58
9 Compilation
In Java, programs are not compiled into executable files; they are compiled into bytecode1
(as discussed earlier2 ), which the JVM (Java Virtual Machine) then executes at runtime.
Java source code is compiled into bytecode when we use the javac compiler. The bytecode
gets saved on the disk with the file extension .class. When the program is to be run, the
bytecode is converted, using the just-in-time3 (JIT) compiler. The result is machine code
which is then fed to the memory and is executed.
Java code needs to be compiled twice in order to be executed:
1. Java programs need to be compiled to bytecode.
2. When the bytecode is run, it needs to be converted to machine code.
The Java classes/bytecode are compiled to machine code and loaded into memory by the
JVM when needed the first time. This is different from other languages like C/C++ where
programs are to be compiled to machine code and linked to create an executable file before
it can be executed.
1. Proceed only if you have successfully installed and configured your system for
Java as discussed here4 .
2. Open your preferred text editor — this is the editor you set while installing the
Java platform.
For example, Notepad or Notepad++ on Windows; Gedit, Kate or SciTE
on Linux; or, XCode on Mac OS, etc.
3. Write the following lines of code in a new text document:Code listing 2.5: Hel-
[Link]
1 [Link]
2 Chapter 5.11 on page 29
3 [Link]
4 Chapter 7.3.1 on page 50
59
Compilation
4. Save the file as [Link] — the name of your file should be the same
as the name of your class definition5 and followed by the .java extension. This
name is case-sensitive, which means you need to capitalize the precise letters
that were capitalized in the name for the class definition.
5. Next, open your preferred command-line application.
For example, Command Prompt on Windows; and, Terminal on Linux and
Mac OS.
6. In your command-line application, navigate to the directory where you just cre-
ated your file. If you do not know how to do this, consider reading through our
crash courses for command-line applications for Windows6 or Linux7 .
7. Compile the Java source file using the following command which you can copy
and paste in if you want:Compilation
javac [Link]
1 Warning
If you obtain an error message like error: cannot read:
[Link] 1 error, your file is not in the current folder or it is
badly spelled. Did you navigate to the program's location in the command
prompt using the cd8 (change directory) command?If you obtain another
message ending by 1 error or ... errors, there may be a mistake in your
code. Are you sure all words are spelled correctly and with the exact case as
shown? Are there semicolons and brackets in the appropriate spot? Are you
missing a quote? Usually, modern IDEs would try coloring the entire source
as a quote in this [Link] your computer emits beeps, then you may have
illegal characters in your [Link] no [Link] file has
been created in the same folder, then you've got an error. Are you launching
the javac program correctly?
8. Once the compiler returns to the prompt, run the application using the following
command:Execution
java HelloWorld
1 Warning
If you obtain an error message like Exception in thread "main"
[Link]: HelloWorld, the [Link]
file is not in the current folder or it is badly [Link] you obtain an error
message like Exception in thread "main"
[Link]: main, your source file may have been
badly written.
60
Automatic Compilation of Dependent Classes
Ask for help if the program did not execute properly in the Discussion page9 for this chapter
.
However, you can't rely on this feature if your program is using reflection to create objects,
or you are compiling for servlets or for a ”jar”, package. In these cases you should list these
classes for explicit compilation.
Main class compilation
9 [Link]
10 Chapter 25.59 on page 223
61
Compilation
Example:
Code section 2.1: Package declaration
package example;
9.3.2 Subpackages
A class with this package declaration
Example:
Code section 2.2: Package declaration with sub-packages
package [Link];
62
The JIT compiler
Java), the sole purpose of which is to run as fast as possible on the target CPU
(virtual CPU of your JVM). Java code gets converted into several machine code
instructions. Variables are shoved all over the place – into the stack, into
registers, or completely optimized away. Structures and objects don’t even exist
in the resulting code – they’re merely an abstraction that gets translated to
hard-coded offsets into memory buffers.
So how does a debugger know where to stop when you ask it to break at the
entry to some function? How does it manage to find what to show you when you ask
it for the value of a variable? The answer is – debugging information.
Symbolic Information : Symbolic resolution is done at class loading time at linking res-
olution step. It is the process of replacing symbolic references from the type with direct
references. It is done by searching into method area to locate the referenced entity
63
10 Execution
There are various ways in which Java code can be executed. A complex Java application
usually uses third party APIs or services. In this section we list the most popular ways a
piece of Java code may be packed together and/or executed.
1 [Link]
65
Execution
(Figure 1) Stand alone application refers to a Java program where both the user interface
and business modules are running on the same computer. The application may or may
not use a database to persist data. The user interface could be either AWT or Swing.
The application would start with a main() method of a Class. The application stops when
the main() method exits, or if an exception is thrown from the application to the JVM.
Classes are loaded to memory and compiled as needed, either from the file system or from
a *.jar file, by the JVM.
Invocation of Java programs distributed in this manner requires usage of the command
line. Once the user has all the class files, he needs to launch the application by the following
command line (where Main is the name of the class containing the main() method.)
Execution of class
java Main
2 [Link]
3 [Link]
4 [Link]
5 [Link]
66
J2EE code execution
Web Applications
For applications needed by lots of client installations, the client-server model did not work.
Maintaining and upgrading the hundreds or thousands of clients caused a problem. It was
not practical. The solution to this problem was to create a unified, standard client, for all
applications, and that is the Browser6 .
Having a standard client, it makes sense to create a unified, standard back-end service as
well, and that is the Application Server7 .
Web Application is an application that is running in the Application Server8 , and it can
be accessed and used by the Browser9 client.
There are three main area of interest in Web Applications, those are:
• The Web Browser10 . This is the container of rendering HTML text, and running client
scripts
• The HTTP11 protocol12 . Text data are sent back and forth between Browser and the
Server
• The Web server13 to serve static content, Application server14 to serve dynamic content
and host EJB15 s.
Wikipedia also has an article about Web application16 .
6 [Link]
7 [Link]
8 [Link]
9 [Link]
10 [Link]
11 [Link]
12 [Link]
13 [Link]
14 [Link]
15 [Link]
16 [Link]
17 [Link]
67
Execution
18 [Link]
19 [Link]
20 [Link]
21 [Link]
22 [Link]
68
J2EE code execution
EJB code
(Figure 4) In the 1990s, with the client server computing, a trend started, that is to move
away from Mainframe computing. That resulted in many small separate applications in
a Company/Enterprise. Many times the same data was used in different applications. A
23 [Link]
69
Execution
new philosophy, ”Enterprise Computing”, was created to address these issues. The idea
was to create components that can be reused throughout the Enterprise. The Enterprise
Java Beans (EJBs) were supposed to address this.
An EJB is an application component that runs in an EJB container. The client accesses
the EJB modules through the container, never directly. The container manages the life
cycle of the EJB modules, and handles all the issues that arise from network/enterpise
computing. Some of those are security/access control24 , object pooling25 , transaction
management26 , ... .
EJBs have the same problems as any reusable code: they need to be generic enough to
be able to be reused and the changes or maintenance of EJBs can affect existing clients.
Many times EJBs are used unnecessarily when they are not really needed. An EJB should
be designed as a separate application in the enterprise, fulfilling one function.
24 [Link]
25 [Link]
26 [Link]
70
Jini
• The servlet acts as the controller and contains the logic that is necessary to process
user events and to select an appropriate response.
• The business logic (model) actually accomplishes the goal of the interaction. This might
be a query or an update to a database. This could be handled by EJB technology.
For more information about MVC, please see MVC27 .
10.3 Jini
After J2EE Sun had a vision about the next step of network computing. That is Jini28 . The
main idea is that in a network environment, there would be many independent services and
consumers. Jini would allow these services/consumers to interact dynamically with each
other in a robust way. The basic features of Jini are:
• No user intervention is needed when services are brought on or offline. (In contrast to
EJBs where the client program has to know the server and port number where the EJB
is deployed, in Jini the client is supposed to find, to discover, the service in the network.)
• Self healing by adapting when services (consumers of services) come and go. (Services
periodically need to renew a lease to indicate that they are still available.)
• Consumers of JINI services do not need prior knowledge of the service's implementation.
The implementation is downloaded dynamically and run on the consumer JVM,
without configuration and user intervention. (For example, the end user may be presented
with a slightly different user interface depending upon which service is being used at the
time. The implementation of the user interface code would be provided by the service
being used.)
A minimal Jini network environment consists of:
• One or more services
• A lookup-service keeping a list of registered services
• One or more consumers
Jini is not widely used at the current writing (2006). There are two possible reasons for
it. One is Jini a bit complicated to understand and to set it up. The other reason is that
Microsoft pulled out from Java, which caused the industry to turn to the use of proprietary
solutions.
27 [Link]
28 [Link]
71
11 Understanding a Java Program
This article presents a small Java program which can be run from the console. It computes
the distance between two points on a plane. You do not need to understand the structure
and meaning of the program just yet; we will get to that soon. Also, because the program
is intended as a simple introduction, it has some room for improvement, and later in the
module we will show some of these improvements. But let's not get too far ahead of
ourselves!
At this point, you may wish to review the source to see how much you might be able to
understand. While perhaps not being the most literate of programming languages, some-
one with understanding of other procedural languages such as C, or other object oriented
languages such as C++ or C#, will be able to understand most if not all of the sample
program.
73
Understanding a Java Program
Once you save the file, compile2 the program: Compilation command
$ javac [Link]
1 Warning
If you get a [Link] exception, some arguments are not
a number. If you get a [Link] exception, you
did not provide enough numbers.
Here are two examples: Output for the distance between the points (0, 3) and (4, 0)
$ java Distance 0 3 4 0
Distance between [Link][x=0,y=3] and [Link][x=4,y=0] is 5.0
Output for the distance between the points (-4, 5) and (11, 19)
$ java Distance -4 5 11 19
Distance between [Link][x=-4,y=5] and [Link][x=11,y=19] is
20.518284528683193
We'll explain this strange looking output, and also show how to improve it, later.
2 Chapter 8 on page 58
3 Chapter 7.3.1 on page 50
74
Detailed Program Structure and Overview
7 }
8
9 public void printDistance() {
10 [Link]("Distance between " + point0 + " and " + point1
11 + " is " + [Link](point1));
12 }
13
14 public static void main(String[] args) {
15 Distance dist = new Distance(
16 intValue(args[0]), intValue(args[1]),
17 intValue(args[2]), intValue(args[3]));
18 [Link]();
19 }
20
21 private static int intValue(String data) {
22 return [Link](data);
23 }
24 }
4 [Link]
5 Chapter 24.4.7 on page 184
6 Chapter 11.2.3 on page 83
7 Chapter 20.1 on page 150
8 [Link]
9 [Link]
75
Understanding a Java Program
76
Detailed Program Structure and Overview
The class declaration is then followed by a block (surrounded by curly braces) which provides
the class's definition (in blue in figure 2.214 ). The definition is the implementation of the
class − the declaration and definitions of the class's members. This class contains exactly
six members, which we will explain in turn.
1. Two field declarations, named point0 and point1 (in green)
2. A constructor declaration (in orange)
3. Three method declarations (in red)
Example:
Code section 2.1: Declaration.
1 private [Link] point0, point1;
...declares two instance fields. Instance fields represent named values that are allocated
whenever an instance of the class is constructed. When a Java program creates a Distance
instance, that instance will contain space for point0 and point1. When another Distance
object is created, it will contain space for its own point0 and point1 values. The value of
point0 in the first Distance object can vary independently of the value of point0 in the
second Distance object.
This declaration consists of:
1. The private15 access modifier,
which means these instance fields are not visible to other classes.
2. The type of the instance fields. In this case, the type is [Link].
This is the class Point in the [Link] package.
3. The names of the instance fields in a comma separated list.
These two fields could also have been declared with two separate but more verbose decla-
rations,
Example:
Code section 2.2: Verbose declarations.
1 private [Link] point0;
2 private [Link] point1;
Since the type of these fields is a reference type (i.e. a field that refers to or can hold a
reference to an object value), Java will implicitly initialize the values of point0 and point1
to null when a Distance instance is created. The null value means that a reference value
does not refer to an object. The special Java literal null is used to represent the null value
in a program. While you can explicitly assign null values in a declaration, as in
77
Understanding a Java Program
Example:
Code section 2.3: Declarations and assignments.
1 private [Link] point0 = null;
2 private [Link] point1 = null;
Example: Constructor
A constructor16 is a special method in a class which is used to construct an instance of the
class. The constructor can perform initialization for the object, beyond that which the Java
VM does automatically. For example, Java will automatically initialize the fields point0
and point1 to null.
Example:
Code section 2.4: The constructor for the class
1 public Distance(int x0, int y0, int x1, int y1) {
2 point0 = new [Link](x0, y0);
3 point1 = new [Link](x1, y1);
4 }
78
Detailed Program Structure and Overview
This is the constructor for the Distance class. Distance implicitly extends from
[Link]. Java inserts a call to the super constructor as the first executable
statement of the constructor if there is not one explicitly coded. The above constructor
body is equivalent to the following body with the explicit super constructor call:
Example:
Code section 2.5: Super constructor.
1 {
2 super();
3 point0 = new [Link](x0, y0);
4 point1 = new [Link](x1, y1);
5 }
Example: Methods
Methods19 are the third and most important type of class member. This class contains
three methods in which the behavior of the Distance class is defined: printDistance(),
main(), and intValue()
Example:
Code section 2.6: printDistance() method.
1 public void printDistance() {
2 [Link]("Distance between " + point0
3 + " and " + point1
4 + " is " + [Link](point1));
5 }
This instance method executes within the context of an implicit Distance object. The
instance field references, point0 and point1, refer to instance fields of that implicit object.
You can also use the special variable this to explicitly reference the current object. Within
79
Understanding a Java Program
an instance method, Java binds the name this to the object on which the method is
executing, and the type of this is that of the current class. The body of the printDistance
method could also be coded as
Example:
Code section 2.7: Explicit instance of the current class.
1 [Link]("Distance between " + this.point0
2 + " and " + this.point1
3 + " is " + [Link](this.point1));
Example:
Code section 2.8: String concatenation.
1 "Distance between " + this.point0
2 + " and " + this.point1
3 + " is " + [Link](this.point1)
java Distance 0 3 4 0
80
Detailed Program Structure and Overview
instructs Java to locate the Distance class, put the four command line arguments into an
array of String values, then pass those arguments to the public static main(String[])
method of the class. We will introduce arrays shortly. Any Java class that you want to
invoke from the command line or desktop shortcut must have a main method with this
signature or the following signature: public static main(String...).
Example:
Code section 2.9: main() method.
1 public static void main(String[] args) {
2 Distance dist = new Distance(
3 intValue(args[0]), intValue(args[1]),
4 intValue(args[2]), intValue(args[3]));
5 [Link]();
6 }
The main() method invokes the final method, intValue(), four times. The intValue()
takes a single string parameter and returns the integer value represented in the string. For
example, intValue("3") will return the integer 3.
People who do test-first programming or perform regression testing write a main() method
in every Java class, and a main() function in every Python module20 , to run automated
tests. When a person executes the file directly, the main() method executes and runs the
automated tests for that file. When a person executes some other Java file that in turn
imports many other Java classes, only one main() method is executed – the main() method
of the directly-executed file.
Example:
Code section 2.10: intValue() method.
1 private static int intValue(String data) {
2 return [Link](data);
3 }
This method is private since, like the fields point0 and point1, it is part of the internal
implementation of the class and is not part of the external programming interface of the
Distance class.
[Link]
20
20them%20
81
Understanding a Java Program
object instantiated has its own private state variables and methods but use the same
static methods and members common to the single class object created by the compiler
when the first class object is instantiated or created. This means that the method executes
in a static or non-object context — there is no implicit separate instance available when
the static methods run from various objects, and the special variable this is not avail-
able. As such, static methods cannot access instance methods or instance fields (such as
printDistance()) or point0) directly. The main() method can only invoke the instance
method printDistance() method via an instance reference such as dist.
Primitive Types
The primitive types21 are used to represent boolean, character, and numeric values. This
program uses only one primitive type explicitly, int, which represents 32 bit signed in-
teger values. The program also implicitly uses double, which is the return type of the
distance() method of [Link]. double values are 64 bit IEEE floating point
values. The main() method uses integer values 0, 1, 2, and 3 to access elements of the com-
mand line arguments. The Distance() constructor's four parameters also have the type
int. Also, the intValue() method has a return type of int. This means a call to that
method, such as intValue(args[0]), is an expression of type int. This helps explain why
the main method cannot call:
1 Warning
Code section 2.11: Wrong type.
1 new Distance(args[0], args[1], args[2], args[3]) // This is an error
Since the type of the args array element is String, and our constructor's parameters must
be int, such a call would result in an error because Java will not automatically convert
values of type String into int values.
Java's primitive types are boolean, byte, char, short, int, long, float and double. Each
of which are also Java language keywords.
Reference Types
In addition to primitive types, Java supports reference type. A reference type is a Java data
type which is defined by a Java class or interface. Reference types derive this name because
such values refer to an object or contain a reference to an object. The idea is similar to
pointers in other languages like C.
82
Detailed Program Structure and Overview
Java represents sequences of character data, or String22 , with the reference type
[Link] which is most commonly referred to as String. String literals, such
as "Distance between " are constants whose type is String.
This program uses three separate reference types:
1. [Link] (or simply String)
2. Distance
3. [Link]
For more information see chapter: Java Programming/Classes, Objects and Types23 .
Array Types
Java supports arrays24 , which are aggregate types which have a fixed element type (which
can be any Java type) and an integral size. This program uses only one array, String[]
args. This indicates that args has an array type and that the element type is String.
The Java VM constructs and initializes the array that is passed to the main method. See
arrays25 for more details on how to create arrays and access their size.
The elements of arrays are accessed with integer indices. The first element of an array is
always element 0. This program accesses the first four elements of the args array explicitly
with the indices 0, 1, 2, and 3. This program does not perform any input validation, such
as verifying that the user passed at least four arguments to the program. We will fix that
later.
void
void is not a type in Java; it represents the absence of a type. Methods which do not return
values are declared as void methods.
This class defines two void methods:
Example:
Code section 2.12: Void methods
1 public static void main(String[] args) { ... }
2 public void printDistance() { ... }
83
Understanding a Java Program
11.3 Whitespace
Whitespace in Java is used to separate the tokens in a Java source file. Whitespace is
required in some places, such as between access modifiers26 , type names27 and Identifiers,
and is used to improve readability elsewhere.
Wherever whitespace is required in Java, one or more whitespace characters may be used.
Wherever whitespace is optional in Java, zero or more whitespace characters may be used.
Java whitespace consists of the
• space character ’ ’ (0x20),
• the tab character (hex 0x09),
• the form feed character (hex 0x0c),
• the line separators characters newline (hex 0x0a) or carriage return (hex 0x0d) characters.
Line separators are special whitespace characters in that they also terminate line comments,
whereas normal whitespace does not.
Other Unicode space characters, including vertical tab, are not allowed as whitespace in
Java.
Example:
Code section 2.13: Method declaration
1 private static int intValue(String data) {
2 return [Link](data);
3 }
Whitespace is required between private and static, between static and int, between int
and intValue, and between String and data.
If the code is written like this:
Example:
Code section 2.14: Collapsed code
1 privatestaticint intValue(String data) {
2 return [Link](data);
3 }
...it means something completely different: it declares a method which has the return type
privatestaticint It is unlikely that this type exists and the method is no longer static,
so the above would result in a semantic error.
84
Indentation
11.4 Indentation
Java ignores all whitespace in front of a statement. As this, these two code snippets are
identical for the compiler:
Example:
Code section 2.15: Indented code
1 public static void main(String[] args) {
2 Distance dist = new Distance(
3 intValue(args[0]), intValue(args[1]),
4 intValue(args[2]), intValue(args[3]));
5 [Link]();
6 }
7
8 private static int intValue(String data) {
9 return [Link](data);
10 }
Example:
Code section 2.16: Not indented code
1 public static void main(String[] args) {
2 Distance dist = new Distance(
3 intValue(args[0]), intValue(args[1]),
4 intValue(args[2]), intValue(args[3]));
5 [Link]();
6 }
7
8 private static int intValue(String data) {
9 return [Link](data);
10 }
However, the first one's style (with whitespace) is preferred, as the readability is higher.
The method body is easier to distinguish from the head, even at a higher reading speed.
85
12 Java IDEs
12.2 Eclipse
Eclipse is a Free and Open Source IDE, plus a developer tool framework that can be extended
for a particular development need. IBM was behind its development, and it replaced IBM
VisualAge tool. The idea was to create a standard look and feel that can be extended via
plugins. The extensibility distinguishes Eclipse from other IDEs. Eclipse was also meant
to compete with Microsoft Visual Studio tools. Microsoft tools give a standard way of
developing code in the Microsoft world. Eclipse gives a similar standard way of developing
code in the Java world, with a big success so far. With the online error checking only,
coding can be sped up by at least 50% (coding does not include programming).
The goals for Eclipse are twofold:
1. Give a standard IDE for developing code
2. Give a starting point, and the same look and feel for all other more sophisticated tools
built on Eclipse
IBM's WSAD, and later IBM Rational Software Development Platform, are built on Eclipse.
Standard Eclipse features:
• Standard window management (perspectives, views, browsers, explorers, ...)
• Error checking as you type (immediate error indications, ...)
• Help window as you type (type ., or <ctrl> space, ...)
• Automatic build (changes in source code are automatically compiled, ...)
• Built-in debugger (full featured GUI debugger)
• Source code generation (getters and setters, ...)
• Searches (for implementation, for references, ...)
• Code refactoring (global reference update, ...)
• Plugin-based architecture (ability to build tools that integrate seamlessly with the envi-
ronment, and some other tools)
• ...
1 [Link]
87
Java IDEs
12.3 NetBeans
The NetBeans IDE is a Free and Open Source IDE for software developers. The IDE runs
on many platforms including Windows, GNU/Linux, Solaris and Mac OS X. It is easy to
install and use straight out of the box. You can easily create Java applications for mobile
devices using Mobility Pack in NetBeans. With Netbeans 6.0, the IDE has become one
of the most preferred development tools, whether it be designing a Swing UI, building a
mobile application, an enterprise application or using it as a platform for creating your own
IDE.
More info: netbeans.org4
12.4 JCreator
JCreator is a simple and lightweight JAVA IDE from XINOX Software. It runs only on
Windows platforms. It is very easy to install and starts quickly, as it is a native application.
This is a good choice for beginners.
More info: [Link] or JCre-
ator5
12.5 Processing
Processing is an enhanced IDE. It adds some extra commands and a simplified program-
ming model. This makes it much easier for beginners to start programming in Java. It was
designed to help graphic artists learn a bit of programming without struggling too much.
Processing runs on Windows, GNU/Linux and Mac OS X platforms.
More info: Processing6 .
12.6 BlueJ
BlueJ is an IDE that includes templates and will compile and run the applications for you.
BlueJ is often used by classes because it is not necessary to set classpaths. BlueJ has its
own sets of libraries and you can add your own under preferences. That sets the classpath
for all compilations that come out of it to include those you have added and the BlueJ
libraries.
2 [Link]
3 [Link]
4 [Link]
5 [Link]
6 [Link]
88
Kawa
BlueJ offers an interesting GUI for creation of packages and programs. Classes are repre-
sented as boxes with arrows running between them to represent inheritance/implementation
or if on is constructed in another. The source code is generated by the UML diagram7 or
vice-versa. BlueJ adds all those classes (the project) into the classpath at compile time.
By default it doesn't display the line numbers, so this should be ticked into Options\Pref-
erences...
More info: BlueJ Homesite8
12.7 Kawa
Kawa is basically a Java editor developed by Tek-Tools. It does not include wizards and
GUI tools, best suited to experienced Java programmers in small and midsized development
teams. It looks that there is no new development for Kawa.
See also a javaworld article9
12.8 JBuilder
JBuilder is an IDE with proprietary source code, sold by Embarcadero Technologies. One
of the advantages is the integration with Together, a modeling tool.
More info: Embarcadero10 .
12.9 DrJava
DrJava is an IDE developed by the JavaPLT group at Rice University. It is designed for
students.
For more information see DrJava11 .
7 [Link]
8 [Link]
9 [Link]
10 [Link]
11 [Link]
12 [Link]
13 [Link]
14 [Link]
15 [Link]
89
Java IDEs
• w:jEdit16
• w:MyEclipse17
• w:Visual Café18
• Gel19
• JIPE20
• Zeus21
• Setu Eye Saving Lightweight(fast)C,C++,JAVA IDE22
16 [Link]
17 [Link]
18 [Link]
19 [Link]
20 [Link]
21 [Link]
22 [Link]
90
13 Language Fundamentals
The previous chapter ”Getting started1 ” was a primer course in the basics of understanding
how Java programming works. Throughout the chapter, we tackled a variety of concepts
that included:
• Objects and class definitions;
• Abstract and data types;
• Properties;
• Methods;
• Class-level and method-level scopes;
• Keywords; and,
• Access modifiers, etc.
From this point on, we will be looking into the above mentioned concepts and many more
in finer detail with a deeper and richer understanding of how each one of them works. This
chapter on Language fundamentals introduces the fundamental elements of the Java
programming language in detail. The discussions in this chapter will use the concepts we
have already gathered from our previous discussions and build upon them in a progressive
manner.
91
Language Fundamentals
Java uses a syntax similar to the C programming language7 and therefore if one learns the
Java programming syntax, they automatically would be able to read and write programs in
similar languages — C, C++8 and C#9
The next step one must take when learning a new language is to learn its keywords; by
combining the knowledge of keywords10 with an understanding of syntax11 rules, one can
create statements12 , Programming Blocks, Classes, Interfaces, et al.
Use packages13 to avoid name collisions. To hide as much information as possible use the
access modifiers14 properly.
Create methods15 that do one and if possible only one thing/task. If possible have separate
method that changes the object state.
In an object oriented language, programs are run with objects; however, for ease of use and
for historic reasons, Java has primitive types16 . Primitive Data Types only store values
and have no methods. Primitive Types may be thought of as Raw Data and are usually
embedded attributes inside objects or used as local variables in methods. Because primitive
types are not subclasses of the object superclass, each type has a Wrapper Class which is a
subclass of Object, and can thus be stored in a collection or returned as an object.
Java is a strong type17 checking language. There are two concepts regarding types and
objects. One is the object type and the other the template/class the object was created
from. When an object is created, the template/class is assigned to that object which can
not be changed. Types of an object however can be changed by type casting. Types of an
object is associated with the object reference that referencing the object and determines
what operation can be performed on the object through that object reference. Assigning
the value of one object reference to a different type of object reference is called type casting.
The most often used data structure in any language is a character string. For this reason
java defines a special object that is String18 .
To aggregate same type java objects to an array, java has a special array19 object for that.
Both java objects and primitive types can be aggregated to arrays.
7 [Link]
8 [Link]
9 [Link]
10 Chapter 24.4.7 on page 184
11 [Link]
12 Chapter 13.1 on page 92
13 Chapter 25.59 on page 223
14 [Link]
15 Chapter 21.5 on page 156
16 Chapter 18.8 on page 135
17 Chapter 23.8 on page 175
18 Chapter 22.5 on page 165
19 Chapter 26.6 on page 227
92
14 Statements
Now that we have the Java platform on our systems and have run the first program suc-
cessfully, we are geared towards understanding how programs are actually made. As we
have already discussed, a program is a set of instructions, which are tasks provided to a
computer. These instructions are called statements in Java. Statements can be anything
from a single line of code to a complex mathematical equation. Consider the following line:
Example:
Code section 3.1: A simple assignment statement.
1 int age = 24;
This line is a simple instruction that tells the system to initialize a variable and set its value
as 24. If the above statement was the only one in the program, it would look similar to this:
Code listing 3.1: A statement in a simple class.
Java places its statements within a class declaration and, in the class declaration, the
statements are usually placed in a method declaration, as above.
Example:
Code section 3.2: A simple declaration statement.
1 int age;
It defines a variable that can be used to store values for later use. The first token is the
data type1 of the variable (which type of values this variable can store). The second token
93
Statements
is the name of the variable, by which you will be referring to it. Then each declaration
statement is ended by a semicolon (;).
Example:
Code section 3.3: Multiple assignment statements.
1 int a = 10;
2 int b = 20;
3 int c = 30;
You do not necessarily have to use a new line to write each statement. Just like English,
you can begin writing the next statement where you ended the first one as depicted below:
Example:
Code section 3.4: Multiple assignment statements on the same line.
1 int a = 10; int b = 20; int c = 30;
However, the only problem with putting multiple statements on one line is, it's very difficult
to read it. It doesn't look that intimidating at first, but once you've got a significant amount
of code, it's usually better to organize it in a way that makes sense. It would look more
complex and incomprehensible written as it is in Listing 3.4.
Now that we have looked into the anatomy of a simple assignment statement, we can look
back at what we've achieved. We know that...
• A statement is a unit of code in programming.
• If we are assigning a variable a value, the statement is called an assignment statement.
• An assignment statement includes three parts: a data type, the variable name (also called
the identifier) and the value of a variable. We will look more into the nature of identifiers
and values in the section Variables3 later.
Now, before we move on to the next topic, you need to try and understand what the code
below does.
2 [Link]
3 Chapter 17.2 on page 128
94
Assertion
Example:
Code section 3.5: Multiple assignment statements with expressions.
1 int firstNumber = 10;
2 int secondNumber = 20;
3 int result = firstNumber + secondNumber;
4 [Link](result);
5 secondNumber = 30; // This won't change the value of secondNumber. See the
note.
6 [Link](result); // Hence, the result will remain same.
The first two statements are pretty much similar to those in Section 3.34 but with different
variable names. The third however is a bit interesting. We've already talked of variables
as being similar to gift boxes. Think of your computer's memory as a shelf where you put
all those boxes. Whenever you need a box (or variable), you call its identifier (that's the
name of the variable). So calling the variable identifier firstNumber gives you the number
10, calling secondNumber would give you 20 hence when you add the two up, the answer
should be 30. That's what the value of the last variable result would be. The part of the
third statement where you add the numbers, i.e., firstNumber + secondNumber is called
an expression and the expression is what decides what the value is to be. If it's just a
plain value, like in the first two statements, then it's called a literal (the value is literally
the value, hence the name literal).
Note that after the assignment to result its value will not be changed if we assign different
values to firstNumber or secondNumber, like in line 5.
With the information you have just attained, you can actually write a decent Java program
that can sum up values.
14.3 Assertion
An assertion checks if a condition is true:
Example:
Code section 3.6: A return statement.
1 public int getAge()
2 {
3 assert age >= 0;
4 return age;
5 }
Each assert statement is ended by a semi-colon (;). However, assertions are disabled by
default, so you must run the program with the -ea argument in order for assertions to be
enabled (java -ea [name of compiled program]).
95
Statements
Example:
Code section 3.7: A statement block.
1 {
2 int a = 10;
3 int b = 20;
4 int result = a + b;
5 }
96
Return statement
The program flow begins in the main method. Just as aMethod is invoked, the flow travels
to the called method. At this very point, the flow branches to the other method. Once the
method is completed, the flow is returned to the point it left off and resumes at the next
statement after the call to the method.
Example:
Code section 3.9: A return statement.
1 public int getAge() {
2 int age = 24;
3 return age;
4 }
A return statement can return the content of a variable or nothing. Beware not to write
statements after a return statement which would not be executed! Each return statement
is ended by a semi-colon (;).
Conditional Statements
Also referred to as if statements, these allow a program to perform a test and then take
action based on the result of that test.
The form of the if statement:
if (condition) {
do statements here if condition is true
} else {
97
Statements
The condition is a boolean expression which can be either true or false. The actions
performed will depend on the value of the condition.
Example:
Example:
Code section 3.10: An if statement.
1 if (i > 0) {
2 [Link]("value stored in i is greater than zero");
3 } else {
4 [Link]("value stored is not greater than zero");
5 }
If statements can also be made more complex using the else if combination:
if (condition 1) {
do statements here if condition 1 is true
} else if (condition 2) {
do statements here if condition 1 is false and condition 2 is true
} else {
do statements here if neither condition 1 nor condition 2 is true
}
Example:
Example:
Code section 3.11: An if/else if/else statement.
1 if (i > 0) {
2 [Link]("value stored in i is greater than zero");
3 } else if (i < 0) {
4 [Link]("value stored in i is less than zero");
5 } else {
6 [Link]("value stored is equal to 0");
7 }
If there is only one statement to be executed after the condition, as in the above example,
it is possible to omit the curly braces, however Oracle's Java Code Conventions5 explicitly
state that the braces should always be used.
There is no looping involved in an if statement so once the condition has been evaluated
the program will continue with the next instruction after the statement.
If...else statements
The if ... else statement is used to conditionally execute one of two blocks of statements,
depending on the result of a boolean condition.
5 [Link]
98
Return statement
Example:
Example:
Code section 3.12: An if/else statement.
1 if (list == null) {
2 // This block of statements executes if the condition is true.
3 } else {
4 // This block of statements executes if the condition is false.
5 }
Oracle's Java Code Conventions6 recommend that the braces should always be used.
An if statement has two forms:
if (boolean-condition)
statement1
and
if (boolean-condition)
statement1
else
statement2
Use the second form if you have different statements to execute if the boolean-condition is
true or if it is false. Use the first if you only wish to execute statement1 if the condition is
true and you do not wish to execute alternate statements if the condition is false.
The code section 3.137 calls two int methods, f() and y(), stores the results, then uses
an if statement to test if x is less than y and if it is, the statement1 body will swap the
values. The end result is x always contains the larger result and y always contains the
smaller result.
Example:
Code section 3.13: Value swap.
1 int x = f();
2 int y = y();
3 if (x < y) {
4 int z = x;
5 x = y;
6 y = z;
7 }
if...else statements also allow for the use of another statement, else if. This statement is
used to provide another if statement to the conditional that can only be executed if the
others are not true. For example:
6 [Link]
7 Chapter 14.11 on page 104
99
Statements
Example:
Code section 3.14: Multiple branching.
1 if (x == 2)
2 x = 4;
3 else if (x == 3)
4 x = 6;
5 else
6 x = -1;
The else if statement is useful in this case because if one of the conditionals is true, the
other must be false. Keep in mind that if one is true, the other will not execute. For
example, if the statement at line 2 contained in the first conditional were changed to x =
3;, the second conditional, the else if, would still not execute. However, when dealing with
primitive types in conditional statements, it is more desirable to use switch statements8
rather than multiple else if statements.
Switch statements
The switch conditional statement is basically a shorthand version of writing many if...else
statements. The syntax for switch statements is as follows:
switch(<variable>) {
case <result>: <statements>; break;
case <result>: <statements>; break;
default: <statements>; break;
}
This means that if the variable included equals one of the case results, the statements
following that case, until the word break will run. The default case executes if none of
the others are true. Note: the only types that can be analysed through switch statements
are char, byte, short, or int primitive types. This means that Object variables can not
by analyzed through switch statements. However, as of the JDK 7 release, you can use a
String object in the expression of a switch statement.
Example:
Code section 3.15: A switch.
1 int n = 2, x;
2 switch (n) {
3 case 1: x = 2;
4 break;
5 case 2: x = 4;
6 break;
7 case 3: x = 6;
8 break;
9 case 4: x = 8;
10 break;
11 }
12 return x;
100
Iteration Statements
In this example, since the integer variable n is equal to 2, case 2 will execute, make x
equal to 4. Thus, 4 is returned by the method.
while (condition) {
statement;
}
do {
statement;
} while (condition);
101
Statements
Example: Console:
Code section 3.16: A for loop. Output for code listing 3.16a if you compile and run the state-
ment above.
Example:
Code section 3.17: An alternative version.
1 int i = 0;
2 while (i < 100) {
3 [Link](i + "\t" + i * i);
4 i++;
5 }
For an example, we'll take an array of Strings denoting days in a week and traverse through
the collection, examining one item at a time.
Example: Console:
Code section 3.18: A foreach loop. Output for code listing 3.18a
Monday
Tuesday
1 String[] days = {"Monday", "Tuesday", "Wednesday", "Thursday", "Friday",
2 "Saturday", "Sunday"}; Wednesday
3 Thursday
4 for (String day : days) { Friday
5 [Link](day); Saturday
6 } Sunday
Notice that the loop automatically exits after the last item in the collection has been
examined in the statement block.
Although the enhanced for loop can make code much clearer, it can't be used in some
common situations.
102
The continue and break statements
• Only access. Elements can not be assigned to, eg, not to increment each element in a
collection.
• Only single structure. It's not possible to traverse two structures at once, eg, to com-
pare two arrays.
• Only single element. Use only for single element access, eg, not to compare successive
elements.
• Only forward. It's possible to iterate only forward by single steps.
• At least Java 5. Don't use it if you need compatibility with versions before Java 5.
Example:
Code section 3.19: Using a label.
1 String s = "A test string for the switch!\nLine two of test string...";
2 outer: for (int i = 0; i < [Link](); i++) {
3 switch ([Link](i)) {
4 case '\n': break outer;
5 case ' ': break;
6 default: [Link]([Link](i));
7 }
8 }
Console:
Output for code listing 3.19a
Ateststringfortheswitch!
103
Statements
Example:
Code section 3.20: A return statement.
1 public int getAge() {
2 throw new NullPointerException();
3 }
Beware not to write statements after a throw statement which would not be executed too!
Each throw statement is ended by a semi-colon (;).
14.11 try/catch
A try/catch must at least contain the try block and the catch block:
Example:
Code section 3.21: try/catch block.
1 try {
2 // Some code
3 } catch (Exception e) {
4 // Optional exception handling
5 } finally {
6 // This code is executed no matter what
7 }
Question 3.1: How many statements are there in this class?Code listing 3.2:
[Link]
5
One statement at line 3, two statements at line 6, one statement at line 7 and one statement
at line 11.
104
15 Conditional blocks
Conditional blocks allow a program to take a different path depending on some condition(s).
These allow a program to perform a test and then take action based on the result of that
test. In the code sections, the actually executed code lines will be highlighted.
15.0.1 If
The if block executes only if the boolean expression associated with it is true. The structure
of an if block is as follows:
if (boolean expression1 ) {
statement1
statement2
...
statementn
}
Here is a double example to illustrate what happens if the condition is true and if the
condition is false:
Output for Code section 3.22
Hello!
Example: I'm a child
Code section 3.22: Two if blocks. Bye!
1 int age = 6;
2 [Link]("Hello!");
3
4 if (age < 13) {
5 [Link]("I'm a child.");
6 }
7
8 if (age > 20) {
9 [Link]("I'm an adult.");
10 }
11
12 [Link]("Bye!");
Note:
If only one statement is to be executed after an if block, it does not have to be enclosed
in curly braces. For example, if (i == 0) i = 1; is a perfectly valid portion of Java
code. This works for most control structures, such as else and while. However Oracle's
Java Code Conventionsa explicitly state that the braces should always be used.
a [Link]
105
Conditional blocks
15.0.2 If/else
The if block may optionally be followed by an else block which will execute if that boolean
expression is false. The structure of an if block is as follows:
if (boolean expression1 ) {
statement1
statement2
...
statementn
} else {
statement1bis
statement2bis
...
statementnbis
}
15.0.3 If/else-if/else
An else-if block may be used when multiple conditions need to be checked. else-if
statements come after the if block, but before the else block. The structure of an if
block is as follows:
if (boolean expression1 ) {
statement1.1
statement1.2
...
statementn
} else if (boolean expression2 ) {
statement2.1
statement2.2
...
statement2.n
} else {
statement3.1
statement3.2
...
statement3.n
}
106
try/catch
Keep in mind that only a single block will execute, and it will be the first true condition.
All the conditions are evaluated when if is reached, no matter what the result of the
condition is, after the execution of the if block:
This evaluates boolean expression1 , and if it is true then the conditional expression has
the value of expression1 ; otherwise the conditional expression has the value of expression
2.
Example:
107
Conditional blocks
Example:
Code section 3.24: Conditional expressions.
1 String answer = (p < 0.05)? "reject" : "keep";
Example:
Code section 3.25: Equivalent code.
1 String answer;
2 if (p < 0.05) {
3 answer = "reject";
4 } else {
5 answer = "keep";
6 }
15.0.5 Switch
The switch conditional statement is basically a shorthand version of writing many if...else
statements. The switch block evaluates a char, byte, short, or int (or enum, starting
in J2SE 5.0; or String, starting in J2SE 7.0), and, based on the value provided, jumps
to a specific case within the switch block and executes code until the break command is
encountered or the end of the block. If the switch value does not match any of the case
values, execution will jump to the optional default case.
The structure of a switch statement is as follows:
switch (int1 or char1 or short1 or byte1 or enum1 or String value1 ) {
case case value1 :
statement1.1
...
statement1.n
break;
case case value2 :
statement2.1
...
statement2.n
break;
default:
statementn.1
...
statementn.n
}
108
try/catch
If a case does not end with the break statement, then the next case will be checked, other-
wise the execution will jump to the end of the switch statement.
Look at this example to see how it's done:
Starting in J2SE 5.0, the switch statement can also be used with an enum value instead
of an integer.
Though enums have not been covered yet, here is an example so you can see how it's done
(note that the enum constants in the cases do not need to be qualified with the type:
109
Conditional blocks
Starting in J2SE 7.0, the switch statement can also be used with an String value instead
of an integer.
110
16 Loop blocks
Loops are a handy tool that enables programmers to do repetitive tasks with minimal effort.
Say we want a program that can count from 1 to 10, we could write the following program1 .
Code listing 3.4: [Link]
Console:
1 class Count { Output for code listing 3.4
2 public static void main(String[] args) { 1
3 [Link](”1 ”); 2
4 [Link](”2 ”); 3
5 [Link](”3 ”); 4
6 [Link](”4 ”); 5
7 [Link](”5 ”); 6
8 [Link](”6 ”); 7
9 [Link](”7 ”); 8
10 [Link](”8 ”); 9
11 [Link](”9 ”); 10
12 [Link](”10 ”);
13 }
14 }
The task will be completed just fine, the numbers 1 to 10 will be printed in the output, but
there are a few problems with this solution:
• Flexibility: what if we wanted to change the start number or end number? We would
have to go through and change them, adding extra lines of code where they're needed.
• Scalability: 10 repeats are trivial, but what if we wanted 100 or even 1000 repeats? The
number of lines of code needed would be overwhelming for a large number of iterations.
• Maintenance: where there is a large amount of code, one is more likely to make a
mistake.
• Feature: the number of tasks is fixed and doesn't change at each execution.
Using loops we can solve all these problems. Once you get you head around them they will
be invaluable to solving many problems in programming.
Open up your editing program and create a new file saved as [Link]. Now type or copy
the following code2 :
111
Loop blocks
If we run the program, the same result is produced, but looking at the code, we immediately
see the advantages of loops. Instead of executing ten different lines of code, line 5 executes
ten times. Ten lines of code have been reduced to just four. Furthermore, we may change
the number 10 to any number we like. Try it yourself, replace the 10 with your own number.
16.0.1 While
while loops are the simplest form of loop. The while loop repeats a block of code while
the specified condition is true. Here is the structure of a while loop:
The loop's condition is checked before each iteration of the loop. If the condition is false at
the start of the loop, the loop will not be executed at all. The code section 3.283 sets in
squareHigherThan200 the smallest integer whose square exceeds 200.
Example:
Code section 3.28: The smallest integer whose square exceeds 200.
1 int squareHigherThan200 = 0;
2
3 while (squareHigherThan200 * squareHigherThan200 < 200) {
4 squareHigherThan200 = squareHigherThan200 + 1;
5 }
112
try/catch
Note:
If a loop's condition will never become false, such as if the true constant is used for the
condition, said loop is known as an infinite loop. Such a loop will repeat indefinitely
unless it is brokena out of. Infinite loops can be used to perform tasks that need to
be repeated over and over again without a definite stopping point, such as updating a
graphics display.
Do... while
The do-while loop is functionally similar to the while loop, except the condition is evalu-
ated AFTER the statement executes It is useful when we try to find a data that does the
job by randomly browsing an amount of data.
do {
statement1
statement2
...
statementn
} while (boolean expression1 );
16.0.2 For
The for loop is a specialized while loop whose syntax is designed for easy iteration through
a sequence of numbers. It consists of the keyword for followed by three extra statements
enclosed in parentheses. The first statement is the variable declaration statement, which
allows you to declare one or more integer variables. The second is the condition, which is
checked the same way as the while loop. Last is the iteration statement, which is used to
increment or decrement variables, though any statement is allowed.
This is the structure of a for loop:
113
Loop blocks
Example: Console:
Code section 3.29: A for loop. Output for code listing 3.29
1
1 for (int i = 1; i <= 10; i++) { 2
2 [Link](i); 3
3 } 4
5
6
7
8
9
10
The for loop is like a template version of the while loop. The alternative code using a
while loop would be as follows:
Example:
Code section 3.30: An iteration using a while loop.
1 int i = 1;
2 while (i <= 10) {
3 [Link](i);
4 i++;
5 }
The code section 3.314 shows how to iterate with the for loop using multiple variables and
the code section 3.325 shows how any of the parameters of a for loop can be skipped. Skip
them all, and you have an infinitely repeating loop.
Example: Example:
Code section 3.31: The for loop using multiple variables. Code section 3.32: The for loop without parameter.
For-each
Arrays6 haven't been covered yet, but you'll want to know how to use the enhanced for
loop, called the for-each loop. The for-each loop automatically iterates through a list or
array and assigns the value of each index to a variable.
To understand the structure of a for-each loop, look at the following example:
114
Break and continue keywords
Example:
Code section 3.33: A for-each loop.
1 String[] sentence = {"I", "am", "a", "Java", "program."};
2 for (String word : sentence) {
3 [Link](word + " ");
4 }
Console:
Output for code section 3.33
I am a Java program.
The example iterates through an array of words and prints them out like a sentence. What
the loop does is iterate through sentence and assign the value of each index to word, then
execute the code block.
Here is the general contract of the for-each loop:
Make sure that the type of the array or list is assignable to the declared variable, or you
will get a compilation error. Notice that the loop automatically exits after the last item in
the collection has been examined in the statement block.
Although the enhanced for loop can make code much clearer, it can't be used in some
common situations.
• Only access. Elements can not be assigned to, e.g., not to increment each element in a
collection.
• Only single structure. It's not possible to traverse two structures at once, e.g., to
compare two arrays.
• Only single element. Use only for single element access, e.g., not to compare successive
elements.
• Only forward. It's possible to iterate only forward by single steps.
• At least Java 5. Don't use it if you need compatibility with versions before Java 5.
115
Loop blocks
In the code section 3.347 , the loop would print out all the numbers from 1 to 10, but we
have a check for when i equals 5. When the loop reaches its fifth iteration, it will be cut
short by the break statement, at which point it will exit the loop.
Example: Console:
Code section 3.34: An interrupted for loop. Output for code section 3.34
1
1 for (int i = 1; i <= 10; i++) { 2
2 [Link](i); 3
3 if (i == 5) { 4
4 [Link]("STOP!"); 5
5 break; STOP!
6 }
7 }
The continue keyword jumps straight to the next iteration of a loop and evaluates the
boolean expression controlling the loop. The code section 3.358 is an example of the
continue statement in action:
Example: Console:
Code section 3.35: A for loop with a skipped iteration. Output for code section 3.35
1
1 for (int i = 1; i <= 10; i++) { 2
2 if (i == 5) { 3
3 [Link]("Caught i == 5"); 4
4 continue; Caught i == 5
5 } 6
6 [Link](i); 7
7 } 8
9
10
As the break and continue statements reduce the readability of the code, it is recom-
mended to reduce their use or replace them with the use of if and while blocks. Some
IDE refactoring operations will fail because of such statements.
Question 3.2: Consider the following code:
116
Break and continue keywords
Example:
Question 3.2: Loops and conditions.
1 int numberOfItems = 5;
2 int currentItems = 0;
3 int currentCandidate = 1;
4
5 while (currentItems < numberOfItems) {
6 currentCandidate = currentCandidate + 1;
7 [Link]("Test with integer: " + currentCandidate);
8
9 boolean found = true;
10 for (int i = currentCandidate - 1; i > 1; i--) {
11
12 // Test if i is a divisor of currentCandidate
13 if ((currentCandidate % i) == 0) {
14 [Link]("Not matching...");
15 found = false;
16 break;
17 }
18
19 }
20
21 if (found) {
22 [Link]("Matching!");
23 currentItems = currentItems + 1;
24 }
25 }
26
27 [Link]("Find the value: " + currentCandidate);
Console:
Output for Question 3.2
Test with integer: 2
Matching!
Test with integer: 3
Matching!
Test with integer: 4
Not matching...
Test with integer: 5
Matching!
Test with integer: 6
Not matching...
Test with integer: 7
Matching!
Test with integer: 8
Not matching...
Test with integer: 9
Not matching...
Test with integer: 10
Not matching...
Test with integer: 11
Matching!
Find the value: 11
117
Loop blocks
The snippet is searching the 5th prime number9 , that is to say: 11. It iterates on each
positive integer from 2 (2, 3, 4, 5, 6, 7, 8, 9, 10, 11...), among them, it counts the prime
numbers (2, 3, 5, 7, 11) and it stops at the 5th one.
So the snippet first iterates on each positive integer from 2 using the while loop:
Example:
Answer 3.2.1: while loop.
1 int numberOfItems = 5;
2 int currentItems = 0;
3 int currentCandidate = 1;
4
5 while (currentItems < numberOfItems) {
6 currentCandidate = currentCandidate + 1;
7 [Link]("Test with integer: " + currentCandidate);
8
9 boolean found = true;
10 for (int i = currentCandidate - 1; i > 1; i--) {
11
12 // Test if i is a divisor of currentCandidate
13 if ((currentCandidate % i) == 0) {
14 [Link]("Not matching...");
15 found = false;
16 break;
17 }
18
19 }
20
21 if (found) {
22 [Link]("Matching!");
23 currentItems = currentItems + 1;
24 }
25 }
26
27 [Link]("Find the value: " + currentCandidate);
28
For each iteration, the current number is either a prime number or not. If it is a prime
number, the code at the left will be executed. If it is not a prime number, the code at the
right will be executed.
9 [Link]
118
Break and continue keywords
Example:
Answer 3.2.2: A prime number.
1 int numberOfItems = 5;
2 int currentItems = 0;
3 int currentCandidate = 1;
4
5 while (currentItems < numberOfItems) {
6 currentCandidate = currentCandidate + 1;
7 [Link]("Test with integer: " + currentCandidate);
8
9 boolean found = true;
10 for (int i = currentCandidate - 1; i > 1; i--) {
11
12 // Test if i is a divisor of currentCandidate
13 if ((currentCandidate % i) == 0) {
14 [Link]("Not matching...");
15 found = false;
16 break;
17 }
18
19 }
20
21 if (found) {
22 [Link]("Matching!");
23 currentItems = currentItems + 1;
24 }
25 }
26
27 [Link]("Find the value: " + currentCandidate);
Example:
Answer 3.2.3: Not a prime number.
1 int numberOfItems = 5;
2 int currentItems = 0;
3 int currentCandidate = 1;
4
5 while (currentItems < numberOfItems) {
6 currentCandidate = currentCandidate + 1;
7 [Link]("Test with integer: " + currentCandidate);
8
9 boolean found = true;
10 for (int i = currentCandidate - 1; i > 1; i--) {
11
12 // Test if i is a divisor of currentCandidate
13 if ((currentCandidate % i) == 0) {
14 [Link]("Not matching...");
15 found = false;
16 break;
17 }
18
19 }
20
21 if (found) {
22 [Link]("Matching!");
23 currentItems = currentItems + 1;
24 }
25 }
26
27 [Link]("Find the value: " + currentCandidate);
119
Loop blocks
The prime numbers are counted using currentItems. When currentItems is equal to
numberOfItems (5), the program go out of the while loop. currentCandidate contains
the last number, that is to say the 5th prime number:
Example:
Answer 3.2.4: End of the program.
1 int numberOfItems = 5;
2 int currentItems = 0;
3 int currentCandidate = 1;
4
5 while (currentItems < numberOfItems) {
6 currentCandidate = currentCandidate + 1;
7 [Link]("Test with integer: " + currentCandidate);
8
9 boolean found = true;
10 for (int i = currentCandidate - 1; i > 1; i--) {
11
12 // Test if i is a divisor of currentCandidate
13 if ((currentCandidate % i) == 0) {
14 [Link]("Not matching...");
15 found = false;
16 break;
17 }
18
19 }
20
21 if (found) {
22 [Link]("Matching!");
23 currentItems = currentItems + 1;
24 }
25 }
26
27 [Link]("Find the value: " + currentCandidate);
16.2 Labels
Labels can be used to give a name to a loop. The reason to do this is so we can break out
of or continue with upper-level loops from a nested loop.
Here is how to label a loop:
label name:loop
To break out of or continue with a loop, use the break or continue keyword followed by
the name of the loop.
For example:
120
Try... catch blocks
Example: Console:
Code section 3.36: A double for loop. Output for code section 3.36
Found number 9 at (1, 1)
1 int i, j;
2 int[][] nums = {
3 {1, 2, 5},
4 {6, 9, 7},
5 {8, 3, 4}
6 };
7
8 Outer:
9 for (i = 0; i < [Link]; i++) {
10 for (j = 0; j < nums[i].length; j++) {
11 if (nums[i][j] == 9) {
12 [Link]("Found number 9 at (" + i + ", " + j + ")");
13 break Outer;
14 }
15 }
16 }
You needn't worry if you don't understand all the code, but look at how the label is used
to break out of the outer loop from the inner loop. However, as such a code is hard to read
and maintain, it is highly recommended not to use labels.
try {
statement1.1
statement1.2
...
statement1.n
} catch (exception1 ) {
statement2.1
...
statement2.n
}
The code listing 3.611 tries to print all the arguments that have been passed to the program.
However, if there not enough arguments, it will throw an exception.
[Link]
10
20Exceptions
11 Chapter 16.0.1 on page 112
121
Loop blocks
In addition to the try and catch blocks, a finally block may be present. The finally block
is always executed, even if an exception is thrown. It may appear with or without a catch
block, but always with a try block.
Here is what a finally block looks like:
try {
statement1.1
statement1.2
...
statement1.n
} catch (exception1 ) {
statement2.1
...
statement2.n
} finally {
statement3.1
...
statement3.n
}
16.4 Examples
The code listing 3.712 receives a number as parameter and print its binary representation.
Code listing 3.7: [Link]
122
Examples
The code listing 3.813 is a simulation of playing a game called Lucky Sevens. It is a dice
game where the player rolls two dice. If the numbers on the dice add up to seven, he wins
$4. If they do not, he loses $1. The game shows how to use control flow in a program as
well as the fruitlessness of gambling.
Code listing 3.8: [Link]
1 import [Link].*;
2
3 public class LuckySevens {
4 public static void main(String[] args) {
5 Scanner in = new Scanner([Link]);
6 Random random = new Random();
7 String input;
8 int startingCash, cash, maxCash, rolls, roll;
9
10 // Loop until ”quit” is input
11 while (true) {
12 [Link](”Enter the amount of cash to start with (or
13 \”quit\” to quit): ”);
14
15 input = [Link]();
16
17 // Check if user wants to exit
18 if ([Link]().equals(”quit”)) {
19 [Link](”\tGoodbye.”);
20 [Link](0);
21 }
123
Loop blocks
22
23 // Get number
24 try {
25 startingCash = [Link](input);
26 } catch (NumberFormatException ex) {
27 [Link](”\tPlease enter a positive integer greater
28 than 0.”);
29 continue;
30 }
31
32 // You have to start with some money!
33 if (startingCash <= 0) {
34 [Link](”\tPlease enter a positive integer greater
35 than 0.”);
36 continue;
37 }
38
39 cash = startingCash;
40 maxCash = cash;
41 rolls = 0;
42 roll = 0;
43
44 // Here is the game loop
45 for (; cash > 0; rolls++) {
46 roll = [Link](6) + 1;
47 roll += [Link](6) + 1;
48
49 if (roll == 7)
50 cash += 4;
51 else
52 cash -= 1;
53
54 if (cash > maxCash)
55 maxCash = cash;
56 }
57
58 [Link](”\tYou start with $” + startingCash + ”.\n”
59 + ”\tYou peak at $” + maxCash + ”.\n”
60 + ”\tAfter ” + rolls + ” rolls, you run out of cash.”);
61 }
62 }
63 }
124
17 Boolean expressions
Boolean values are values that evaluate to either true or false, and are represented by the
boolean data type. Boolean expressions are very similar to mathematical expressions, but
instead of using mathematical operators such as ”+” or ”-”, you use comparative or boolean
operators such as ”==” or ”!”.
Comparative operators can be used on any primitive types (except boolean), but only
the ”equals” and ”does not equal” operators work on objects. This is because the less-
than/greater-than operators cannot be applied to objects, but the equivalency operators
can.
125
Boolean expressions
Note:
Specifically, the == and != operators test whether both variables point to the same
object. Objects will be covered later in the tutorial, in the ”Classes, Objects, and
Typesa ” module.
1 [Link]
126
Boolean operators
a !a
true false
false true
a b a && b a || b a^b
true true true true false
true false false true true
false true false true true
false false false false false
2 [Link]
127
Boolean expressions
To disable this property, you can use & instead of && and | instead of || but it's not rec-
ommended.
For the bitwise operations on & and |, see Arithmetic expressions3 .
[Link]
3
20bitwise%20operators%20within%20Java
128
18 Variables
In the Java programming language, the words field and variable are both one and the
same thing. Variables are devices that are used to store data, such as a number, or a string
of character data.
1 [Link]
2 [Link]
3 [Link]
4 Chapter 18.8 on page 135
129
Variables
In the code listing 3.95 , are examples of all four kinds of variables.
• Instance variables: These are variables that are used to store the state of an object
(for example, id). Every object created from a class definition would have its own copy
of the variable. It is valid for and occupies storage for as long as the corresponding object
is in memory.
• Class variables: These variables are explicitly defined within the class-level scope with
a static modifier (for example, isClassUsed). No other variables can have a static
modifier attached to them. Because these variables are defined with the static modifier,
there would always be a single copy of these variables no matter how many times the
class has been instantiated. They live as long as the class is loaded in memory.
• Parameters or Arguments: These are variables passed into a method signature (for
example, parameter). Recall the usage of the args variable in the main method. They
are not attached to modifiers (i.e. public, private, protected or static) and they
can be used everywhere in the method. They are in memory during the execution of the
method and can't be used after the method returns.
• Local variables: These variables are defined and used specifically within the method-
level scope (for example, currentValue) but not in the method signature. They do not
have any modifiers attached to it. They no longer exist after the method has returned.
Question 3.5: Consider the following code:
Question 3.5: [Link]
In the example above, we created five variables: a, b, c, d and e. All these variables have
the same data type int (integer). However, can you tell what kind of variable each one is?
• a and b are instance variables;
• c is a class variable;
130
Creating variables
Variables and all the information they store are kept in the computer's memory for access.
Think of a computer's memory as a table of data — where each cell corresponds to a
variable.
Upon creating a variable, we basically create a new address space and give it a unique name.
Java goes one step further and lets you define what you can place within the variable — in
Java parlance you call this a data type. So, you essentially have to do two things in order
to create a variable:
• Create a variable by giving it a unique name; and,
• Define a data type for the variable.
The following code demonstrates how a simple variable can be created. This process is
known as variable declaration.
131
Variables
Example:
Code section 3.40: A simple variable declaration.
1 int a;
Example:
Code section 3.41: Variable declaration and assignment operation (on differ-
ent lines).
1 int a;
2 a = 10;
Java provides programmers with a simpler way of combining both variable declaration and
assignment operation in one line. Consider the following code:
Example:
Code section 3.42: Variable declaration and assignment operation (on the
same line).
1 int a = 10;
Example:
Code section 3.43: Ungrouped declarations.
1 int a;
2 int b;
3 String c;
4 a = 10;
5 b = 20;
6 c = "some text";
There are various ways by which you can streamline the writing of this code. You can group
the declarations of similar data types in one statement, for instance:
132
Identifiers
Example:
Code section 3.44: Grouped declarations.
1 int a, b;
2 String c;
3 a = 10;
4 b = 20;
5 c = "some text";
Alternatively, you can further reduce the syntax by doing group declarations and assign-
ments together, as such:
Example:
Code section 3.45: Grouped declarations and assignments.
1 int a = 10, b = 20;
2 String c = "some text";
18.6 Identifiers
Although memory spaces6 have their own addresses — usually a hash number such as
0xCAD3, etc. — it is much easier to remember a variable's location in the memory if we can
give it a recognizable name. Identifiers are the names we give to our variables. You can
name your variable anything like aVariable, someVariable, age, someonesImportantData
, etcetera. But notice: none of the names we described here has a space within it. Hence,
it is pretty obvious that spaces aren't allowed in variable names. In fact, there are a lot of
other things that are not allowed in variable names. The things that are allowed are:
• Characters A to Z and their lower-case counterparts a to z.
• Numbers 0 to 9. However, numbers should not come at the beginning of a variable's
name.
• And finally, special characters that include only $ (dollar sign) and _ (underscore).
Question 3.6: Which of the ones below are proper variable identifiers?
1. f_name
2. lastname
3. someones name
4. $SomeoneElsesName
5. 7days
6. TheAnswerIs42
I can tell you that 3 and 5 are not the right way to do things around here, the rest are
proper identifiers.
Any valid variable names might be correct but they are not always what you should be
naming your variables for a few reasons as listed below:
• The name of the variable should reflect the value within them.
6 [Link]
133
Variables
• The identifier should be named following the naming guidelines or conventions for doing
so. We will explain that in a bit.
• The identifier shouldn't be a nonsense name like lname, you should always name it prop-
erly: lastName is the best way of naming a variable.
Example:
Code section 3.46: Unknown process.
1 int a = 24;
2 int b = 365;
3 int c = a * b;
Do you know what this program does? Well, it multiplies two values. That much you
guessed right. But, do you know what those values are? Exactly, you don't. Now consider
this code:
Example:
Code section 3.47: Time conversion.
1 int age = 24;
2 int daysInYear = 365;
3 int ageInDays = age * daysInYear;
Now you can tell what's happening, can't you? However, before we continue, notice the
case of the variables. If a word contains CAPITAL LETTERS, it is in UPPER CASE.
If a word has small letters, it is in lower case. Both cases in a word renders it as mIxEd
CaSe.
The variables we studied so far had a mixed case. When there are two or more words
making up the names of a variable, you need to use a special case called the camel-case.
Just like the humps of a camel, your words need to stand out. Using this technique, the
words first and name could be written as either firstName or FirstName.
The first instance, firstName is what we use as the names of variables. Remember though,
firstName is not the same as FirstName because Java is case-sensitive. Case-sensitive
basically implies that the case in which you wrote one word is the case you have to call
that word in when using them later on. Anything other than that is not the same as you
intended. You'll know more as you progress. You can hopefully tell now why the variables
you were asked to identify weren't proper.
134
Literals (values)
Example:
Code section 3.48: Literals.
1 int age = 24;
2 long bankBalance = 20000005L;
By now, we've only seen how numbers work in assignment statements. Let's look at data
types other than numbers. Characters are basically letters of the English alphabet. When
writing a single character, we use single quotes to encapsulate them. Take a look at the
code below:
Example:
Code section 3.49: Character.
1 char c = 'a';
Why, you ask? Well, the explanation is simple. If written without quotes, the system
would think it's a variable identifier. That's the very distinction you have to make when
differentiating between variables and their literal values. Character data types are a bit
unusual. First, they can only hold a single character. What if you had to store a complete
name within them, say John, would you write something like:
Example:
Code section 3.50: Character list.
1 char firstChar = 'J';
2 char secondChar = 'o';
3 char thirdChar = 'h';
4 char fourthChar = 'n';
Now, that's pathetic. Thankfully, there's a data type that handles large number of charac-
ters, it's called a String. A string can be initialized as follows:
Example:
Code section 3.51: String.
1 String name = "John";
Notice, the use of double quotation marks instead of single quotation marks. That's the
only thing you need to worry about.
135
19 Primitive Types
Primitive types are the most basic data types available within the Java language. There
are 8: boolean, byte, char, short, int, long, float and double. These types serve as
the building blocks of data manipulation in Java. Such types serve only one purpose —
containing pure, simple values of a kind. Because these data types are defined into the Java
type system by default, they come with a number of operations predefined. You can not
define a new operation for such primitive types. In the Java type system, there are three
further categories of primitives:
• Numeric primitives: short, int, long, float and double. These primitive data types
hold only numeric data. Operations associated with such data types are those of simple
arithmetic1 (addition, subtraction, etc.) or of comparisons2 (is greater than, is equal to,
etc.)
• Textual primitives: byte and char. These primitive data types hold characters (that
can be Unicode3 alphabets or even numbers). Operations associated with such types are
those of textual manipulation (comparing two words, joining characters to make words,
etc.). However, byte and char can also support arithmetic operations.
• Boolean and null primitives: boolean and null.
All the primitive types have a fixed size. Thus, the primitive types are limited to a range of
values. A smaller primitive type (byte) can contain less values than a bigger one (long).
Category Types Size (bits) Minimum Value Maximum Precision Example
Value
byte 8 -128 127 From +127 to byte b = 65;
-128
Integer char 16 0 216 -1 All Unicode char c = 'A';
characters4 char c = 65;
short 16 -215 215 -1 From +32,767 to short s = 65;
-32,768
int 32 -231 231 -1 From int i = 65;
+2,147,483,647
to -2,147,483,648
long 64 -263 263 -1 From long l = 65L;
+9,223,372,036,854,775,807
to -
9,223,372,036,854,775,808
float 32 2-149 (2-2-23 )·2127 From float f = 65f;
Floating-point
3.402,823,5 E+38
to 1.4 E-45
double 64 2-1074 (2-2-52 )·21023 From double d =
1.797,693,134,862,315,7 E+308
65.55;
to 4.9 E-324
boolean – – – false, true boolean b =
Other
true;
void – – – – –
1 [Link]
2 Chapter 16.4 on page 124
3 [Link]
4 According to STR01-J. Do not assume that a Java char fully represents a Unicode code point5 . Carnegie
Mellon University - Software Engineering Institute. Retrieved 27 Nov 2018 , not all Unicode characters
fit into a 16 bit representation
137
Primitive Types
1 int i = Integer.MAX_VALUE;
2 [Link](i);
3 i = i + 1;
4 [Link](i);
5 [Link](Integer.MIN_VALUE);
As Java is strongly typed, you can't assign a floating point number (a number with a decimal
point) to an integer variable:
1 Warning
Code section 3.53: Setting a floating point number as a value to an int
(integer) type.
1 int age;
2 age = 10.5;
A primitive type should be set by an appropriate value. The primitive types can be initial-
ized with a literal. Most of the literals are primitive type values, except String Literals6 ,
which are instance of the String class.
6 [Link]
7 As of edit (11 December 2013), the Great Internet Mersenne Prime Search ^{[Link]
org/wiki/Great%20Internet%20Mersenne%20Prime%20Search} project has so far identified the largest
prime number as being 17,425,170 digits long. Prime numbers are valuable to cryptologists as the bigger
the number, the securer they can make their data encryption logic using that particular number.
8 [Link]
9 Gemini 5 landed 130 kilometers short of its planned Pacific Ocean landing point due to a software
error. The Earth's rotation rate had been programmed as one revolution per solar day ^{https:
//[Link]/wiki/solar%20time} instead of the correct value, one revolution per sidereal day
^{[Link] .
10 A program used in their design used an arithmetic sum of variables when it should have used the sum of
their absolute values. (Evars Witt, ”The Little Computer and the Big Problem”, AP Newswire, 16 March
138
Numbers in computer science
data, being computed at the time the errors occurred, was numeric. Out of past experi-
ence, Java came bundled with revised type checking for numeric data and put significant
emphasis on correctly identifying different types of it. You must recognise the importance
of numeric data when it comes to programming.
Numbers are stored in memory using a binary system. The memory is like a grid of cells:
Each cell can contain a binary digit (shortened to bit), that is to say, zero or one:
0 1 1 0 0 1 0 1
Actually, each cell does contain a binary digit, as one bit is roughly equivalent to 1 and
an empty cell in the memory signifies 0. A single binary digit can only hold two possible
values: a zero or a one.
Memory state Gives
0 → 0
1 → 1
Multiple bits held together can hold multiple permutations — 2 bits can hold 4 possible
values, 3 can hold 8, and so on. For instance, the maximum number 8 bits can hold (
11111111 in binary) is 255 in the decimal system. So, the numbers from 0 to 255 can fit
within 8 bits.
Memory state Gives
0 0 0 0 0 0 0 0 → 0
0 0 0 0 0 0 0 1 → 1
0 0 0 0 0 0 1 0 → 2
0 0 0 0 0 0 1 1 → 3
...
...
1 1 1 1 1 1 1 1 → 255
It is all good, but this way, we can only host positive numbers (or unsigned integers). They
are called unsigned integers. Unsigned integers are whole number values that are all positive
and do not attribute to negative values. For this very reason, we would ask one of the 8
bits to hold information about the sign of the number (positive or negative). This leaves us
with just 7 bits to actually count out a number. The maximum number that these 7 bits
can hold (1111111) is 127 in the decimal system.
Positive numbers
Memory state Gives
0 0 0 0 0 0 0 0 → 0
0 0 0 0 0 0 0 1 → 1
0 0 0 0 0 0 1 0 → 2
0 0 0 0 0 0 1 1 → 3
1979. See also Peter Neumann, ”An Editorial on Software Correctness and the Social Process” Software
Engineering Notes, Volume 4(2), April 1979, page 3)
139
Primitive Types
...
... ...
0 1 1 1 1 1 1 1 → 127
Negative numbers
Memory state Gives
1 0 0 0 0 0 0 0 → -128
1 0 0 0 0 0 0 1 → -127
1 0 0 0 0 0 1 0 → -126
1 0 0 0 0 0 1 1 → -125
...
... ...
1 1 1 1 1 1 1 1 → -1
Altogether, using this method, 8 bits can hold numbers ranging from -128 to 127 (including
zero) — a total of 256 numbers. Not a bad pay-off one might presume. The opposite to an
unsigned integer is a signed integer that have the capability of holding both positive and
negative values.
But, what about larger numbers. You would need significantly more bits to hold larger
numbers. That's where Java's numeric types come into play. Java has multiple numeric
types — their size dependent on the number of bits that are at play.
In Java, numbers are dealt with using data types specially formulated to host numeric data.
But before we dive into these types, we must first set some concepts in stone. Just like you
did in high school (or even primary school), numbers in Java are placed in clearly distinct
groups and systems. As you'd already know by now, number systems includes groups like
the integer numbers (0, 1, 2 ... ∞); negative integers (0, -1, -2 ... -∞) or even real and
rational numbers (value of Pi11 , ¾, 0.333~, etcetera). Java simply tends to place these
numbers in two distinct groups, integers (-∞... 0 ... ∞) and floating point numbers (any
number with decimal points or fractional representation). For the moment, we would only
look into integer values as they are easier to understand and work with.
11 [Link]
140
Integer numbers and floating point numbers
errors that might occur out of the programmed code. A much more sensible choice for such
a numeric operation might be a short. Now, why couldn't they make just one data type
to hold all kinds of numbers? Let's explore why.
When you tell a program you need to use an integer, say even a byte, the Java program
allocates a space in the memory. It allocates whole 8 bits of memory. Where it wouldn't
seem to matter for today's memory modules that have place for almost a dozen trillion
such bits, it matters in other cases. Once allocated that part of the memory gets used
and can only be claimed back after the operation is finished. Consider a complicated Java
program where the only data type you'd be using would be long integers. What happens
when there's no space for more memory allocation jobs? Ever heard of the Stack Overflow
error12 s. That's exactly what happens — your memory gets completely used up and fast.
So, choose your data types with extreme caution.
Enough talk, let's see how you can create a numeric type. A numeric type begins with the
type's name (short, int, etc.) and then provides with a name for the allocated space in the
memory. Following is how it's done. Say, we need to create a variable to hold the number
of days in a year.
Example:
Code section 3.54: Days in a year.
1 short daysInYear = 365;
Here, daysInYear is the name of the variable that holds 365 as its value, while short is
the data type for that particular value. Other uses of integer data types in Java might see
you write code such as this given below:
Example:
Code section 3.55: Integer data types in Java.
1 byte maxByte = 127;
2 short maxShort = 32767;
3 int maxInt = 2147483647;
4 long maxLong = 9223372036854775807L;
Example:
Code section 3.56: Correct floating point declaration and assignment.
1 double age = 10.5;
12 [Link]
13 Chapter 19 on page 137
141
Primitive Types
Why not float, you say? If we'd used a float, we would have to append the number with
a f as a suffix, so 10.5 should be 10.5f as in:
Example:
Code section 3.57: The correct way to define floating point numbers of type
float.
1 float age = 10.5f;
Example:
Question 3.7: Primitive type assignments.
1 ...
2
3 a = false;
4 b = 3.2;
5 c = 35;
6 d = -93485L;
7 e = 'q';
These are five variables. There are a long, a byte, a char, a double and a boolean.
Retrieve the type of each one.
Example:
Answer 3.7: Primitive type assignments and declarations.
1 boolean a;
2 double b;
3 byte c;
4 long d;
5 char e;
6
7 a = false;
8 b = 3.2;
9 c = 35;
10 d = -93485L;
11 e = 'q';
• a can only be the boolean because only a boolean can handle boolean values.
• e can only be the char because only a char can contain a character.
• b can only be the double because only a double can contain a decimal number here.
• d is the long because a byte can not contain such a low value.
• c is the remaining one so it is the byte.
142
Notes
• Implicit: casting operation is not required; the magnitude of the numeric value is always
preserved. However, precision may be lost when converting from integer to floating point
types
• Explicit: casting operation required; the magnitude of the numeric value may not be
preserved
Example:
Code section 3.58: Implicit casting (int is converted to long,casting is not
needed).
1 int i = 65;
2 long l = i;
Example:
Code section 3.59: Explicit casting (long is converted to int,casting is needed).
1 long l = 656666L;
2 int i = (int) l;
The following table shows the conversions between primitive types, it shows the casting
operation for explicit conversions:
from byte from char from short from int from long from float from double from boolean
to byte - (byte) (byte) (byte) (byte) (byte) (byte) N/A
to char - (char) (char) (char) (char) (char) N/A
to short (short) - (short) (short) (short) (short) N/A
to int - (int) (int) (int) N/A
to long - (long) (long) N/A
to float - (float) N/A
to double - N/A
to boolean N/A N/A N/A N/A N/A N/A N/A -
Unlike C, C++ and similar languages, Java can't represent false as 0 or null and can't
represent true as non-zero. Java can't cast from boolean to a non-boolean primitive data
type, or vice versa.
For non primitive types:
to Integer to Float to Double to String to Array
Integer - (float)x (double)x [Link]() new int[] {x}
[Link]() [Link](x)
Float [Link]- - (double)x [Link]() new float[] {x}
imalFor-
mat(”#”).for-
mat(x)
Double [Link]- [Link]- - [Link]() new double[] {x}
imalFor- imalFor-
mat(”#”).for- mat(”#”).for-
mat(x) mat(x)
String [Link](x) [Link](x) [Link]- - new String[] {x}
ble(x)
Array x[0] x[0] x[0] [Link](x) -
19.5 Notes
143
20 Arithmetic expressions
In order to do arithmetic in Java, one must first declare at least one variable. Typically one
declares a variable and assigns it a value before any arithmetic is done. Here's an example
of declaring an integer variable:
Example:
Code section 3.59: Variable assignation.
1 int x = 5;
After creating a variable, one can manipulate its value by using Java's operators: +
(addition), - (subtraction), * (multiplication), / (integer division), % (modulo or remain-
der1 ), ++ (pre- & postincrement by one), -- (pre- & postdecrement by one).
1 [Link]
145
Arithmetic expressions
146
Notes
The division operator rounds towards zero: 5/2 is 2, and -5/2 is -2. The remainder operator
has the same sign as the left operand; it is defined such that ((a/b)*b) + (a%b) is always
equal to a. The preincrement, predecrement, postincrement, and postdecrement operators
are special: they also change the value of the variable, by adding or subtracting one.
The only difference is that preincrement/decrement returns the new value of the variable;
postincrement returns the original value of the variable.
Question 3.8: Consider the following code:
Question 3.8: [Link]
Console:
Output for Question 3.8
7
x = x + 10; => 20
x = 2 * x; => 40
x = x - 19; => 21
x = x / 3; => 7
When using several operators in the same expression, one must consider Java's order of
precedence. Java uses the standard PEMDAS (Parenthesis, Exponents, Multiplication and
Division, Addition and Subtraction) order. When there are multiple instances of the same
precedence, Java reads from left to right. Consider what the output of the following code
would be:
147
Arithmetic expressions
Example: Console:
Code section 3.60: Several operators. Console for Code section 3.60
56
1 [Link](10*5 + 100/10 - 5 + 7%2);
The following chart shows how Java would compute this expression:
Figure 3.1: Computation of an arithmetic expression in the Java programming language
Figure 58
148
Using bitwise operators within Java
Besides performing mathematical functions, there are also operators to assign numbers to
variables (each example again uses the variable initialized as x = 5):
Code listing 3.11: [Link]
Console:
1 public class Assignments { Console for Code listing 3.11
2 public static void main(String[] args) { Assignment (x = 3) : 3
3 int x = 5; Assign x plus another integer to itself (x += 5): 10
4 x = 3; Assign x minus another integer to itself (x -
5 [Link](”Assignment = 4):(x1 =
3) Assign x multiplied by another integer to itself (x *= 6): 30
6 : ” + x); Assign x divided by another integer to itself (x /= 5): 1
7
8 x = 5;
9 x += 5;
10 [Link](”Assign x plus another integer to itself (x
+=
11 5): ” + x);
12
13 x = 5;
14 x -= 4;
15 [Link](”Assign x minus another integer to itself (x
-=
16 4): ” + x);
17
18 x = 5;
19 x *= 6;
20 [Link](”Assign x multiplied by another integer to itself (x
*=
21 6): ” + x);
22
23 x = 5;
24 x /= 5;
25 [Link](”Assign x divided by another integer to itself (x
/=
26 5): ” + x);
27 }
28 }
Besides these logical bitwise functions, there are also operators to assign numbers to vari-
ables (x = -5):
149
Arithmetic expressions
The shift operators are used to shift the bits to the left or right, which is also a quick way
to multiply/divide by two:
Operator Function Value of Example Example output Value of
x before input x after
<< Logical shift left -15 x << 2 -60 -15
>> Arithmetic shift right -15 x >> 3 -2 -15
>>> Logical shift right -15 x >>> 3 -15
2,305,843,009,213,693,937
(64 bit)
150
21 Literals
Java Literals are syntactic representations of boolean, character, numeric, or string data.
Literals provide a means of expressing specific values in your program. For example, in the
following statement, an integer variable named count is declared and assigned an integer
value. The literal 0 represents, naturally enough, the value zero.
Example:
Code section 3.61: Numeric literal.
1 int count = 0;
The code section 3.621 contains two number literals followed by two boolean literals at line
1, one string literal followed by one number literal at line 2, and one string literal followed
by one real number literal at line 3:
Example:
Code section 3.62: Literals.
1 (2 > 3) ? true : false;
2 "text".substring(2);
3 [Link]("Display a hard coded float: " + 37.19f);
151
Literals
1. As decimal numbers such as 1995, 51966. Negative decimal numbers such as -42 are
actually expressions consisting of the integer literal with the unary negation operation
-.
2. As octal numbers, using a leading 0 (zero) digit and one or more additional octal
digits (digits between 0 and 7), such as 077. Octal numbers may evaluate to negative
numbers; for example 037777777770 is actually the decimal value -8.
3. As hexadecimal numbers, using the form 0x (or 0X) followed by one or more hexadec-
imal digits (digits from 0 to 9, a to f or A to F). For example, 0xCAFEBABEL is
the long integer 3405691582. Like octal numbers, hexadecimal literals may represent
negative numbers.
4. Starting in J2SE 7.0, as binary numbers, using the form 0b (or 0B) followed by one or
more binary digits (0 or 1). For example, 0b101010 is the integer 42. Like octal and
hex numbers, binary literals may represent negative numbers.
By default, the integer literal primitive type is int. If you want a long, add a letter el
suffix (either the character l or the character L) to the integer literal. This suffix denotes
a long integer rather than a standard integer. For example, 3405691582L is a long integer
literal. Long integers are 8 bytes in length as opposed to the standard 4 bytes for int. It is
best practice to use the suffix L instead of l to avoid confusion with the digit 1 (one) which
looks like l in many fonts: 200l 6= 2001. If you want a short integer literal, you have to
cast it.
Starting in J2SE 7.0, you may insert underscores between digits in a numeric literal. They
are ignored but may help readability by allowing the programmer to group digits.
Example:
Code section 3.63: Floating point literals.
1 double decimalNumber = 5.0;
2 decimalNumber = 89d;
3 decimalNumber = 0.5;
4 decimalNumber = 10f;
5 decimalNumber = 3.14159e0;
6 decimalNumber = 2.718281828459045D;
7 decimalNumber = 1.0e-6D;
152
String Literals
Within string and character literals, the backslash character can be used to escape special
characters, such as unicode escape sequences3 , or the following special characters:
153
Literals
String literals may not contain unescaped newline or linefeed characters. However, the Java
compiler will evaluate compile time expressions, so the following String expression results
in a string with three lines of text:
Example:
Code section 3.64: Multi-line string.
1 String text = "This is a String literal\n"
2 + "which spans not one and not two\n"
3 + "but three lines of text.\n";
21.4 null
null is a special Java literal which represents a null value: a value which does not refer to
any object. It is an error to attempt to dereference the null value — Java will throw a
NullPointerException. null is often used to represent uninitialized state.
Example: Console:
Code section 3.65: Concatenation operations. Console for Code section 3.65
120? 49248
1 int > 2 int zero = '0';
3
4 [Link]("120? " + one + '2' + zero);
The unexpected results arise because ’1’ and ’0’ are converted twice. The expression is
concatenated as such:
"120? " + one + '2' + zero
"120? " + 49 + '2' + 48
"120? 49" + '2' + 48
154
Mixed Mode Operations
"120? 492" + 48
"120? 49248"
1. one and zero are integers. So they store integer values. The integer value of ’1’ is 49
and the integer value of ’0’ is 48.
2. So the first concatenation concatenates 120? and 49. 49 is first converted into String,
yielding 49 and the concatenation returns the string 120? 49.
3. The second concatenation concatenates 120? 49 and ’2’. ’2’ is converted into the
String 2 and the concatenation returns the string 120? 492.
4. The concatenation between 120? 492 and ’0’ returns the string 120? 49248.
The code section 664 yields the desired result:
Example: Console:
Code section 3.66: Correct primitive type. Console for Code section 3.66
120? 120
1 char > 2 char zero = '0';
3
4 [Link]("120? " + one + '2' + zero);
Example: Console:
Question 3.9: New concatenation operations. Console for Question 3.9
3? 147
1 int 102? 10020
2 int zero = '0'; 102? 150
3
4 [Link](" 3? " + (one + '2' + zero));
5 [Link]("102? " + 100 + '2' + 0);
6 [Link]("102? " + (100 + '2' + 0));
155
Literals
"102? 1002" + 0
"102? 10020"
156
22 Methods
Methods are how we communicate with objects. When we invoke or call a method we are
asking the object to carry out a task. We can say methods implement the behaviour of
objects. For each method we need to give a name, we need to define its input parameters
and we need to define its return type. We also need to set its visibility1 (private, protected
or public). If the method throws a checked exception, that needs to be declared as well. It
is called a method definition. The syntax of method definition is:
1 MyClass {
2 ...
3 public ReturnType methodName(ParamOneType parameter1, ParamTwoType
parameter2)
4 {
5 ...
6 return returnValue;
7 }
8 ...
9 }
We can declare that the method does not return anything using the void Java keyword.
For example:
Example:
Code section 3.67: Method without returned data.
1 private void methodName(String parameter1, String parameter2) {
2 ...
3 return;
4 }
When the method returns nothing, the return keyword at the end of the method is optional.
When the execution flow reaches the return keyword, the method execution is stopped and
the execution flow returns to the caller method. The return keyword can be used anywhere
in the method as long as there is a way to execute the instructions below:
1 Warning
Code section 3.68: return keyword location.
157
Methods
In the code section 3.682 , the return keyword at line 5 is well placed because the instructions
below can be reached when a is negative or equal to 0. However, the return keyword at
line 8 is badly placed because the instructions below can't be reached.
Question 3.9: Consider the following code:
Example:
Question 3.9: Compiler error.
1 private int myMethod(int a, int b, boolean c) {
2 b = b + 2;
3 if (a > 0) {
4 a = a + b;
5 return a;
6 } else {
7 a = 0;
8 }
9 }
Example:
Answer 3.9: Compiler error.
1 private int myMethod(int a, int b, boolean c) {
2 b = b + 2;
3 if (a > 0) {
4 a = a + b;
5 return a;
6 } else {
7 a = 0;
8 }
9 }
The method is supposed to return a int but when a is negative or equal to 0, it returns
nothing.
158
Parameter passing
Example:
Code section 3.69: A method modifying a variable.
1 private void modifyValue(int number) {
2 number += 1;
3 }
Example: Console:
Code section 3.70: Passing primitive value to method. Output for Code section 3.70
0
1 int i = 0;
2 modifyValue(i);
3 [Link](i);
As you can see in code section 3.704 , the modifyValue() method has not modified the value
of i.
[Link] ⇒ ”James”
[Link] ⇒ ”Gosling”
[Link] ⇒ ”May 19”
159
Methods
Example:
Code section 3.71: A method modifying an object.
1 private void modifyObject(FirstClass anObject) {
2 [Link]("Susan");
3 }
Example: Console:
Code section 3.72: Passing reference value to method. Output for Code section 3.72
Susan
1 FirstClass object = new FirstClass();
2 [Link]("Christin");
3
4 modifyObject(object);
5
6 [Link]([Link]());
The name has changed because the method has changed the object itself and not the
reference. Now take a look at the other example:
Example:
Code section 3.73: A method modifying an object reference.
1 private void modifyObject(FirstClass anObject) {
2 anObject = new FirstClass();
3 [Link]("Susan");
4 }
Example: Console:
Code section 3.74: Passing reference value to method. Output for Code section 3.74
Christin
1 FirstClass object = new FirstClass();
2 [Link]("Christin");
3
4 modifyObject(object);
5
6 [Link]([Link]());
The name has not changed because the method has changed the reference and not the
object itself. The behavior is the same as if the method was in-lined and the parameters
were assigned to new variable names:
160
Variable argument list
Example: Console:
Code section 3.75: In-lined method. Output for Code section 3.75
Christin
1 FirstClass object = new FirstClass();
2 [Link]("Christin");
3
4 // Start of the method
5 FirstClass anObject = object;
6 anObject = new FirstClass();
7 [Link]("Susan");
8 // End of the method
9
10 [Link]([Link]());
Example:
Code section 3.76: A method using vararg parameters.
1 public void drawPolygon(Point... points) {
2 //…
3 }
When calling the method, a programmer can simply separate the points by commas, without
having to explicitly create an array6 of Point objects. Within the method, the points can
be referenced as points[0], points[1], etc. If no points are passed, the array has a length
of zero.
A method can have both normal parameters and a variable parameter but the variable
parameter must always be the last parameter. For instance, if the programmer is required
to use a minimum number of parameters, those parameters can be specified before the
variable argument:
Example:
Code section 3.77: Variable arguments.
1 // A polygon needs at least three points.
2 public void drawPolygon(Point p1, Point p2, Point p3, Point... otherPoints) {
3 //…
4 }
5 [Link]
6 Chapter 26.6 on page 227
161
Methods
In the above example the getPersonInfoById method returns an object reference that
contains both values of the name and the age. See below how you may use that object:
162
Special method, the constructor
Example:
Code section 3.78: Retrieving the values.
1 MyObject object = new MyObject();
2 [Link] person = [Link](102);
3
4 [Link]("Person Name=" + [Link]());
5 [Link]("Person Age =" + [Link]());
Example:
Question 3.10: Compiler error.
1 private int myMethod(int a, int b, String c) {
2 if (a > 0) {
3 c = "";
4 return c;
5 }
6 int b = b + 2;
7 return b;
8 }
Example:
Answer 3.10: Compiler error.
1 private int myMethod(int a, int b, String c) {
2 if (a > 0) {
3 c = "";
4 return c;
5 }
6 int b = b + 2;
7 return b;
8 }
The method is supposed to return a int but at line 4, it returns c, which is a String.
163
Methods
6 }
7}
Example:
Code section 3.79: Static method.
1 Integer i = [Link]("10");
The static keyword makes attributes instance-agnostic. This means that you cannot refer-
ence a static attribute of a single object (because such a specific object attribute doesn't
exist). Instead, only one instance of a static attribute exists, whether there is one object in
the JVM or one hundred. Here is an example of using a static attribute in a static method:
Example:
Code section 3.80: Static attribute.
1 private static int count = 0;
2
3 public static int getNewInteger() {
4 return count++;
5 }
You can notice that when you use [Link](), out is a static attribute of the
System class. A static attribute is related to a class, not to any object instance. This is
how Java achieves one universal output stream that we can use to print output. Here is a
more complex use case:
Code listing 3.14: A static attribute.
Console:
1 public class MyProgram { Output for Code listing 3.14
2 4
3 public static int count = 0;
4
5 public static void main (String[] args) {
6 [Link]++;
7
8 MyProgram program1 = new MyProgram();
9 [Link]++;
10
11 MyProgram program2 = new MyProgram();
12 [Link]++;
13
14 new MyProgram().count++;
15 [Link]([Link]);
16 }
17 }
164
Static methods
7 [Link]
8 Chapter 37.2 on page 278
165
23 API/[Link]
String is a class built into the Java language defined in the [Link] package. It rep-
resents character strings. Strings are ubiquitous in Java. Study the String class and its
methods carefully. It will serve you well to know how to manipulate them skillfully. String
literals1 in Java programs, such as ”abc”, are implemented as instances of this class like this:
Example:
Code section 3.81: String example.
1 String str = "This is string literal";
On the right hand side a String object is created represented by the string literal. Its object
reference is assigned to the str variable.
23.1 Immutability
Strings are immutable; that is, they cannot be modified once created. Whenever it looks as
if a String object was modified actually a new String object was created. For instance, the
[Link]() method returns the string with leading and trailing whitespace removed.
Actually, it creates a new trimmed string and then returns it. Pay attention on what
happens in Code section 3.822 :
Example: Console:
Code section 3.82: Immutability. Output for Code section 3.82
Java is great.
1 String badlyCutText = " Java is great. "; Java is great.
2 [Link](badlyCutText);
3
4 [Link]();
5 [Link](badlyCutText);
The trim() method call does not modify the object so nothing happens. It creates a new
trimmed string and then throws it away.
167
API/[Link]
Example: Console:
Code section 3.83: Assignment. Output for Code section 3.83
Java is great.
1 String badlyCutText = " Java is great. Java is great.
";
2 [Link](badlyCutText);
3
4 badlyCutText = [Link]();
5 [Link](badlyCutText);
The returned string is assigned to the variable. It does the job as the trim() method has
created a new String instance.
23.2 Concatenation
The Java language provides special support for the string concatenation with operator +:
Example: Console:
Code section 3.84: Examples of concatenation. Output for Code section 3.84
First part
1 [Link]("First part"); second part
2 [Link](" second part"); First part second part
3 String str = "First part" + " second part";
4 [Link](str);
The concatenation is not always processed at the same time. Raw string literals3 concate-
nation is done at compile time, hence there is a single string literal in the byte code of the
class. Concatenation with at least one object is done at runtime.
+ operator can concatenate other objects with strings. For instance, integers will be con-
verted to strings before the concatenation:
Example: Console:
Code section 3.85: Concatenation of integers. Output for Code section 3.85
Age=25
1 [Link]("Age=" + 25);
Each Java object has the String toString() inherited from the Object class. This
method provides a way to convert objects into Strings. Most classes override the default
behavior to provide more specific (and more useful) data in the returned String:
168
Using StringBuilder/StringBuffer to concatenate strings
Example: Console:
Code section 3.86: Concatenation of objects. Output for Code section 3.86
Age=31
1 [Link]("Age=" + new Integer(31));
Example:
Code section 3.87: Raw concatenation.
1 public String convertToString(Collection<String> words) {
2 String str = "";
3 // Loops through every element in words collection
4 for (String word : words) {
5 str = str + word + " ";
6 }
7 return str;
8 }
On the + operation a new String object is created at each iteration. Suppose words
contains the elements ["Foo", "Bar", "Bam", "Baz"]. At runtime, the method creates
thirteen Strings:
1. ""
2. "Foo"
3. " "
4. "Foo "
5. "Foo Bar"
6. " "
7. "Foo Bar "
8. "Foo Bar Bam"
9. " "
10. "Foo Bar Bam "
11. "Foo Bar Bam Baz"
12. " "
13. "Foo Bar Bam Baz "
Even though only the last one is actually useful.
To avoid unnecessary memory use like this, use the StringBuilder class. It provides similar
functionality to Strings, but stores its data in a mutable way. Only one StringBuilder
object is created. Also because object creation is time consuming, using StringBuilder
produces much faster code.
169
API/[Link]
Example:
Code section 3.88: Concatenation with StringBuilder.
1 public String convertToString(Collection<String> words) {
2 StringBuilder buf = new StringBuilder();
3 // Loops through every element in words collection
4 for (String word : words) {
5 [Link](word);
6 [Link](" ");
7 }
8 return [Link]();
9 }
As StringBuilder isn't thread safe (see the chapter on Concurrency4 ) you can't use it in
more than one thread. For a multi-thread environment, use StringBuffer instead which
does the same and is thread safe. However, StringBuffer is slower so only use it when it
is required. Moreover, before Java 5 only StringBuffer existed.
Example: Console:
Code section 3.89: Dangerous comparison. Output for Code section 3.89
Match found.
1 String greeting = "Hello World!";
2 if (greeting == "Hello World!") {
3 [Link]("Match found.");
4 }
The difference between the above and below code is that the above code checks to see if
the String's are the same objects in memory which they are. This is as a result of the fact
that String's are stored in a place in memory called the String Constant Pool. If the new
keyword is not explicitly used when creating the String it checks to see if it already exists
in the Pool and uses the existing one. If it does not exist, a new Object is created. This is
what allows Strings to be immutable in Java. To test for equality, use the equals(Object)
method inherited by every class and defined by String to return true if and only if the
object passed in is a String contains the exact same data:
Example: Console:
Code section 3.90: Right comparison. Output for Code section 3.90
Match found.
1 String greeting = "Hello World!";
2 if ([Link]("Hello World!")) {
3 [Link]("Match found.");
4 }
4 [Link]
170
Splitting a String
Example: Console:
Code section 3.91: Comparison with lowercase. Output for Code section 3.91
To order String objects, use the compareTo() method, which can be accessed wherever
we use a String datatype. The compareTo() method returns a negative, zero, or positive
number if the parameter is less than, equal to, or greater than the object on which it is
called. Let's take a look at an example:
Example:
Code section 3.92: Order.
1 String person1 = "Peter";
2 String person2 = "John";
3 if ([Link](person2) > 0) {
4 // Badly ordered
5 String temp = person1;
6 person1 = person2;
7 person2 = temp;
8 }
The code section 3.925 is comparing the String variable person1 to person2. If person1
is different even in the slightest manner, we will get a value above or below 0 depending on
the exact difference. The result is negative if this String object lexicographically precedes
the argument string. The result is positive if this String object lexicographically follows the
argument string. Take a look at the Java API6 for more details.
171
API/[Link]
Example:
Code section 3.93: Order.
1 String person = "Brown, John:100 Yonge Street, Toronto:(416)777-9999";
2 ...
3 String[] personData = [Link](":");
4 ...
5 String name = personData[0];
6 String address = personData[1];
7 String phone = personData[2];
Another useful application could be to split the String text based on the new line character,
so you could process the text line by line.
23.6 Substrings
It may also be sometimes useful to create substrings, or strings using the order of letters
from an existing string. This can be done in two methods.
The first method involves creating a substring out of the characters of a string from a given
index to the end:
Example: Console:
Code section 3.94: Truncating string. Output for Code section 3.94
fee
1 String str = "coffee";
2 [Link]([Link](3));
By counting from there, it is apparent that the character in index 3 is the second ”f” in
”coffee”. This is known as the beginIndex. All characters from the beginIndex until the
end of the string will be copied into the new substring.
The second method involves a user-defined beginIndex and endIndex:
Example: Console:
Code section 3.95: Extraction of string. Output for Code section 3.95
port
1 String str = "supporting";
2 [Link]([Link](3, 7));
172
String cases
Please note that the endIndex is not inclusive. This means that the last character will be
of the index endIndex-1. Therefore, in this example, every character from index 3 to index
6, inclusive, was copied into the substring.
Note:
It is easy to mistake the method substring() for subString() (which does not exist
and would return with a syntax error on compilation). Substring is considered to be one
word. This is why the method name does not seem to follow the common syntax of
Java. Just remember that this style only applies to methods or other elements that are
made up of more than one word.
Example: Console:
Code section 3.96: Case modification. Output for Code section 3.96
wikibooks
1 String str = "wIkIbOoKs"; WIKIBOOKS
2 [Link]([Link]());
3 [Link]([Link]());
Example:
Code section 3.97: Text search.
1 String word = "Integer";
2 String text = "A number without a decimal part is an integer."
3 + " Integers are a list of digits.";
4
5 ...
6
7 // Remove the case
8 String lowerCaseWord = [Link]();
9 String lowerCaseText = [Link]();
10
11 // Search
12 int index = [Link](lowerCaseWord);
13 while (index != -1) {
14 [Link](word
15 + " appears at column "
16 + (index + 1)
17 + ".");
18 index = [Link](lowerCaseWord, index + 1);
19 }
20
173
API/[Link]
Console:
Output for Code section 3.97
Integer appears at column 38.
Integer appears at column 47.
Question 3.12: You have mail addresses in the following form: <firstName>.<lastName>
@<companyName>.org
Write the String getDisplayName(String) method that receives the mail string as pa-
rameter and returns the readable person name like this: LASTNAME Firstname
Example:
Answer 3.12: getDisplayName()
1 public static String getDisplayName(String mail) {
2 String displayName = null;
3
4 if (mail != null) {
5 String[] mailParts = [Link]("@");
6 String namePart = mailParts[0];
7 String[] namesParts = [Link]("\\.");
8
9 // The last name
10 String lastName = namesParts[1];
11 lastName = [Link]();
12
13 // The first name
14 String firstName = namesParts[0];
15
16 String firstNameInitial = [Link](0, 1);
17 firstNameInitial = [Link]();
18
19 String firstNameEnd = [Link](1);
20 firstNameEnd = [Link]();
21
22 // Concatenation
23 StringBuilder displayNameBuilder = new StringBuilder(lastName).append("
24 ").append(firstNameInitial).append(firstNameEnd);
25 displayName = [Link]();
26 }
27
28 return displayName;
29 }
174
See also
8 [Link]
9 [Link]
10 [Link]
175
24 Classes, Objects and Types
An object is composed of fields and methods. The fields, also called data members,
characteristics, attributes, or properties, describe the state of the object. The methods
generally describe the actions associated with a particular object. Think of an object as a
noun, its fields as adjectives describing that noun, and its methods as the verbs that can
be performed by or on that noun.
For example, a sports car is an object. Some of its fields might be its height, weight,
acceleration, and speed. An object's fields just hold data about that object. Some of the
methods of the sports car could be ”drive”, ”park”, ”race”, etc. The methods really don't
mean much unless associated with the sports car, and the same goes for the fields.
The blueprint that lets us build our sports car object is called a class. A class doesn't tell us
how fast our sports car goes, or what color it is, but it does tell us that our sports car will
have a field representing speed and color, and that they will be say, a number and a word
(or hex color code), respectively. The class also lays out the methods for us, telling the car
how to park and drive, but these methods can't take any action with just the blueprint —
they need an object to have an effect.
In Java, a class is located in a file similar to its own name. If you want to have a class
called SportsCar, its source file needs to be [Link]. The class is created by
placing the following in the source file: Code listing 3.13: [Link]
The class doesn't do anything yet, as you will need to add methods and field variables first.
The objects are different from the primitive types because:
1. The primitive types are not instantiated.
2. In the memory, for a primitive type only its value is stored. For an object, also a
reference to an instance can be stored.
3. In the memory, the allocated space of a primitive type is fixed, whatever their value.
The allocated space of an object can vary, for instance either the object is instantiated
or not.
4. The primitive types don't have methods callable on them.
5. A primitive type can't be inherited.
177
Classes, Objects and Types
Example:
Code section 3.79: A default constructor.
1 SportsCar car = new SportsCar();
Example:
Code section 3.80: A non-default constructor.
1 SportsCar car = new SportsCar("red", 12, 190);
A copy constructor is not included in the Java language, however one can easily create a
constructor that does the same as a copy constructor. It's important to understand what it
is. As the name implies, a copy constructor creates a new instance to be a duplicate of an
already existing one. In Java, this can be also accomplished by creating the instance with
the default constructor, and then using the assignment operator to equivocate them. This
is not possible in all languages though, so just keep the terminology under your belt.
Java has the concept of cloning an object, and the end results are similar to the copy
constructor. Cloning an object is faster than creation with the new keyword, because all
the object memory is copied at once to the destination cloned object. This is possible
by implementing the Cloneable interface, which allows the method [Link]() to
perform a field-by-field copy.
178
Type
Example:
Code section 3.81: Cloning object.
1 SportsCar car = [Link]();
24.2 Type
When an object is created, a reference to the object is also created. The object can not be
accessed directly in Java, only through this object reference. This object reference has a
type assigned to it. We need this type when passing the object reference to a method as a
parameter. Java does strong type checking.
Type is basically a list of features/operations, that can be performed through that object
reference. The object reference type is basically a contract that guarantees that those
operations will be there at run time.
When a car is created, it comes with a list of features/operations listed in the user manual
that guarantees that those will be there when the car is used.
When you create an object from a class by default its type is the same as its class. It means
that all the features/operations the class defined are there and available, and can be used.
See below:
Example:
Code section 3.82: Default type.
1 (new ClassName()).operations();
You can assign this to a variable having the same type as the class:
Example:
Code section 3.83: A variable having the same type as the class.
1 ClassName objRefVariable = new ClassName();
2 [Link]();
You can assign the created object reference to the class, super class, or to an interface the
class implements:
Example:
Code section 3.84: Using the super class.
1 SuperClass objectRef = new ClassName(); // features/operations list are
defined
2 by the SuperClass class
3 ...
4 Interface inter = new ClassName(); // features/operations list are defined by
5 the interface
In the car analogy, the created car may have different Types of drivers. We create sepa-
rate user manuals for them, an Average user manual, a Power user manual, a Child user
179
Classes, Objects and Types
manual, or a Handicapped user manual. Each type of user manual describes only those
features/operations appropriate for the type of driver. For instance, the Power driver may
have additional gears to switch to higher speeds, that are not available to other type of
users...
When the car key is passed from an adult to a child we are replacing the user manuals, that
is called Type Casting.
In Java, casts can occur in three ways:
• up casting going up in the inheritance tree, until we reach the Object
• up casting to an interface the class implements
• down casting until we reach the class the object was created from
24.3 Autoboxing/unboxing
Autoboxing and unboxing, language features since Java 1.5, make the programmer's life
much easier when it comes to working with the primitive wrapper types. Consider this code
fragment:
Example:
Code section 3.85: Traditional object creation.
1 int age = 23;
2 Integer ageObject = new Integer(age);
Primitive wrapper objects were Java's way of allowing one to treat primitive data types
as though they were objects. Consequently, one was expected to wrap one's primitive data
type with the corresponding primitive wrapper object, as shown above.
Since Java 1.5, one may write as below and the compiler will automatically create the
wrap object. The extra step of wrapping the primitive is no longer required. It has been
automatically boxed up on your behalf:
Example:
Code section 3.86: Autoboxing.
1 int age = 23;
2 Integer ageObject = age;
Note:
Keep in mind that the compiler still creates the missing wrapper code, so one doesn't
really gain anything performance-wise. Consider this feature a programmer convenience,
not a performance booster.
180
Methods in the Object class
short [Link]
int [Link]
long [Link]
float [Link]
double [Link]
boolean [Link]
void [Link]
Unboxing uses the same process in reverse. Study the following code for a moment. The if
statement requires a boolean primitive value, yet it was given a Boolean wrapper object.
No problem! Java 1.5 will automatically unbox this.
Example:
Code section 3.87: Unboxing.
1 Boolean canMove = new Boolean(true);
2
3 if (canMove) {
4 [Link]("This code is legal in Java 1.5");
5 }
Example:
Question 3.11: Autoboxing/unboxing.
1 Integer a = 10;
2 Integer b = a + 2;
3 [Link](b);
Example:
Answer 3.11: Autoboxing/unboxing.
1 Integer a = 10;
2 Integer b = a + 2;
3 [Link](b);
3
• 1 autoboxing at line 1 to assign.
• 1 unboxing at line 2 to do the addition.
• 1 autoboxing at line 2 to assign.
• No autoboxing nor unboxing at line 3 as println() supports the Integer class as pa-
rameter.
181
Classes, Objects and Types
1 [Link]
2 [Link]
182
Methods in the Object class
objects and those with the same hash code are separated later in another way. It is used
by the classes that provide associative arrays, for instance, those that implement the
[Link] interface . They use the hash code to store the object in the associative
array. A good hashCode implementation will return a hash code:
• Stable: does not change
• Evenly distributed: the hash codes of unequal objects tend to be unequal and the hash
codes are evenly distributed across integer values.
The second point means that two different objects can have the same hash code so two
objects with the same hash code are not necessarily the same!
Since associative arrays depend on both the equals and hashCode methods, there is an
important contract between these two methods that must be maintained if the objects are
to be inserted into a Map:
For two objects a and b
• [Link](b) == [Link](a)
• if [Link](b) then [Link]() == [Link]()
• but if [Link]() == [Link]() then [Link](b)
In order to maintain this contract, a class that overrides the equals method must also
override the hashCode method, and vice versa, so that hashCode is based on the same
properties (or a subset of the properties) as equals.
A further contract that the map has with the object is that the results of the hashCode and
equals methods will not change once the object has been inserted into the map. For this
reason, it is generally a good practice to base the hash function on immutable properties of
the object.
183
Classes, Objects and Types
expensive, as the thread has to continue checking, and less responsive since the thread won't
notice the condition has changed until the next time to check.
184
25 Keywords
Keywords are special tokens in the language which have reserved use in the language.
Keywords may not be used as identifiers in Java — you cannot declare a field whose name
is a keyword, for instance.
Examples of keywords are the primitive types, int and boolean; the control flow statements
for and if; access modifiers such as public, and special words which mark the declaration
and definition of Java classes, packages, and interfaces: class, package, interface.
Below are all the Java language keywords:
• abstract
• assert (since Java 1.4)
• boolean
• break
• byte
• case
• catch
• char
• class
• const (not used)
• continue
• default
• do
• double
• else
• enum (since Java 5.0)
• extends
• final
• finally
• float
• for
• goto (not used)
• if
• implements
• import
• instanceof
• int
• interface
• long
• native
• new
185
Keywords
• package
• private
• protected
• public
• return
• short
• static
• strictfp (since Java 1.2)
• super
• switch
• synchronized
• this
• throw
• throws
• transient
• try
• void
• volatile
• while
In addition, the identifiers null, true, and false denote literal values and may not be used
to create identifiers.
25.1 abstract
abstract is a Java keyword. It can be applied to a class and methods. An abstract class
cannot be directly instantiated. It must be placed before the variable type or the method
return type. It is recommended to place it after the access modifier and after the static
keyword. A non-abstract class is a concrete class. An abstract class cannot be final.
Only an abstract class can have abstract methods. An abstract method is only declared,
not implemented: Code listing 1: [Link]
An abstract method cannot be final, static nor native. Either you instantiate a concrete
sub-class, either you instantiate the abstract class by implementing its abstract methods
alongside a new statement:
186
assert
Example:
Code section 1: Abstract class use.
1 AbstractClass myInstance = new AbstractClass() {
2 public void abstractMethod() {
3 [Link]("Implementation.");
4 }
5 };
25.2 assert
assert is a Java keyword1 used to define an assert statement2 . An assert statement is
used to declare an expected boolean condition in a program. If the program is running
with assertions enabled, then the condition is checked at runtime. If the condition is false,
the Java runtime system throws3 an AssertionError4 Assertions may be declared using the
following syntax:
assert expression1 [: expression2];
expression1 is a boolean that will throw the assertion if it is false. When it is thrown, the
assertion error exception is created with the parameter expression2 (if applicable).
An example:
assert list != null && [Link]() > 0 : "list variable is null or empty";
Object value = [Link](0);
Assertions are usually used as a debugging aid. They should not be used instead of validating
arguments to public methods, or in place of a more precise runtime error exception.
Assertions are enabled with the Java -ea or -enableassertionsruntime option. See your
Java environment documentation for additional options for controlling assertions.
25.3 boolean
boolean is a keyword5 which designates the boolean primitive type6 . There are only two
possible boolean values: true and false. The default value for boolean fields is false.
The following is a declaration of a private boolean field named initialized, and its use
in a method named synchronizeConnection.
187
Keywords
Example:
Code section 1: Connection synchronization.
1 private boolean initialized = false;
2
3 public void synchronizeConnection() {
4 if (!initialized) {
5 connection = connect();
6 initialized = true;
7 }
8 }
The previous code only creates a connection once (at the first method call). Note that there
is no automatic conversion between integer types (such as int) to boolean as is possible in
some languages like C7 . Instead, one must use an equivalent expression such as (i != 0)
which evaluates to true if i is not zero.
25.4 break
break is a Java keyword.
Jumps (breaks) out from a loop. Also used at switch statement.
For example:
See also:
• Java Programming/Keywords/switch8
25.5 byte
byte is a keyword9 which designates the 8 bit signed integer primitive type10 .
The [Link] class is the nominal wrapper class when you need to store a byte
value but an object reference is required.
Syntax: byte <variable-name> = <integer-value>;
For example:
7 [Link]
8 Chapter 25.48 on page 214
9 Chapter 24.4.7 on page 184
10 Chapter 18.8 on page 135
188
case
byte b = 65;
or
byte b = 'A';
25.6 case
case is a Java keyword.
This is part of the switch statement, to find if the value passed to the switch statement
matches a value followed by case.
For example:
int i = 3;
switch(i) {
case 1:
[Link]("The number is 1.");
break;
case 2:
[Link]("The number is 2.");
break;
case 3:
[Link]("The number is 3."); // this line will print
break;
case 4:
[Link]("The number is 4.");
break;
case 5:
[Link]("The number is 5.");
break;
default:
[Link]("The number is not 1, 2, 3, 4, or 5.");
}
25.7 catch
catch is a keyword.
11 [Link]
12 Chapter 18.8 on page 135
189
Keywords
It's part of a try block. If an exception is thrown inside a try block, the exception will be
compared to any of the catch part of the block. If the exception match with one of the
exception in the catch part, the exception will be handled there.
For example:
try {
//...
throw new MyException_1();
//...
} catch ( MyException_1 e ) {
// --- Handle the Exception_1 here --
} catch ( MyException_2 e ) {
// --- Handle the Exception_2 here --
}
See also:
• Java Programming/Keywords/try13
25.8 char
char is a keyword. It defines a character primitive type14 . char can be created from
character literals and numeric representation. Character literals consist of a single quote
character (') (ASCII 39, hex 0x27), a single character, and a close quote ('), such as 'w'
. Instead of a character, you can also use unicode escape sequences15 , but there must be
exactly one.
Syntax:
190
class
Example:
Code section 2: char wrapping.
1 char aCharPrimitiveType = 'A';
2 Character aCharacterObject = aCharPrimitiveType;
See also:
• Java Programming/Primitive Types17
25.9 class
class is a Java keyword which begins the declaration and definition of a class18 .
The general syntax of a class declaration, using Extended Backus-Naur Form, is
The extends word is optional. If omitted, the class extends the Object class, as all Java
classes inherit from it.
See also:
• Java Programming/Keywords/new19
25.10 const
const is a reserved keyword, presently not being used.
16 [Link]
17 Chapter 18.8 on page 135
18 Chapter 33 on page 260
19 Chapter 25.37 on page 207
191
Keywords
25.11 continue
continue is a Java keyword. It skips the remainder of the loop and continues with the next
iteration.
For example:
int maxLoopIter = 7;
results in
0
1
2
3
4
6
7
25.13 default
default is a Java keyword.
This is an optional part of the switch statement, which only executes if none of the above
cases are matched.
See also:
• Java Programming/Keywords/switch21
192
do
25.14 do
do is a Java keyword.
It starts a do-while looping block. The do-while loop is functionally similar to the while
loop, except the condition is evaluated after the statements execute
Syntax:
do {
//statements;
} while (condition);
For example:
do {
i++;
} while ( i < maxLoopIter );
See also:
• Java Programming/Statements22
• Java Programming/Keywords/for23
• Java Programming/Keywords/while24
25.15 double
double is a keyword25 which designates the 64 bit float primitive type26 .
The [Link] class is the nominal wrapper class when you need to store a double
value but an object reference is required.
Syntax:
For example:
double d = 65.55;
See also:
• Java Programming/Primitive Types27
193
Keywords
25.16 else
else is a Java keyword. It is an optional part of a branching statement. It starts the 'false'
statement block.
The general syntax of a if, using Extended Backus-Naur Form, is
For example:
if ( expression ) {
[Link]("'True' statement block");
} else {
[Link]("'False' statement block");
}
See also:
• Java Programming/Keywords/if31
25.17 enum
[Link](gradeA);
/**
* Assigns the grade for this course to the student
* @param GRADE Grade to be assigned
*/
public void assignGrade(final Grade GRADE) {
grade = GRADE;
}
194
extends
/**
* Private constructor
* @param VALUE Value that stands for a day of the week.
*/
private DayOfWeek(final byte VALUE) {
dayCode = [Link](VALUE%7);
}
/**
* Gets the day code
* @return The day code
*/
public byte getDayCode() {
return dayCode;
}
}
/**
* Run method prints all elements
*/
public void run() {
[Link]("name() = " + name() +
", toString() = \"" + toString() + "\"");
}
}
25.18 extends
extends is a Java keyword.
Used in class and interface definition to declare the class or interface that is to be extended.
Syntax:
195
Keywords
//...
}
In Java 1.5 and later, the ”extends” keyword is also used to specify an upper bound on a
type parameter in Generics.
See also:
• Java Programming/Creating Objects32
• Java Programming/Keywords/class33
25.19 final
final is a keyword. Beware! It has distinct meanings depending whether it is used for a
class, a method, or for a variable. It must be placed before the variable type or the method
return type. It is recommended to place it after the access modifier and after the static
keyword.
Example:
Code section 1: Keyword order.
1 private static final long serialVersionUID = -5437975414336623381L;
1 Warning
Code section 2: Forbidden double assignment.
1 final int a = 1;
2 a = 2;
32 [Link]
33 Chapter 25.9 on page 191
196
For a class
Example: Console:
Code section 3: Only modify the value of the object. Console for Code section 3
0
1 final ArrayList list = new ArrayList(); 1
2 [Link]([Link]());
3 [Link]("One item");
4 [Link]([Link]());
Example:
Code section 4: Pi constant.
1 static final double PI = 3.1415926;
Example:
Code section 5: Final method parameter.
1 public int method(final int inputInteger) {
2 int outputInteger = inputInteger + 1;
3 return outputInteger;
4 }
It is useful for methods that use side effects to update some objects. Such methods modify
the content of an object passed in parameter. The method caller will receive the object
update. This will fail if the object parameter has been reassigned in the method. Another
object will be updated instead. Final method parameter can also be used to keep the code
clean.
The final keyword is similar to const in other languages and the readonly keyword in
C#35 . A final variable cannot be volatile.
34 [Link]
35 [Link]
197
Keywords
A final class cannot be abstract. The final keyword is similar to sealed keyword in
C#36 .
25.23 Interest
The final keyword is mostly used to guarantee a good usage of the code. For instance
(non-static) methods, this allows the compiler to expand the method (similar to an inline
function) if the method is small enough. Sometimes it is required to use it. For instance, a
nested class can only access the members of the top-level class if they are final.
See also Access Modifiers37 .
25.24 finally
finally is a keyword which is an optional ending part of the try block.
Example:
Code section 1: try block.
1 try {
2 // ...
3 } catch (MyException1 e) {
4 // Handle the Exception1 here
5 } catch (MyException2 e) {
6 // Handle the Exception2 here
7 } finally {
8 // This will always be executed no matter what happens
9 }
The code inside the finally block will always be executed. This is also true for cases when
there is an exception or even executed return statement in the try block.
Three things can happen in a try block. First, no exception is thrown:
36 [Link]
37 Chapter 39.5 on page 292
198
finally
Example: Console:
Code section 2: No exception is thrown. Console for Code section 2
Before the try block
1 [Link]("Before the try block"); Inside the try block
2 try { Execute the finally block
3 [Link]("Inside the try block"); Continue
4 } catch (MyException1 e) {
5 [Link]("Handle the Exception1");
6 } catch (MyException2 e) {
7 [Link]("Handle the Exception2");
8 } finally {
9 [Link]("Execute the finally block");
10 }
11 [Link]("Continue");
You can see that we have passed in the try block, then we have executed the finally block
and we have continued the execution. Now, a caught exception is thrown: |
Example:
Code section 3: A caught exception is thrown.
1 [Link]("Before the try block");
2 try {
3 [Link]("Enter inside the try block");
4 throw new MyException1();
5 [Link]("Terminate the try block");
6 } catch (MyException1 e) {
7 [Link]("Handle the Exception1");
8 } catch (MyException2 e) {
9 [Link]("Handle the Exception2");
10 } finally {
11 [Link]("Execute the finally block");
12 }
13 [Link]("Continue");
Console:
Console for Code section 3
Before the try block
Enter inside the try block
Handle the Exception1
Execute the finally block
Continue
We have passed in the try block until where the exception occurred, then we have executed
the matching catch block, the finally block and we have continued the execution. Now,
an uncaught exception is thrown:
199
Keywords
Example:
Code section 4: An uncaught exception is thrown.
1 [Link]("Before the try block");
2 try {
3 [Link]("Enter inside the try block");
4 throw new Exception();
5 [Link]("Terminate the try block");
6 } catch (MyException1 e) {
7 [Link]("Handle the Exception1");
8 } catch (MyException2 e) {
9 [Link]("Handle the Exception2");
10 } finally {
11 [Link]("Execute the finally block");
12 }
13 [Link]("Continue");
Console:
Console for Code section 4
Before the try block
Enter inside the try block
Execute the finally block
We have passed in the try block until where the exception occurred and we have executed
the finally block. NO CODE after the try-catch block has been executed. If there is an
exception that happens before the try-catch block, the finally block is not executed.
If return statement is used inside finally, it overrides the return statement in the try-catch
block. For instance, the construct
Example:
Code section 5: Return statement.
1 try {
2 return 11;
3 } finally {
4 return 12;
5 }
will return 12, not 11. Professional code almost never contains statements that alter exe-
cution order (like return, break, continue) inside the finally block, as such code is more
difficult to read and maintain.
25.25 float
float is a keyword38 which designates the 32 bit float primitive type39 .
The [Link] class is the nominal wrapper class when you need to store a float
value but an object reference is required.
200
for
Syntax:
For example:
See also:
• Java Programming/Primitive Types40
25.26 for
for is a Java keyword.
It starts a looping block.
The general syntax of a for, using Extended Backus-Naur Form, is
For example:
See also:
• Java Programming/Keywords/while44
• Java Programming/Keywords/do45
25.27 goto
goto is a reserved keyword, presently not being used.
201
Keywords
25.28 if
if is a Java keyword. It starts a branching statement.
The general syntax of a if, using Extended Backus-Naur Form, is
For example:
if ( boolean Expression )
{
[Link]("'True' statement block");
}
else
{
[Link]("'False' statement block");
}
See also:
• Java Programming/Keywords/else49
25.29 implements
implements is a Java keyword.
Used in class definition to declare the Interfaces that are to be implemented by the class.
Syntax:
See also:
• Java Programming/Creating Objects50
• Java Programming/Keywords/class51
• Java Programming/Keywords/interface52
202
import
25.30 import
import is a Java keyword.
It declares a Java class to use in the code below the import statement. Once a Java class is
declared, then the class name can be used in the code without specifying the package the
class belongs to.
Use the '*' character to declare all the classes belonging to the package.
Syntax:
import [Link];
import package.*;
The static import construct allows unqualified access to static members without inheriting
from the type containing the static members:
Once the static members have been imported, they may be used without qualification:
Caveat: use static import very sparingly to avoid polluting the program's namespace!
See also:
• Java Programming/Packages53
25.31 instanceof
instanceof is a keyword.
It checks if an object reference is an instance of a type, and returns a boolean value;
The <object-reference> instanceof Object will return true for all non-null object refer-
ences, since all Java objects are inherited from Object. instanceof will always return
false if <object-reference> is null.
Syntax:
For example:
203
Keywords
class Fruit
{
//...
}
class Apple extends Fruit
{
//...
}
class Orange extends Fruit
{
//...
}
public class Test
{
public static void main(String[] args)
{
Collection<Object> coll = new ArrayList<Object>();
printColl(coll);
}
java Test
The output:
204
int
Note that the instanceof operator can also be applied to interfaces. For example, if the
example above was enhanced with the interface
interface Edible
{
//...
}
and the classes modified such that they implemented this interface
25.32 int
int is a keyword54 which designates the 32 bit signed integer primitive type55 .
The [Link] class is the nominal wrapper class when you need to store an int
value but an object reference is required.
Syntax:
For example:
int i = 65;
See also:
205
Keywords
25.33 interface
interface is a Java keyword. It starts the declaration of a Java Interface.
For example:
See also:
• Java Programming/Keywords/new57
25.34 long
long is a keyword58 which designates the 64 bit signed integer primitive type59 .
The [Link] class is the nominal wrapper class when you need to store a long
value but an object reference is required.
Syntax:
For example:
See also:
• Java Programming/Primitive Types60
206
native
25.35 native
native is a java keyword. It marks a method, that it will be implemented in other languages,
not in Java. The method is declared without a body and cannot be abstract. It works
together with JNI (Java Native Interface)61 .
Syntax:
Native methods were used in the past to write performance critical sections but with java
getting faster this is now less common. Native methods are currently needed when
• You need to call from java a library, written in another language.
• You need to access system or hardware resources that are only reachable from the other
language (typically C62 ). Actually, many system functions that interact with real com-
puter (disk and network IO, for instance) can only do this because they call native code.
To complete writing native method, you need to process your class with javah tool that will
generate a header code in C. You then need to provide implementation of the header code,
produce dynamically loadable library (.so under Linux, .dll under Windows) and load it
(in the simplest case with [Link](library_file_name) . The code completion is
trivial if only primitive types like integers are passed but gets more complex if it is needed
to exchange strings or objects from the C code. In general, everything can be on C level,
including creation of the new objects and calling back methods, written in java.
To call the code in some other language (including C++63 ), you need to write a bridge from
C to that language. This is usually trivial as most of languages are callable from C.
25.37 new
new is a Java keyword. It creates a Java object and allocates memory for it on the heap.
new is also used for array creation, as arrays are also objects.
Syntax:
61 [Link]
62 [Link]
63 [Link]
207
Keywords
For example:
See also:
• Java Programming/Creating Objects64
25.38 package
package is a Java keyword. It declares a 'name space' for the Java class. It must be put
at the top of the Java file, it should be the first Java statement line.
To ensure that the package name will be unique across vendors, usually the company url is
used starting in backword.
Syntax:
package package;
For example:
package [Link];
See also:
• Java Programming/Packages65
• Java Programming/Keywords/import66
25.39 private
private is a Java keyword67 which declares a member's access68 as private. That is, the
member is only visible within the class, not from any other class (including subclasses).
The visibility of private members extends to nested classes69 .
Please note: Because access modifiers are not handled at instance level but at class level,
private members of an object are visible from other instances of the same class!
64 [Link]
65 Chapter 25.59 on page 223
66 Chapter 25.30 on page 203
67 Chapter 24.4.7 on page 184
68 [Link]
69 Chapter 40.4 on page 297
208
protected
Syntax:
See also:
• Java Programming/Access Modifiers70
25.40 protected
protected is a Java keyword.
This keyword is an access modifier, used before a method or other class member to signify
that the method or variable can only be accessed by elements residing in its own class or
classes in the same package (as it would be for the default visibility level) but moreover
from subclasses of its own class, including subclasses in foreign packages (if the access is
made on an expression, whose type is the type of this subclass).
Syntax:
For example:
See also:
• Java Programming/Scope#Access modifiers71
25.41 public
public is a Java keyword72 which declares a member's access73 as public. Public members
are visible to all other classes. This means that any other class can access a public field
or method. Further, other classes can modify public fields unless the field is declared as
final.
A best practice is to give fields private access and reserve public access to only the
set of methods and final fields that define the class' public constants. This helps with
70 [Link]
71 Chapter 40.2 on page 294
72 Chapter 24.4.7 on page 184
73 Chapter 39.5 on page 292
209
Keywords
encapsulation and information hiding, since it allows you to change the implementation of
a class without affecting the consumers who use only the public API of the class.
Below is an example of an immutable public class named Length which maintains private
instance fields named units and magnitude but provides a public constructor and two
public accessor methods.
Code listing: [Link]
1 package [Link];
2
3 public class Length {
4 private double magnitude;
5 private String units;
6
7 public Length(double magnitude, String units) {
8 if ((units == null) || ([Link]().length() == 0)) {
9 throw new IllegalArgumentException(”non-null, non-empty units
10 required.”);
11 }
12
13 [Link] = magnitude;
14 [Link] = units;
15 }
16
17 public double getMagnitude() {
18 return [Link];
19 }
20
21 public String getUnits() {
22 return [Link];
23 }
24 }
25.42 return
return is a Java keyword.
Returns a primitive value, or an object reference, or nothing(void). It does not return object
values, only object references.
Syntax:
25.43 short
short is a keyword. It defines a 16 bit signed integer primitive type.74
210
static
Syntax:
For example:
See also:
• Java Programming/Primitive Types75
25.44 static
static is a Java keyword. It can be applied to a field, a method or an inner class76 . A static
field, method or class has a single instance for the whole class that defines it, even if there
is no instance of this class in the program. For instance, a Java entry point (main()) has
to be static. A static method cannot be abstract. It must be placed before the variable
type or the method return type. It is recommended to place it after the access modifier and
before the final keyword:
Example:
Code section 1: Static field and method.
1 public static final double PI = 3.1415926535;
2
3 public static void main(final String[] arguments) {
4 //…
5 }
The static items can be called on an instantiated object or directly on the class:
Example:
Code section 2: Static item calls.
1 double aNumber = [Link];
2 [Link](new String[0]);
Static methods cannot call nonstatic methods. The this current object reference is also not
available in static methods.
211
Keywords
25.45 Interest
• Static variables can be used as data sharing amongst objects of the same class. For
example to implement a counter that stores the number of objects created at a given
time can be defined as so:
Code listing 1: [Link]
1 public CountedObject {
2 private static int counter;
3 …
4 public AClass() {
5 …
6 counter++;
7 }
8 …
9 public int getNumberOfObjectsCreated() {
10 return counter;
11 }
12 }
Example:
Code section 3: Constant definition.
1 public static final String CONSTANT_VAR = "Const";
• Static methods can be used for utility functions or for functions that do not belong to
any particular object. For example:
Code listing 2: [Link]
1 public ArithmeticToolbox {
2 …
3 public static int addTwoNumbers(final int firstNumber, final int
4 secondNumber) {
5 return firstNumber + secondNumber;
6 }
7}
25.46 strictfp
strictfp is a java keyword, since Java 1.2 .
212
super
It makes sure that floating point calculations result precisely the same regardless of the un-
derlying operating system and hardware platform, even if more precision could be obtained.
This is compatible with the earlier version of Java 1.1 . If you need that use it.
Syntax for classes:
See also:
• [Link]
25.47 super
super is a keyword.
• It is used inside a sub-class method definition to call a method defined in the super class.
Private methods of the super-class cannot be called. Only public and protected methods
can be called by the super keyword.
• It is also used by class constructors to invoke constructors of its parent class78 .
• Super keyword are not used in static Method.
Syntax:
or:
78 [Link]
213
Keywords
4 return;
5 }
6}
$Java SubClass
In Java 1.5 and later, the ”super” keyword is also used to specify a lower bound on a wildcard
type parameter in Generics.
Example:
Code section 1: A lower bound on a wildcard type parameter.
1 public void sort(Comparator<? super T> comp) {
2 ...
3 }
See also:
• extends
25.48 switch
switch is a Java keyword.
It is a branching operation, based on a number. The 'number' must be either char, byte,
short, or int primitive type.
Syntax:
214
switch
switch ( <integer-var> )
{
case <label1 >: <statements>;
case <label2 >: <statements>;
...
case <labeln >: <statements>;
default: <statements>;
}
When the <integer-var> value match one of the , then: The statements after the matched
label will be executed including the following label's statements, until the end of the switch
block, or until a break keyword is reached.
For example:
int var = 3;
switch ( var )
{
case 1:
[Link]( "Case: 1" );
[Link]( "Execute until break" );
break;
case 2:
[Link]( "Case: 2" );
[Link]( "Execute until break" );
break;
case 3:
[Link]( "Case: 3" );
[Link]( "Execute until break" );
break;
case 4:
[Link]( "Case: 4" );
[Link]( "Execute until break" );
break;
default:
[Link]( "Case: default" );
[Link]( "Execute until break" );
break;
}
Case: 3
Execute until break
int var = 3;
if ( var == 1 ) {
[Link]( "Case: 1" );
[Link]( "Execute until break" );
} else if ( var == 2 ) {
[Link]( "Case: 2" );
[Link]( "Execute until break" );
} else if ( var == 3 ) {
[Link]( "Case: 3" );
[Link]( "Execute until break" );
} else if ( var == 4 ) {
215
Keywords
See also:
• Java Programming/Keywords/if79
25.49 synchronized
synchronized is a keyword.
It marks a critical section. A critical section is where one and only one thread is executing.
So to enter into the marked code the threads are synchronized, only one can enter, the
others have to wait. For more information see Synchronizing Threads Methods80 or http:
//[Link]/docs/books/tutorial/essential/concurrency/[Link].
The synchronized keyword can be used in two ways:
• Create a synchronized block
• Mark a method synchronized
A synchronized block is marked as:
Example:
Code section 1: Synchronized block.
1 synchronized(<object_reference>) {
2 // [Link]() has a lock on object_reference. All other threads
3 trying to access it will
4 // be blocked until the current thread releases the lock.
5 }
Example:
Code section 2: Synchronized method.
1 public synchronized void method() {
2 // [Link]() has a lock on this object, i.e. a synchronized
3 method is the same as
4 // calling { synchronized(this) {…} }.
5 }
The synchronization is always associated to an object. If the method is static, the associated
object is the class. If the method is non-static, the associated object is the instance. While
216
Singleton example
1 /**
2 * The singleton class that can be instantiated only once with lazy
3 instantiation
4 */
5 public class Singleton {
6 /** Static class instance */
7 private volatile static Singleton instance = null;
8
9 /**
10 * Standard private constructor
11 */
12 private Singleton() {
13 // Some initialisation
14 }
15
16 /**
17 * Getter of the singleton instance
18 * @return The only instance
19 */
20 public static Singleton getInstance() {
21 if (instance == null) {
22 // If the instance does not exist, go in time-consuming
23 // section:
24 synchronized ([Link]) {
25 if (instance == null) {
26 instance = new Singleton();
27 }
28 }
29 }
30
31 return instance;
32 }
33 }
25.51 this
this is a Java keyword. It contains the current object reference.
1. Solves ambiguity between instance variables and parameters .
2. Used to pass current object as a parameter to another method .
Syntax:
[Link]();
or
217
Keywords
[Link];
25.52 throw
throw is a keyword; it 'throws' an exception. In a throw statement, the three types of
objects that can be thrown are: Exception, java:Throwable, and java:Error
Syntax:
For example:
218
See also
return custRet
}
25.54 throws
throws is a Java keyword. It is used in a method definition to declare the Exceptions to
be thrown by the method.
Syntax:
Example:
219
Keywords
25.55 transient
transient is a Java keyword which marks a member variable not to be serialized when it is
persisted to streams of bytes. When an object is transferred through the network, the object
needs to be 'serialized'. Serialization converts the object state to serial bytes. Those bytes
are sent over the network and the object is recreated from those bytes. Member variables
marked by the java transient keyword are not transferred; they are lost intentionally.
Syntax:
For example:
See also:
• Java language specification reference: jls82
• Serializable Interface. Serializable83
25.56 try
try is a keyword.
82 [Link]
83 [Link]
220
try
It starts a try block. If an Exception is thrown inside a try block, the Exception will be
compared to any of the catch part of the block. If the Exception matches with one of the
Exceptions in the catch part, the exception will be handled there.
Three things can happen in a try block:
• No exception is thrown:
• the code in the try block
• plus the code in the finally block will be executed
• plus the code after the try-catch block is executed
• An exception is thrown and a match is found among the catch blocks:
• the code in the try block until the exception occurred is executed
• plus the matched catch block is executed
• plus the finally block is executed
• plus the code after the try-catch block is executed
• An exception is thrown and no match found among the catch blocks:
• the code in the try block until the exception occurred is executed
• plus the finally block is executed
• NO CODE after the try-catch block is executed
For example:
[Link]
84
20Exceptions%23Catching%20Rule
85 Chapter 25.7 on page 189
86 Chapter 25.24 on page 198
[Link]
87
20Exceptions%23Catching%20Rule
221
Keywords
25.57 void
void is a Java keyword.
Used at method declaration and definition to specify that the method does not return any
type, the method returns void. It is not a type and there is no void references/pointers as
in C/C++.
For example:
See also:
• Java Programming/Keywords/return88
25.58 volatile
volatile is a keyword.
When member variables are marked with this keyword, it changes the runtime behavior in
a way that is noticeable when multiple threads access these variables. Without the volatile
keyword, one thread could observe another thread update member variables in an order that
is not consistent with what is specified in sourcecode. Unlike the synchronized keyword,
concurrent access to a volatile field is allowed.
Syntax:
For example:
See also:
• Java Programming/Keywords/synchronized89
222
while
25.59 while
while is a Java keyword.
It starts a looping block.
The general syntax of a while, using Extended Backus-Naur Form, is
For example:
See also:
• Java Programming/Statements93
• Java Programming/Keywords/for94
• Java Programming/Keywords/do95
223
26 Packages
If your application becomes quite big, you may have many classes. Although you can browse
them in their alphabetic order, it becomes confusing. So your application classes can be
sorted into packages.
A package is a name space that mainly contains classes and interfaces. For in-
stance, the standard class ArrayList is in the package [Link]. For this class,
[Link] is called its fully qualified name because this syntax has no am-
biguity. Classes in different packages can have the same name. For example, you have the
two classes [Link] and [Link] which are not the same. If no package is
declared in a class, its package is the default package.
1 package business;
2
3 public class BusinessClass {
4}
If your class is declared in a package, say business, your class must be placed in a subfolder
called business from the root of your application folder. This is how the compiler and
the class loader find the Java files on the file system. You can declare your class in a
subpackage, say engine. So the full package is [Link] and the class must be
placed in a subsubfolder called engine in the subfolder business (not in a folder called
[Link]).
Example:
Code section 3.88: Package declaration.
1 [Link] myBusinessClass = new [Link]();
225
Packages
If you are using the class from a class in the same package, you don't have to specify the
package. If another class with the same name exists in another package, it will use the local
class.
The syntax above is a bit verbose. You can import the class by using the import Java
keyword at the top of the file and then only specify its name:
Code listing 3.15: [Link]
1 import [Link];
2
3 public class MyClass {
4 public static void main(String[] args) {
5 BusinessClass myBusinessClass = new BusinessClass();
6 }
7 }
Note that you can't import two classes with the same name in two different packages.
The classes Integer and String belongs to the package [Link] but they don't need to
be imported as the [Link] package is implicitly imported in all classes.
Example:
Code section 3.89: Wildcard imports.
1 import [Link].*;
While it may seem convenient, it may cause problems if you make a typographical error. For
example, if you use the above import to use JFrame, but then type JFraim frame = new
JFraim();, the Java compiler will report an error similar to ”Cannot find symbol: JFraim”.
Even though it seems as if it was imported, the compiler is giving the error report at the
first mention of JFraim, which is half-way through your code, instead of the point where
you imported JFrame along with everything else in [Link].
If you change this to import [Link]; the error will be at the import instead
of within your code.
Furthermore, if you import [Link].*; and import [Link].*;, and
[Link] is later added in a future version of Java, your code that uses
Queue ([Link]) will fail to compile. This particular example is fairly unlikely, but if you
are working with non-Oracle libraries, it may be more likely to happen.
226
Package convention
26.5.1 Javac
For example, to compile and run a class from a project's top directory (that contains the
two directories /source and /libraries) you could use the following command:
Compilation
The above is simplified, and demands that MainClass be in the default package, or a
package called source, which isn't very desirable.
26.5.2 BlueJ
With BlueJ just click on Tools, Preferences, Libraries, and add the .jar one by one.
227
27 Arrays
An array is similar to a table of objects or primitive types, keyed by index. You may have
noticed the strange parameter of the default main() method (String[] args) since the
beginning of the book. It is an array. Let's handle this parameter:
Code listing 3.15: The default array parameter. Console for Code listing 3.15
$ java ArrayExample This is a test
1 public class ArrayExample { Argument #1 This
2 public static void main(String[] args) { Argument #2 is
3 for (int i = 0; i < [Link]; ++i) { Argument #3 a
4 [Link](”Argument #” + (i + 1) + ”: ” + args[i]); Argument #4 test
5 }
6 }
7 }
In the code listing 3.151 , the array is args. It is an array of String objects (here those
objects are the words that have been typed by the user at the program launching). At line
4, One contained object is accessed using its index in the array. You can see that its value
is printed on the standard output. Note that the strings have been put in the array with
the right order.
27.1 Fundamentals
In Java, an array is an object. This object has a given type for the contained primitive
types or objects (int, char, String, ...). An array can be declared in several ways:
Example:
Code section 3.52: Array declarations.
1 int[] array1 = null;
2 int array2[] = null;
Those syntaxes are identical but the first one is recommended. It can also be instantiated
in several ways:
229
Arrays
Example:
Code section 3.53: Array instantiations.
1 array1 = new int[10];
2 int[] array0 = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}; //this only works in the
3 declaration
4 array1 = new int[]{1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
At line 1, we instantiate an array of 10 items that get the default value (which is 0 for int
). At lines 2 and 3, we instantiate arrays of 10 given items. It will each be given an index
according to its order. We can know the size of the array using the length attribute:
Arrays are allocated at runtime, so the specified size in an array creation expression may be
a variable (rather than a constant expression as in C). However, the size of an instantiated
array never changes. If you need to change the size, you have to create a new instance.
Items can be accessed by their index. Beware! The first index is 0:
If you attempt to access to a too high index or negative index, you will get an
ArrayIndexOutOfBoundsException.
Question 3.20: Consider the following code:
Question 3.20: [Link]
What will be printed in the standard output? Output for Question 3.20
230
Two-Dimensional Arrays
can't
choosers
Indexes start at 0. So the index 1 point at the second string (can't). There are 4 items so
the size of the array is 4. Hence the item pointed by the index 3 is the last one (choosers
).
Example:
Code section 3.56: Two-dimensional arrays.
1 String[][] twoDimArray = {{"a", "b", "c", "d", "e"},
2 {"f", "g", "h", "i", "j"},
3 {"k", "l", "m", "n", "o"}};
4
5 int[][] twoDimIntArray = {{ 0, 1, 2, 3, 4},
6 {10, 11, 12, 13, 14},
7 {20, 21, 22, 23, 24}};
It's not exactly equivalent to two-dimensional arrays because the size of the sub-arrays may
vary. The sub-array reference can even be null. Consider:
Example:
Code section 3.57: Weird two-dimensional array.
1 String[][] weirdTwoDimArray = {{"10", "11", "12"},
2 null,
3 {"20", "21", "22", "23", "24"}};
Note that the length of a two-dimensional array is the number of one-dimensional ar-
rays it contains. In the above example, [Link] is 3, whereas
weirdTwoDimArray[2].length is 5.
In the code section 3.582 , we defined an array that has three elements, each element contains
an array having 5 elements. We could create the array having the 5 elements first and use
that one in the initialize block.
Example:
Code section 3.58: Included array.
1 String[] "01", "02", "03", "04"};
2 String[][] twoDimArray = {oneDimArray,
3 {"10", "11", "12", "13", "14"},
4 {"20", "21", "22", "23", "24"}};
231
Arrays
Example:
Question 3.21: The alphabet.
1 String[][] alphabet = {{"a", "b", "c", "d", "e"},
2 {"f", "g", "h", "i", "j"},
3 {"k", "l", "m", "n", "o"},
4 {"p", "q", "r", "s", "t"},
5 {"u", "v", "w", "x", "y"},
6 {"z"}};
Print the whole alphabet in the standard output. Question 3.21: [Link]
i will be the indexes of the main array and j will be the indexes of all the sub-arrays. We
have to first iterate on the main array. We have to read the size of the array. Then we
iterate on each sub-array. We have to read the size of each array as it may vary. Doing so,
we iterate on all the sub-array items using the indexes. All the items will be read in the
right order.
elementType[][]...[] arrayName
or
elementType arrayName[][]...[]
232
28 Mathematical functions
The [Link] class allows the use of many common mathematical functions that
can be used while creating programs.
Since it is in the [Link] package, the Math class does not need to be imported. However,
in programs extensively utilizing these functions, a static import can be used.
28.1.1 Math.E
The Math.E constant represents the value of Euler's number1 (e), the base of the natural
logarithm.
Example:
Code section 3.20: Math.E
1 public static final double E = 2.718281828459045;
28.1.2 [Link]
The [Link] constant represents the value of pi2 , the ratio of a circle's circumference to its
diameter.
Example:
Code section 3.21: [Link]
1 public static final double PI = 3.141592653589793;
1 [Link]
2 [Link]
233
Mathematical functions
Exponentiation
The power method, double [Link](double, double), returns the first parameter to
the power of the second parameter. For example, a call to [Link](2, 10) will return a
value of 1024 (210 ).
The [Link](double) method, a special case of pow, returns e to the power of the param-
eter. In addition, double Math.expm1(double) returns (ex - 1). Both of these methods
are more accurate and convenient in these special cases.
Java also provides special cases of the pow function for square roots and cube roots of
doubles, double [Link](double) and double [Link](double).
28.2.2 Logarithms
Java has no general logarithm function; when needed this can be simulated using the change-
of-base theorem.
double [Link](double) returns the natural logarithm of the parameter (not the com-
mon logarithm, as its name suggests!).
double Math.log10(double) returns the common (base-10) logarithm of the parameter.
double Math.log1p(double) returns ln(parameter+1). It is recommended for small val-
ues.
Trigonometric functions
The three main trigonometric methods are [Link](x), [Link](x), and [Link](x),
which are used to find the sine, cosine, and tangent, respectively, of any given number. So,
for example, a call to [Link]([Link]/2) would return a value of about 1. Although
methods for finding the cosecant, secant, and cotangent are not available, these values can
be found by taking the reciprocal of the sine, cosine, and tangent, respectively. For example,
the cosecant of pi/2 could be found using 1/[Link]([Link]/2).
234
Functions dealing with floating-point representation
Hyperbolic functions
In addition, hyperbolic functions are available: [Link](x), [Link](x), and Math.
tanh(x).
Radian/degree conversion
To convert between degree and radian measures of angles, two methods are available, Math.
toRadians(x) and [Link](x). While using [Link](x), a degrees value
must be passed in, and that value in radians (the degree value multiplied by pi/180) will
be returned. The [Link](x) method takes in a value in radians and the value in
degrees (the radian value multiplied by 180/pi) is returned.
Example:
Code section 3.22: [Link]
1 int result = [Link](-3);
235
Mathematical functions
1 /**
2 * Class that comprises of constant values & string utilities.
3 *
4 * @since 2013-09-05
5 * @version 2014-10-14
6 */
7 public class StringUtils {
8 /** Dash or minus constant */
9 public static final char DASH = '-';
10 /** The exponent sign in a scientific number, or the capital letter E */
11 public static final char EXPONENT = 'E';
12 /** The full stop or period */
13 public static final char PERIOD = '.';
14 /** The zero string constant used at several places */
15 public static final String ZERO = ”0”;
16
17 /**
18 * Removes all occurrences of the filter character in the text.
19 *
20 * @param text Text to be filtered
21 * @param filter The character to be removed.
22 * @return the string
23 */
24 public static String filter(final String text, final String filter) {
25 final String[] words = [Link](”[” + filter + ”]”);
26
27 switch ([Link]) {
28 case 0: return text;
29 case 1: return words[0];
30 default:
31 final StringBuilder filteredText = new StringBuilder();
32
33 for (final String word : words) {
34 [Link](word);
35 }
36
37 return [Link]();
38 }
39 }
40 }
The MathsUtils class is like an addition to the [Link] class and contains the
rounding calculations. Code listing 3.21: [Link]
1 package string;
2
3 /**
4 * Class for special mathematical calculations.<br/>
5 * ATTENTION:<br/>Should depend only on standard Java libraries!
6 *
7 * @since 2013-09-05
236
Rounding number example
8 * @version 2014-10-14
9 */
10 public class MathsUtils {
11
12 // CONSTANTS
13 // ——————————————
14
15 /** The exponent sign in a scientific number, or the capital letter E.
*/
16 public static final char EXPONENT = 'E';
17
18 /** Value after which the language switches from scientific to double */
19 private static final double E_TO_DOUBLE = 1E-3;
20
21 /** The zero string constant used at several places. */
22 public static final String ZERO = ”0”;
23
24 /** The string of zeros */
25 private static final String ZEROS = ”000000000000000000000000000000000”;
26
27 // METHODS
28 // ——————————————
29
30 /**
31 * Determines, if the number uses a scientific representation.
32 *
33 * @param number the number
34 * @return true, if it is a scientific number, false otherwise
35 */
36 private static boolean isScientific(final double number) {
37 return ((new Double(number)).toString().indexOf(EXPONENT) > 0);
38 }
39
40 /**
41 * Determines how many zeros are to be appended after the decimal
digits.
42 *
43 * @param significantsAfter Requested significant digits after decimal
44 * @param separator Language-specific decimal separator
45 * @param number Rounded number
46 * @return Requested value
47 */
48 private static byte calculateMissingSignificantZeros(
49 final byte significantsAfter,
50 final char separator,
51 final double number) {
52
53 final byte after = findSignificantsAfterDecimal(separator, number);
54
55 final byte zeros =
56 (byte) (significantsAfter - ((after == 0) ? 1 : after));
57
58 return ((zeros >= 0) ? zeros : 0);
59 }
60
61 /**
62 * Finds the insignificant zeros after the decimal separator.
63 *
64 * @param separator Language-specific decimal separator
65 * @param number the number
66 * @return the byte
67 */
68 private static byte findInsignificantZerosAfterDecimal(
69 final char separator,
70 final double number) {
71
237
Mathematical functions
238
Rounding number example
239
Mathematical functions
240
Rounding number example
260 */
261 public static byte findSignificantsAfterDecimal(final char separator,
262 final double number) {
263
264 if (number == 0) { return 1; }
265 else {
266 String value = (new Double(number)).toString();
267
268 final short separatorAt = (short) [Link](separator);
269
270 if (separatorAt > -1) {
271 value = [Link](separatorAt + 1);
272 }
273
274 final short exponentAt = (short) [Link](EXPONENT);
275
276 if (exponentAt > 0) {
277 value = [Link](0, exponentAt);
278 }
279
280 final Long longValue = new Long(value).longValue();
281
282 if ([Link](number) < 1) {
283 return (byte) [Link]().length();
284 } else if (longValue == 0) {
285 return 0;
286 } else {
287 return (byte) ((”0.” + value).length() - 2);
288 }
289 }
290 }
291
292 /**
293 * Calculates the power of the base to the exponent without changing the
294 * least-significant digits of a number.
295 *
296 * @param basis
297 * @param exponent
298 * @return basis to power of exponent
299 */
300 public static double power(final int basis, final short exponent) {
301 return power((short) basis, exponent);
302 }
303
304 /**
305 * Calculates the power of the base to the exponent without changing the
306 * least-significant digits of a number.
307 *
308 * @param basis the basis
309 * @param exponent the exponent
310 * @return basis to power of exponent
311 */
312 public static double power(final short basis, final short exponent) {
313 if (basis == 0) {
314 return (exponent != 0) ? 1 : 0;
315 } else {
316 if (exponent == 0) {
317 return 1;
318 } else {
319 // The Math method power does change the least significant
320 // digits after the decimal separator and is therefore
useless.
321 double result = 1;
322 short s = 0;
323
324 if (exponent > 0) {
241
Mathematical functions
242
Rounding number example
389
390 /**
391 * Rounds a number according to mathematical rules.
392 *
393 * @param value the value
394 * @return the double
395 */
396 public static double round(final double value) {
397 return (long) (value + .5);
398 }
399
400 /**
401 * Rounds to a fixed number of significant digits.
402 *
403 * @param significantDigits Requested number of significant digits
404 * @param separator Language-specific decimal separator
405 * @param dNumber Number to be rounded
406 * @return Rounded number
407 */
408 public static String roundToString(final byte significantDigits,
409 final char separator,
410 double dNumber) {
411
412 // Number of significants that *are* before the decimal separator:
413 final byte significantsBefore =
414 findSignificantsBeforeDecimal(separator, dNumber);
415 // Number of decimals that *should* be after the decimal separator:
416 final byte significantsAfter = findSignificantsAfterDecimal(
417 significantsBefore, significantDigits);
418 // Round to the specified number of digits after decimal separator:
419 final double rounded = [Link](significantsAfter,
separator,
420 dNumber);
421
422 final String exponent = findExponent((new
Double(rounded)).toString());
423 final String mantissa = findMantissa(separator,
424 (new Double(rounded)).toString());
425
426 final double dMantissa = new Double(mantissa).doubleValue();
427 final StringBuilder result = new StringBuilder(mantissa);
428 // Determine the significant digits in this number:
429 final byte significants = findSignificantDigits(significantsAfter,
430 separator, dMantissa);
431 // Add lagging zeros, if necessary:
432 if (significants <= significantDigits) {
433 if (significantsAfter != 0) {
434 [Link]([Link](0,
435 calculateMissingSignificantZeros(significantsAfter,
436 separator, dMantissa)));
437 } else {
438 // Cut off the decimal separator & after decimal digits:
439 final short decimal = (short) [Link](
440 new Character(separator).toString());
441
442 if (decimal > -1) {
443 [Link](decimal);
444 }
445 }
446 } else if (significantsBefore > significantDigits) {
447 dNumber /= power(10, (short) (significantsBefore -
448 significantDigits));
449
450 dNumber = round(dNumber);
451
452 final short digits =
243
Mathematical functions
1 package string;
2
3 import static [Link];
4 import static [Link];
5 import static [Link];
6
7 import [Link];
8
9 import [Link];
10
11 /**
12 * The JUnit test for the <code>MathsUtils</code> class.
13 *
14 * @since 2013-03-26
15 * @version 2014-10-14
16 */
17 public class MathsUtilsTest {
18
19 /**
20 * Method that adds a negative and a positive value to values.
21 *
22 * @param d the double value
23 * @param values the values
3 [Link]
244
Rounding number example
24 */
25 private static void addValue(final double d, Vector<Double> values) {
26 [Link](-d);
27 [Link](d);
28 }
29
30 // Public methods ——
31
32 /**
33 * Tests the round method with a double parameter.
34 */
35 @Test
36 public void testRoundToStringDoubleByteCharDouble() {
37 // Test rounding
38 final Vector<Double> values = new Vector<Double>();
39 final Vector<String> strValues = new Vector<String>();
40
41 [Link](0.0);
42 [Link](”0.00000”);
43 addValue(1.4012984643248202e-45, values);
44 [Link](”-1.4012E-45”);
45 [Link](”1.4013E-45”);
46 addValue(1.999999757e-5, values);
47 [Link](”-1.9999E-5”);
48 [Link](”2.0000E-5”);
49 addValue(1.999999757e-4, values);
50 [Link](”-1.9999E-4”);
51 [Link](”2.0000E-4”);
52 addValue(1.999999757e-3, values);
53 [Link](”-0.0019999”);
54 [Link](”0.0020000”);
55 addValue(0.000640589, values);
56 [Link](”-6.4058E-4”);
57 [Link](”6.4059E-4”);
58 addValue(0.3396899998188019, values);
59 [Link](”-0.33968”);
60 [Link](”0.33969”);
61 addValue(0.34, values);
62 [Link](”-0.33999”);
63 [Link](”0.34000”);
64 addValue(7.07, values);
65 [Link](”-7.0699”);
66 [Link](”7.0700”);
67 addValue(118.188, values);
68 [Link](”-118.18”);
69 [Link](”118.19”);
70 addValue(118.2, values);
71 [Link](”-118.19”);
72 [Link](”118.20”);
73 addValue(123.405009, values);
74 [Link](”-123.40”);
75 [Link](”123.41”);
76 addValue(30.76994323730469, values);
77 [Link](”-30.769”);
78 [Link](”30.770”);
79 addValue(130.76994323730469, values);
80 [Link](”-130.76”);
81 [Link](”130.77”);
82 addValue(540, values);
83 [Link](”-539.99”);
84 [Link](”540.00”);
85 addValue(12345, values);
86 [Link](”-12344”);
87 [Link](”12345”);
88 addValue(123456, values);
89 [Link](”-123450”);
245
Mathematical functions
90 [Link](”123460”);
91 addValue(540911, values);
92 [Link](”-540900”);
93 [Link](”540910”);
94 addValue(9.223372036854776e56, values);
95 [Link](”-9.2233E56”);
96 [Link](”9.2234E56”);
97
98 byte i = 0;
99 final byte significants = 5;
100
101 for (final double element : values) {
102 final String strValue;
103
104 try {
105 strValue = [Link](significants,
106 [Link], element);
107
108 [Link](” [Link](” + significants + ”,
'”
109 + [Link] + ”', ” + element + ”) ==> ”
110 + strValue + ” = ” + [Link](i));
111 assertEquals(”Testing roundToString”, strValue,
112 [Link](i++));
113 } catch (final Exception e) {
114 // TODO Auto-generated catch block
115 [Link]();
116 }
117 }
118 }
119
120 } // class MathsUtilsTest
246
Rounding number example
If you are interested in a comparison with C#4 , take a look at the rounding number example5
there. If you are interested in a comparison with C++6 , you can compare this code here
with the same example7 over there.
Notice that in the expression starting with if ((D == 0), I have to use OR instead of the
|| because of a bug in the source template.
4 [Link]
[Link]
5
2FConsole%20Programming%23Rounding%20number%20example
6 [Link]
[Link]
7
8ERounding_number_example
247
29 Large numbers
The integer primitive type with the largest range of value is the long, from -263 to 263 -1.
If you need greater or lesser values, you have to use the BigInteger class in the package
[Link]. A BigInteger object can represent any integer (as large as the RAM on the
computer can hold) as it is not mapped on a primitive type. Respectively, you need to use
the BigDecimal class for great decimal numbers.
However, as these perform much slower than primitive types, it is recommended to use
primitive types when it is possible.
29.1 BigInteger
The BigInteger class represents integers of almost any size. As with other objects, they
need to be constructed. Unlike regular numbers, the BigInteger represents an immutable
object - methods in use by the BigInteger class will return a new copy of a BigInteger.
To instantiate a BigInteger, you can create it from either byte array, or from a string. For
example:
Example:
Code section 3.23: 1 quintillion, or 10^18. Too large to fit in a long.
1 BigInteger i = new BigInteger("1000000000000000000");
BigInteger cannot use the normal Java operators1 . They use the methods provided by the
class.
Example:
Code section 3.24: Multiplications and an addition.
1 BigInteger a = new BigInteger("3");
2 BigInteger b = new BigInteger("4");
3
4 // c = a^2 + b^2
5 BigInteger c = [Link](a).add([Link](b));
It is possible to convert to a long, but the long may not be large enough.
249
Large numbers
Example:
Code section 3.25: Conversion.
1 BigInteger aBigInteger = new BigInteger("3");
2 long aLong = [Link]();
29.2 BigDecimal
The BigInteger class cannot handle decimal numbers. The BigDecimal class represents
a floating point value of arbitrary precision. It is composed of both a BigInteger, and a
scale value (represented by a 32-bit integer).
Googol = 10100
250
30 Random numbers
To generate random numbers the [Link]() method can be used, which returns a
double, greater than or equal to 0.0 and less than 1.0.
The following code returns a random integer between n and m (where n <= randomNumber
< m):
Example:
Code section 3.30: A random integer.
1 int randomNumber = n + (int)([Link]() * ( m - n ));
Example:
Code section 3.31: A random integer with Gaussian.
1 Random random = new Random();
2 int randomNumber = n + [Link](m - n);
As an example using random numbers, we can make a program that uses a Random object
to simulate flipping a coin 20 times:
251
Random numbers
Code listing 3.25: [Link] Possible output for code listing 3.25
Heads
1 import [Link]; Tails
2 Tails
3 public class CoinFlipper { Tails
4 Heads
5 public static void main(String[] args) { Tails
6 // The number of times to flip the coin Heads
7 final int TIMES_TO_FLIP = 20; Heads
8 int heads = 0; Heads
9 int tails = 0; Heads
10 // Create a Random object Heads
11 Random random = new Random(); Heads
12 for (int i = 0; i < TIMES_TO_FLIP; i++) { Tails
13 // 0 or 1 Tails
14 int result = [Link](2); Tails
15 if (result == 1) { Tails
16 [Link](”Heads”); Heads
17 heads++; Tails
18 } else { Tails
19 [Link](”Tails”); Tails
20 tails++; There were 9 heads and 11 tails
21 }
22 }
23 [Link](”There were ”
24 + heads
25 + ” heads and ”
26 + tails
27 + ” tails”);
28 }
29 }
Of course, if you run the program you will probably get different results.
252
31 Unicode
Most Java program text consists of w:ASCII1 characters, but any Unicode character can
be used as part of identifier names, in comments, and in character and string literals. For
example, π (which is the Greek Lowercase Letter pi) is a valid Java identifier:
Example:
Code section 3.100: Pi.
1 double π = [Link];
Example:
Code section 3.101: Pi literal.
1 String pi = "π";
1 [Link]
2 Chapter 20.1 on page 150
3 ”3.1 Unicode”, The Java™ Language Specification [Link]
mr3-fullv-oth-JSpec/[Link], Java SE 7 Edition, pp. 15-16.
253
Unicode
Example:
Code section 3.102: Unicode escape sequences for Pi.
1 double \u03C0 = [Link];
The following demonstrates the use of Unicode escape sequences in other Java syntax:
Example:
Code section 3.103: Unicode escape sequences in a string literal.
1 // Declare Strings pi and quote which contain \u03C0 and \u0027 respectively:
2 String pi = "\u03C0";
3 String quote = "\u0027";
Note that a Unicode escape sequence functions just like any other character in the source
code. E.g., \u0022 (double quote, ”) needs to be quoted in a string just like ”.
Example:
Code section 3.104: Double quote.
1 // Declare Strings doubleQuote1 and doubleQuote2 which both contain " (double
2 quote):
3 String doubleQuote1 = "\"";
4 String doubleQuote2 = "\\u0022"; // "\u0022" doesn't work since """ doesn't
5 work.
哈
嘍
世
界
31.2 International language support
The language distinguishes between bytes and characters. Characters are stored internally
using UCS-2, although as of J2SE 5.0, the language also supports using UTF-16 and its
surrogates. Java program source may therefore contain any Unicode character.
The following is thus perfectly valid Java code; it contains Chinese characters in the class
and variable5 names as well as in a string literal6 : Code listing 3.50: .java
31.3 References
4 [Link]
5 Chapter 17.2 on page 128
6 Chapter 20.1 on page 150
254
32 Comments
A comment allows to insert text that will not be compiled nor interpreted. It can appear
anywhere in the source code where whitespaces are allowed.
It is useful for explaining what the source code does by:
• explaining the adopted technical choice: why this given algorithm and not another, why
calling this given method...
• explaining what should be done in the next steps (the TODO list): improvement, issue
to fix...
• giving the required explanation to understand the code and be able to update it yourself
later or by other developers.
It can also be used to make the compiler ignore a portion of code: temporary code for
debugging, code under development...
32.1 Syntax
The comments in Java use the same syntax as in C++1 .
An end-of-line comment starts with two slashes and ends with the end of the line. This
syntax can be used on a single line too.
Example:
Code section 3.105: Slash-slash comment.
1 // A comment to give an example
2
3 int n = 10; // 10 articles
A comment on several lines is framed with '/' + '*' and '*' + '/'.
1 [Link]
255
Comments
Example:
Code section 3.106: Slash-star comment in multiple lines.
1 /*
2 * This is a comment
3 * on several lines.
4 */
5
6 /* This also works; slash-star comments may be on a single line. */
7
8 /*
9 Disable debugging code:
10
11 int a = 10;
12 while (a-- > 0) [Link]("DEBUG: tab["+a+"]=" + tab[a]);
13 */
By convention, subsequent lines of slash-star comments begin with a star aligned under
the star in the open comment sequence, but this is not required. Never nest a slash-star
comment in another slash-star comment. If you accidentally nest such comments, you will
probably get a syntax error from the compiler soon after the first star-slash sequence.
1 Warning
Code section 3.107: Nested slash-star comment.
1 /* This comment appears to contain /* a nested comment. */
2 * The comment ends after the first star-slash and
3 * everything after the star-slash sequence is parsed
4 * as non-comment source.
5 */
If you need to have the sequence */ inside a comment you can use html numeric entities:
*/.
Slash-star comments may also be placed between any Java tokens, though not recommended:
Example:
Code section 3.108: Inline slash-star comment.
1 int i = /* maximum integer */ Integer.MAX_VALUE;
However, comments are not parsed as comments when they occur in string literals.
Example:
Code section 3.109: String literal.
1 String text = "/* This is not a comment. */";
256
Comments and unicode
Example:
Question 3.26: Commented code.
int a = 0;
// a = a + 1;
a = a + 1;
/*
a = a + 1;
*/
a = a + 1;
// /*
a = a + 1;
// */
a = a /*+ 1*/;
a = a + 1; // a = a + 1;
[Link]("a=" + a);
Console:
Output for Answer 3.26
a=4
Example:
Answer 3.26: Commented code.
1 int a = 0;
2 // a = a + 1;
3 a = a + 1;
4 /*
5 a = a + 1;
6 */
7 a = a + 1;
8 // /*
9 a = a + 1;
10 // */
11 a = a /*+ 1*/;
12 a = a + 1; // a = a + 1;
13 [Link]("a=" + a);
The highlighted lines are code lines but line 11 does nothing and only the first part of line
12 is code.
257
Comments
Example:
Code section 3.110: Unicode sequence interruption.
1 /* This is a comment. \u002a\u002f
2 String statement = "This is not a comment.";
Example:
Code section 3.111: Unicode sequence interruption effect.
1 /* This is a comment. */
2 String statement = "This is not a comment.";
(The '*' character is Unicode 002A and the '/' character is Unicode 002F.)
Similar caveats apply to newline characters in slash-slash comments.
For example:
1 Warning
Code section 3.112: New line.
1 // This is a single line comment \u000a This is code
That is because \u000a is Unicode for a new line, making the compiler think that you have
added a new line when you haven't.
Example:
Code section 3.113: Javadoc comment.
1 /**
2 * Comments which start with slash-star-star are Javadoc comments.
3 * These are used to extract documentation from the Java source.
4 * More on javadoc will be covered later.
5 */
2 [Link]
258
33 Coding conventions
The Java code conventions are defined by Oracle in the coding conventions1 document. In
short, these conventions ask the user to use camel case2 when defining classes, methods, or
variables. Classes start with a capital letter and should be nouns, like CalendarDialogView
. For methods, the names should be verbs in imperative form, like getBrakeSystemType,
and should start with a lowercase letter.
It is important to get used to and follow coding conventions, so that code written by multiple
programmers will appear the same. Projects may re-define the standard code conventions
to better fit their needs. Examples include a list of allowed abbreviations, as these can often
make the code difficult to understand for other designers. Documentation should always
accompany code.
One example from the coding conventions is how to define a constant. Constants should be
written with capital letters in Java, where the words are separated by an underscore ('_')
character. In the Java coding conventions, a constant is a static final field in a class.
The reason for this diversion is that Java discerns between ”simple” and ”complex” types.
These will be handled in detail in the following sections. An example for a simple type is
the byte type. An example for a complex type is a class. A subset of the complex types
are classes that cannot be modified after creation, like a String, which is a concatenation
of characters.
For instance, consider the following ”constants”:
1 public class MotorVehicle {
2 /** Number of motors */
3 private static final int MOTORS = 1;
4
5 /** Name of a motor */
6 private static final String MOTOR_NAME = "Mercedes V8";
7
8 /** The motor object */
9 private static final Motor THE_MOTOR = new MercedesMotor();
10
11 /**
12 * Constructor
13 */
14 public MotorVehicle() {
15 MOTORS = 2; // Gives a syntax error as MOTORS has
16 already been assigned a value.
17 THE_MOTOR = new ToshibaMotor(); // Gives a syntax error as THE_MOTOR has
18 already been assigned a value.
19 MOTOR_NAME.toLowercase(); // Does not give a syntax error, because
it
20 returns a new String rather than editing the MOTOR_NAME variable.
1 [Link]
2 [Link]
259
Coding conventions
260
34 Classes and Objects
1 [Link]
2 [Link]
3 [Link]
261
35 Defining Classes
35.1 Fundamentals
Every class in Java can be composed of the following elements:
• fields, member variables or instance variables — Fields are variables that hold data
specific to each object. For example, an employee might have an ID number. There is
one field for each object of a class.
• member methods or instance methods — Member methods perform operations on
an object. For example, an employee might have a method to issue his paycheck or to
access his name.
• static fields or class fields — Static fields are common to any object of the same class.
For example, a static field within the Employee class could keep track of the last ID
number issued. Each static field exists only once in the class, regardless of how many
objects are created for that class.
• static methods or class methods — Static methods are methods that do not affect a
specific object.
• inner classes — Sometimes it is useful to contain a class within another one if it is
useless outside of the class or should not be accessed outside the class.
• Constructors — A special method that generates a new object.
• Parameterized types — Since 1.5, parameterized types can be assigned to a class during
definition. The parameterized types will be substituted with the types specified at the
class's instantiation. It is done by the compiler. It is similar to the C language macro
'#define' statement, where a preprocessor evaluates the macros.
Code listing 4.1: [Link]
263
Defining Classes
35.2 Constructors
A constructor is called to initialize an object immediately after the object has been
allocated: Code listing 4.3: [Link]
264
Constructors
Example:
Code section 4.1: A constructor call.
1 Cheese cheese = new Cheese();
The constructor syntax is close to the method syntax. However, the constructor has the
same name as the name of the class (with the same case) and the constructor has no return
type. The second point is the most important difference as a method can also have the
same name as the class, which is not recommended: Code listing 4.4: [Link]
265
Defining Classes
The super() command calls the constructor of the superclass. If there is no explicit call
to super(...) or this(...), then the default superclass constructor super(); is called
before the body of the constructor is executed. That said, there are instances where you
need to add in the call manually. For example, if you write even one constructor, no matter
what parameters it takes, the compiler will not add a default constructor. The code listing
4.81 results in a runtime error: Code listing 4.7: [Link]
This is something to keep in mind when extending existing classes. Either make a default
constructor, or make sure every class that inherits your class uses the correct constructor.
35.3 Initializers
Initializers are blocks of code that are executed at the same time as initializers for fields.
266
Initializers
Example:
Code section 4.2: Static initializer.
1 static int count = 20;
2 static int[] squares;
3 static { // a static initializer
4 squares = new int[count];
5 for (int i = 0; i < count; i++)
6 squares[i] = i * i;
7 }
8 static int x = squares[5]; // x is assigned the value 25
267
36 Inheritance
Inheritance is one of the most powerful mechanisms of the Object Oriented Programming1 .
It allows the reuse of the members of a class (called the superclass or the mother class) in
another class (called subclass, child class or the derived class) that inherits from it. This
way, classes can be built by successive inheritance.
In Java, this mechanism is enabled by the extends keyword. Example: Code listing 4.9:
[Link]
In the Code listing 4.102 , the class Car inherits from Vehicle, which means that the at-
tributes speed and numberOfSeats are present in the class Car, whereas they are defined
in the class Vehicle. Also, the constructor defined in the class Car allows to initialize those
attributes. In Java, the inheritance mechanism allows to define a class hierarchy with all
the classes. Without explicit inheritance, a class implicitly inherits from the Object class.
This Object class is the root of the class hierarchy.
Some classes can't be inherited. Those classes are defined with the final keyword. For
instance, the Integer class can't have subclasses. It is called a final class.
1 [Link]
2 Chapter 36.2 on page 270
269
Inheritance
In Java, a class can only inherit from one class. Java does not allow you to create a subclass
from two classes, as that would require creating complicated rules to disambiguate fields
and methods inherited from multiple superclasses. If there is a need for Java to inherit from
multiple sources, the best option is through interfaces, described in the next chapter.
In this example, the constructor of the Plane class calls the constructor of its superclass
Vehicle. You can only use super to access the members of the superclass inside the child
class. If you use it from another class, it accesses the superclass of the other class. This
keyword also allows you to explicitly access the members of the superclass, for instance,
in the case where there is a method with the same name in your class (overriding, ...).
Example : Code listing 4.12: [Link]
270
The super keyword
List all the attributes and methods that can be accessed in the class Question1.
• CONSTANT_OF_CLASS_1
• myAttributeOfClass1
• myMethodOfClass1(int)
• myAttributeOfClass2
• myMethodOfClass2(int)
• CONSTANT
• myAttribute
• myMethod(int)
Question1 inherits from Class1 and Class2 but not from Class3.
See also the Object Oriented Programming3 book about the inheritance concept.
3 [Link]
271
37 Interfaces
You can see that the method1() method is abstract (unimplemented). To use an interface,
you have to define a class that implements it, using the implements keyword: Code listing
4.15: [Link]
A class can implement several interfaces, separated by a comma. Java interfaces behave
much like the concept of the Objective-C1 protocol. It is recommended to name an interface
<verb>able, to mean the type of action this interface would enable on a class. However, it
is not recommended to start the name of an interface by I as in C++2 . It is useless. Your
IDE will help you instead.
37.1 Interest
If you have objects from different classes that do not have a common superclass, you can't
call the same method in those classes, even if the two classes implement a method with the
1 [Link]
2 [Link]
273
Interfaces
1 Warning
Code section 4.16: Impossible call.
1 public static void main(String[] args) {
2 doAction(new OneClass());
3 doAction(new AnotherClass());
4 }
5
6 public void doAction(Object anObject) {
7 anObject.method1("Hello!");
8 }
The solution is to write an interface that defines the method that should be implemented
in the two classes as the SimpleInterface in the Code listing 4.143 and then both classes
can implement the interface as in the Code listing 4.154 .
Example:
Code section 4.17: Interface use.
1 public static void main(String[] args) {
2 doAction(new ClassWithInterface());
3 doAction(new AnotherClassWithInterface());
4 }
5
6 public void doAction(SimpleInterface anObject) {
7 anObject.method1("Hello!");
8 }
You can also implement this using a common super class but a class can only inherit from
one super class whereas it can implement several interfaces.
274
Extending interfaces
Java does not support full orthogonal multiple inheritance (i.e. Java does not allow you to
create a subclass from two classes). Multiple inheritance in C++5 has complicated rules
to disambiguate fields and methods inherited from multiple superclasses and types that
are inherited multiple times. By separating interface from implementation, interfaces offer
much of the benefit of multiple inheritance with less complexity and ambiguity. The price of
no multiple inheritance is some code redundancy; since interfaces only define the signature
of a class but cannot contain any implementation, every class inheriting an interface must
provide the implementation of the defined methods, unlike in pure multiple inheritance,
where the implementation is also inherited. The major benefit of that is that all Java
objects can have a common ancestor (a class called Object).
When overriding methods defined in interfaces there are several rules to be followed:
• Checked exceptions should not be declared on implementation methods other than the
ones declared by the interface method or subclasses of those declared by the interface
method.
• The signature of the interface method and the same return type or subtype should be
maintained when implementing the methods.
• All the methods of the interface need to be defined in the class, unless the class that
implements the interface is abstract.
This way, a class implementing the InterfaceAB interface has to implement the methodA()
, the methodB() and the otherMethod() methods: Code listing 4.21: [Link]
5 [Link]
275
Interfaces
Doing so, a ClassAB object can be casted into InterfaceA, InterfaceB and InterfaceAB
. Question 4.2: Consider the following interfaces. Question 4.2: [Link]
List all the methods that an implementing class of Movable should implement.
• walk()
• jump()
Answer 4.2: [Link]
276
Extending interfaces
Question 4.3: Consider the following classes and the following code. Question 4.3:
[Link]
1 import [Link];
2
3 public class ConsoleLogger {
4 public void printLog(String log) {
5 [Link](new Date() + ”: ” + log);
6 }
7}
1 import [Link];
2 import [Link];
3
4 public class FileLogger {
5 public void printLog(String log) {
6 try {
7 File file = new File(”[Link]”);
8 FileOutputStream stream = new FileOutputStream(file);
9 byte[] logInBytes = (new Date() + ”: ” + log).getBytes();
10
11 [Link](logInBytes);
12
13 [Link]();
14 [Link]();
15 } catch (Exception e) {
16 [Link]();
17 }
18 }
19 }
Example:
Question 4.3: Common code.
1 Object[] loggerArray = new Object[2];
2 loggerArray[0] = new ConsoleLogger();
3 loggerArray[1] = new FileLogger();
4
5 for (Object logger : loggerArray) {
6 // [Link]("Check point.");
7 }
Change the implementation of the code in order to be able to uncomment the commented
line without compile error. You have to create an interface that defines the method
printLog(String) and makes ConsoleLogger and FileLogger implement it: Answer 4.3:
277
Interfaces
[Link]
1 import [Link];
2
3 public class ConsoleLogger implements Logger {
4 public void printLog(String log) {
5 [Link](new Date() + ”: ” + log);
6 }
7}
1 import [Link];
2 import [Link];
3
4 public class FileLogger implements Logger {
5 public void printLog(String log) {
6 try {
7 File file = new File(”[Link]”);
8 FileOutputStream stream = new FileOutputStream(file);
9 byte[] logInBytes = (new Date() + ”: ” + log).getBytes();
10
11 [Link](logInBytes);
12
13 [Link]();
14 [Link]();
15 } catch (Exception e) {
16 [Link]();
17 }
18 }
19 }
Now your code has to cast the objects to the Logger type and then you can uncomment
the code.
Example:
Answer 4.3: Common code.
1 Logger[] loggerArray = new Logger[2];
2 loggerArray[0] = new ConsoleLogger();
3 loggerArray[1] = new FileLogger();
4
5 for (Logger logger : loggerArray) {
6 [Link]("Check point.");
7 }
278
38 Overloading Methods and
Constructors
Example:
Code section 4.22: Method overloading.
1 public void runAroundThe(Building block) {
2 ...
3 }
4
5 public void runAroundThe(Park park) {
6 ...
7 }
279
Overloading Methods and Constructors
Although both methods would be fit to call the method with the String parameter, it is the
method with the nearest type that will be called instead. To be more accurate, it will call
the method whose parameter type is a subclass of the parameter type of the other method.
So, aObject will output Object. Beware! The parameter type is defined by the declared
type of an object, not its instantiated type!
The following two method definitions are valid
Example:
Code section 4.23: Method overloading with the type order.
1 public void logIt(String param, Error err) {
2 ...
3 }
4
5 public void logIt(Error err, String param) {
6 ...
7 }
because the type order is different. If both input parameters were type String, that would
be a problem since the compiler would not be able to distinguish between the two:
1 Warning
Code section 4.24: Bad method overloading.
1 public void logIt(String param, String err) {
2 ...
3 }
4
5 public void logIt(String err, String param) {
6 ...
7 }
The compiler would give an error for the following method definitions as well:
280
Method overloading
1 Warning
Code section 4.25: Another bad method overloading.
1 public void logIt(String param) {
2 ...
3 }
4
5 public String logIt(String param) {
6 String retValue;
7 ...
8 return retValue;
9 }
Note, the return type is not part of the unique signature. Why not? The reason is that a
method can be called without assigning its return value to a variable. This feature came
from C and C++. So for the call:
1 Warning
Code section 4.26: Ambiguous method call.
1 logIt(msg);
the compiler would not know which method to call. It is also the case for the thrown
exceptions.
Question 4.6: Which methods of the Question6 class will cause compile errors?
[Link]
281
Overloading Methods and Constructors
27 }
28 }
[Link]
The example1, example2 and example3 methods will cause compile errors. The example1
methods cannot co-exist because they have the same signature (remember, return type
is not part of the signature). The example2 methods cannot co-exist because the names
of the parameters are not part of the signature. The example3 methods cannot co-exist
because the visibility of the methods are not part of the signature. The example4 methods
can co-exist, because they have different method signatures.
282
Constructor overloading
Example:
Code section 4.27: Variable argument.
1 public void registerPersonInAgenda(String firstName, String lastName,
Date...
2 meeting) {
3 String[] person = {firstName, lastName};
4 lastPosition = lastPosition + 1;
5 contactArray[lastPosition] = person;
6
7 if ([Link] > 0) {
8 Date[] temporaryMeetings = new Date[[Link] +
9 [Link]];
10 for (i = 0; i < [Link]; i++) {
11 temporaryMeetings[i] = registeredMeetings[i];
12 }
13 for (i = 0; i < [Link]; i++) {
14 temporaryMeetings[[Link] + i] = meeting[i];
15 }
16 registeredMeetings = temporaryMeetings;
17 }
18 }
The above method can be called with a dynamic number of arguments, for example:
Example:
Code section 4.27: Constructor calls.
1 registerPersonInAgenda("John", "Doe");
2 registerPersonInAgenda("Mark", "Lee", new Date(), new Date());
283
Overloading Methods and Constructors
18 }
19 }
In the code listing 4.121 , we defined two constructors, one with no input parameter, and
one with one input parameter. You may ask which constructor will be called. Its depends
how the object is created with the new keyword. See below:
Example:
Code section 4.29: Constructor calls.
1 // The constructor with no input parameter will be called
2 MyClass obj1 = new MyClass();
3
4 // The constructor with one input param. will be called
5 MyClass obj2 = new MyClass("Init Value");
In the code section 4.292 , we created two objects from the same class, or we can also say
that obj1 and obj2 both have the same type. The difference between the two is that in
the first one the memberField field is not initialized, in the second one that is initialized to
"Init Value". A constructor may also be called from another constructor, see below:
Code listing 4.13: Constructor pooling.
In the code listing 4.133 , the constructor with no input parameter calls the other constructor
with the default initial value. This call must be the first instruction of a constructor or else
a compiler error will occur. The code gives an option to the user, to create the object with
the default value or create the object with a specified value. The first constructor could
have been written using the this keyword as well:
284
Method overriding
Example:
Code section 4.30: Another constructor pooling.
1 public MyClass() {
2 this("Default Value");
3 }
Example:
Code section 4.31: Runtime binding.
1 MyClass obj;
2
3 if (new [Link]().get([Link].AM_PM) ==
4 [Link]) {
5 // Executed during a morning
6 obj = new SubOfMyClass();
7 } else {
8 // Executed during an afternoon
9 obj = new MyClass();
10 }
11
12 [Link]();
285
Overloading Methods and Constructors
In the code section 4.314 , the expression at line 3 is true if it is executed during a morning
and false if it is executed during an afternoon. Thus, the instance of obj will be a MyClass
or a SubOfMyClass depending on the execution time. So it is impossible to determine the
method address at compile time. Because the obj reference can point to an object and all
its sub objects, and that will be known only at runtime, a table is kept with all the possible
method addresses to be called. Do not confuse:
Example:
Code section 4.32: Declared type and instantiated type.
1 [Link](myParameter);
The implementation of this method is searched using the instantiated type of the called
object (obj) and the declared type of the parameter object (myParameter).
Also another rule is that when you do an override, the visibility of the new method that
overrides the super class method can not be reduced. The visibility can be increased,
however. So if the super class method visibility is public, the override method can not be
package, or private. An override method must throw the same exceptions as the super
class, or their subexceptions.
super references to the parent class (i.e. [Link]()). It can be used in a subclass
to access inherited methods that the subclass has overridden or inherited fields that the
subclass has hidden.
Note:
A common mistake is to think that if we can override methods, we could also override
member variables. This is not the case, as it is useless. You can not redefine a variable
that is private in the super class as such a variable is not visible.
286
39 Object Lifecycle
Before a Java object can be created the class byte code must be loaded from the file system
(with .class extension) to memory. This process of locating the byte code for a given class
name and converting that code into a Java class1 instance is known as class loading. There
is one class created for each type of Java class.
All objects in Java programs are created on heap memory. An object is created based on
its class. You can consider a class as a blueprint, template, or a description how to create
an object. When an object is created, memory is allocated to hold the object properties.
An object reference pointing to that memory location is also created. To use the object in
the future, that object reference has to be stored as a local variable or as an object member
variable.
The Java Virtual Machine (JVM) keeps track of the usage of object references. If there
are no more reference to the object, the object can not be used any more and becomes
garbage. After a while the heap memory will be full of unused objects. The JVM collects
those garbage objects and frees the memory they allocated, so the memory can be reused
again when a new object is created. See below a simple example:
Example:
Code section 4.30: Object creation.
1 {
2 // Create an object
3 MyObject obj = new MyObject();
4
5 // Use the object
6 [Link]();
7 }
The obj variable contains the object reference pointing to an object created from the
MyObject class. The obj object reference is in scope2 inside the { }. After the } the object
becomes garbage. Object references can be passed in to methods and can be returned from
methods.
1 [Link]
2 Chapter 39.5 on page 292
287
Object Lifecycle
When an object from the MyObject class is created for the first time, the JVM searches
the file system for the definition of the class, that is the Java byte code. The file has the
extension of *.class. The CLASSPATH environment variable contains locations where
Java classes are stored. The JVM is looking for the [Link] file. Depending on
which package the class belongs to, the package name will be translated to a directory path.
When the [Link] file is found, the JVM's class loader loads the class in mem-
ory, and creates a [Link].Class3 object. The JVM stores the code in memory, allocates
memory for the static variables, and executes any static initialize block. Memory is not
allocated for the object member variables at this point, memory will be allocated for them
when an instance of the class, an object, is created.
There is no limit on how many objects from the same class can be created. Code and
static variables are stored only once, no matter how many objects are created. Memory
is allocated for the object member variables when the object is created. Thus, the size of
an object is determined not by its code's size but by the memory it needs for its member
variables to be stored.
This method works but object creation with the new keyword is time-consuming. The
clone() method copies the whole object's memory in one operation and this is much faster
3 [Link]
288
Creating object by cloning an object
than using the new keyword and copying each variable so if you need to create lots of objects
with the same type, performance will be better if you create one object and clone new ones
from it. See below a factory method that will return a new object using cloning.
Example:
Code section 4.31: Object cloning.
1 HashTable cacheTemplate = new HashTable();
2 ...
3 /** Clone Customer object for performance reason */
4 public Customer createCustomerObject() {
5 // See if a template object exists in our cache
6 Customer template = [Link]("Customer");
7 if (template == null) {
8 // Create template
9 template = new Customer();
10 [Link]("Customer", template);
11 }
12 return [Link]();
13 }
In the code listing 4.154 we used cloning for speed up object creation. Another use of
cloning could be to take a snapshot of an object that can change in time. Let's say we want
to store Customer objects in a collection, but we want to disassociate them from the 'live'
objects. So before adding the object, we clone them, so if the original object changes from
that point forward, the added object won't. Also let's say that the Customer object has a
reference to an Activity object that contains the customer activities. Now we are facing a
problem, it is not enough to clone the Customer object, we also need to clone the referenced
objects. The solution:
1. Make the Activity class also cloneable
2. Make sure that if the Activity class has other 'changeable' object references, those
have to be cloned as well, as seen below
289
Object Lifecycle
Note that only mutable objects need to be cloned. References to unchangeable objects such
as a String can be used in the cloned object without worry.
290
Destroying objects
Example:
Code section 4.32: Serialization version id.
1 private static final long serialVersionUID = 42L;
39.4.1 finalize()
When an object is garbage-collected, the programmer may want to manually perform
cleanup, such as closing any open input/output streams. To accomplish this, the
finalize() method is used. Note that finalize() should never be manually called, ex-
cept to call a super class' finalize method from a derived class' finalize method. Also, we
can not rely on when the finalize() method will be called. If the java application exits
before the object is garbage-collected, the finalize() method may never be called.
Example:
Code section 4.33: Finalization.
1 protected void finalize() throws Throwable {
2 try {
3 doCleanup(); // Perform some cleanup. If it fails for some reason,
4 it is ignored.
5 } finally {
6 [Link](); // Call finalize on the parent object
7 }
8 }
The garbage-collector thread runs in a lower priority than the other threads. If the applica-
tion creates objects faster than the garbage-collector can claim back memory, the program
can run out of memory.
The finalize method is required only if there are resources beyond the direct control of
the Java Virtual Machine that needs to be cleaned up. In particular, there is no need
to explicitly close an OutputStream, since the OutputStream will close itself when it gets
291
Object Lifecycle
finalized. Instead, the finalize method is used to release either native or remote resources
controlled by the class.
292
40 Scope
40.1 Scope
The scope of a class, a variable or a method is its visibility and its accessibility. The visibility
or accessibility means that you can use the item from a given place.
In code listing 3.141 , i is visible within the entire method1 method but not in the method2
and the main methods.
293
Scope
Example:
Code section 3.50: Local variables.
1 {
2 ...
3 // myNumber is NOT visible
4 {
5 // myNumber is NOT visible
6 int myNumber;
7 // myNumber is visible
8 {
9 ...
10 // myNumber is visible
11 }
12 // myNumber is visible
13 }
14 // myNumber is NOT visible
15 ...
16 }
294
Utility
• If a method has protected visibility, the method can be called only in the sub-classes
and in the same package through the class it is defined in.
• If a method has package visibility, the method can be called only in the same package
through the class it is defined in.
• If a method has private visibility, the method can be called only in the class it is defined
in.
40.2.5 Summary
Class Nested class Method, or Member Interface Interface method
variable signature
public visible from anywhere same as its class same as its class visible from anywhere visible from anywhere
protected N/A its class and its subclass its class and its subclass, N/A N/A
and from its package
package only from its package only from its package only from its package N/A N/A
private N/A only from its class only from its class N/A N/A
40.3 Utility
A general guideline for visibilities is to only make a member as visible as it needs to be.
Don't make a member public if it only needs to be private.
Doing so, you can rewrite a class and change all the private members without making
compilation errors, even you don't know all the classes that will use your class as long as
you do not change the signature of the public members.
295
Scope
Example:
Code section 3.51: Encapsulation.
1 private String name;
2
3 /**
4 * This is a getter method because it accesses data from the object.
5 */
6 public String getName() {
7 return name;
8 }
9
10 /**
11 * This is a setter method because it changes data in the object.
12 */
13 public boolean setName(String newName) {
14 if (newName == null) {
15 return false;
16 } else {
17 name = newName;
18 return true;
19 }
20 }
In the code section 3.512 , the setName() method will only change the value of name if the
new name is not null. Because setName() is conditionally changing name, it is wise to
return a boolean to let the program know if the change was successful.
Question 3.15: Consider the following class.
Question 3.15: [Link]
List the fields and methods of this class that can be renamed without changing or even
knowing the client classes.
1. unununununununununCrummyName
296
Field encapsulation
2. mememememememeUglyName()
Every field or method that is public can be directly called by a client class so this class
would return a compile error if the field or the method has a new name.
297
41 Nested Classes
In Java you can define a class inside another class. A class can be nested inside another
class or inside a method. A class that is not nested is called a top-level class and a class
defining a nested class is an outer class.
The inner class has access to the enclosing class instance's variables and methods, even
private ones, as seen above. This makes it very different from the nested class in C++,
which are equivalent to the ”static” inner classes, see below.
An inner object has a reference to the outer object. In other words, all inner objects are
tied to the outer object. The inner object can only be created through a reference to the
'outer' object. See below.
Example:
Code section 4.20: Outer class call.
1 public void testInner() {
2 ...
3 OuterClass outer = new OuterClass();
4 [Link] inner = [Link] InnerClass();
5 ...
6 }
Note that inner objects, because they are tied to the outer object, cannot contain static
variables or methods.
When in a non-static method of the outer class, you can directly use new InnerClass(),
since the class instance is implied to be this.
299
Nested Classes
You can directly access the reference to the outer object from within an inner class with the
syntax [Link]; although this is usually unnecessary because you already have
access to its fields and methods.
Inner classes compile to separate ”.class” bytecode files, with the name of the enclosing class,
followed by a ”$”, followed by the name of the inner class. So for example, the above inner
class would be compiled to a file named ”OuterClass$[Link]”.
In addition to instance variables of the enclosing class, local classes can also access local
variables of the enclosing method, but only ones that are declared final. This is because
the local class instance might outlive the invocation of the method, and so needs its own
copy of the variable. To avoid problems with having two different copies of a mutable
variable with the same name in the same scope, it is required to be final, so it cannot be
changed.
300
Anonymous Classes
Example:
Code section 4.21: Anonymous class.
1 ActionListener listener = new ActionListener() {
2 public void actionPerformed() {
3 // Implementation of the action event
4 ...
5 return;
6 }
7 };
In the above example the class that implements the ActionListener is anonymous. The
class is defined where it is instantiated.
The above code is harder to read than if the class is explicitly defined, so why use it? If many
implementations are needed for an interface, those classes are used only in one particular
place, and it would be hard to come up with names for them, using an anonymous inner
class makes sense.
The following example uses an anonymous inner class to implement an action listener.
Code listing 4.13: [Link]
1 import [Link];
2 import [Link];
3 import [Link];
4
5 class MyApp {
6 Button aButton = new Button();
7
8 MyApp() {
9 [Link](new ActionListener() {
10 public void actionPerformed(ActionEvent e) {
11 [Link](”Hello There”);
12 }
13 }
14 );
15 }
16 }
The following example does the same thing, but it names the class that implements the
action listener. Code listing 4.14: [Link]
1 import [Link];
2 import [Link];
3 import [Link];
4
5 class MyApp {
6 Button aButton = new Button();
7
8 // Nested class to implement the action listener
9 class MyActionListener implements ActionListener {
10 public void actionPerformed(ActionEvent e) {
11 [Link](”Hello There”);
12 }
301
Nested Classes
13 }
14 MyApp() {
15 [Link](new MyActionListener());
16 }
17 }
Using anonymous classes is especially preferable when you intend to use many different
classes that each implement the same interface.
302
42 Generics
Java is a strongly typed language, so a field in a class may be typed like this: Code listing
4.34: [Link]
This ensures that, only Integer objects can be put in the field and a ClassCastException
can't occur at runtime, only compile-time error can occur. Unfortunately, it can be used
only with Integer objects. If you want to use the same class in another context with
Strings, you have to generalize the type like this: Code listing 4.35: [Link]
But you will have ClassCastException at runtime again and you can't easily use your
field. The solution is to use Generics1 .
1 [Link]
303
Generics
instantiation. This allows the generic type to be different from an instance to another. So
we should write our class this way: Code listing 4.36: [Link]
Here, the generic type is defined after the name of the class. Any new identifier can be
chosen. Here, we have chosen T, which is the most common choice. The actual type is
defined at the object instantiation:
Example:
Code section 4.35: Instantiation.
1 Repository<Integer> arithmeticRepository = new Repository<Integer>();
2 [Link](new Integer(1));
3 Integer number = [Link]();
4
5 Repository<String> textualRepository = new Repository<String>();
6 [Link]("Hello!");
7 String message = [Link]();
Although each object instance has its own type, each object instance is still strongly typed:
1 Warning
Code section 4.36: Compile error.
1 Repository<Integer> arithmeticRepository = new Repository<Integer>();
2 [Link]("Hello!");
A class can define as many generic types as you like. Choose a different identifier for each
generic type and separate them by a comma:
Code listing 4.37: [Link]
304
Generic method
12 item = newItem;
13 }
14
15 public U getAnotherItem() {
16 return anotherItem;
17 }
18
19 public void setAnotherItem(U newItem) {
20 anotherItem = newItem;
21 }
22 }
When a type that is defined with generic (for example, Collection<T>) is not used with
generics (for example, Collection) is called a raw type.
Example:
Code section 4.37: Generic method.
1 public <D> D assign(Collection<D> generic, D obj) {
2 [Link](obj);
3 return obj;
4 }
Here a new identifier (D) has been chosen at the beginning of the method declaration.
The type is specific to a method call and different types can be used for the same object
instance:
Example:
Code section 4.38: Generic method call.
1 Collection<Integer> numbers = new ArrayList<Integer>();
2 Integer number = assign(numbers, new Integer(1));
3 Collection<String> texts = new ArrayList<String>();
4 String text = assign(texts, "Store it.");
The actual type will be defined by the type of the method parameter. Hence, the generic
type can't be defined only for the return value as it wouldn't be resolved. See the
Class<T>2 section for a solution. Question 4.8: Consider the following class. Question
4.8: [Link]
305
Generics
Console:
Console for Answer 4.8
Here is the text: Open your mind.
Example:
Code section 4.39: Wildcard type.
1 Collection<?> collUnknown;
306
Wildcard Types
Example:
Code section 4.40: Collection of serializable subobjects.
1 Collection<String> textColl = new ArrayList<String>();
2
3 Collection<? extends Serializable> serColl = textColl;
The above code is valid because the String class is serializable. Use of a class that is
not serializable would cause a compilation error. The added items can be retrieved as
Serializable object. You can call methods of the Serializable interface or cast it to
String. The following collection can only contain objects that extend the class Animal.
Code listing 4.38: [Link]
Example:
Code section 4.41: Example of subclass.
1 // Create "Animal Collection" variable
2 Collection<? extends Animal> animalColl = new ArrayList<Dog>();
Example:
Code section 4.42: Superclass.
1 Comparator<? super Dog> myComparator;
Example:
Code section 4.43: Comparator.
1 class AnimalComparator implements Comparator<Animal> {
2 int compare(Animal a, Animal b) {
3 //...
4 }
5 }
307
Generics
Since Dogs are Animals, you can use this comparator to compare Dogs also. Comparators
for any superclass of Dog can also compare Dog; but comparators for any strict subclass
cannot.
Example:
Code section 4.44: Generic comparator.
1 Comparator<Animal> myAnimalComparator = new AnimalComparator();
2
3 static int compareTwoDogs(Comparator<? super Dog> comp, Dog dog1, Dog dog2) {
4 return [Link](dog1, dog2);
5 }
The above code is valid because the Animal class is a supertype of the Dog class. Use of a
class that is not a supertype would cause a compilation error.
Example:
Code section 4.45: Unsafe operation.
1 public void addAtBottom(Collection anyCollection) {
2 [Link](new Integer(1));
3 }
This code will compile but this code may corrupt the collection if the collection only contains
strings:
Example:
Code section 4.46: Corruption of list.
1 List<String> col = new ArrayList<String>();
2 addAtBottom(col);
3 [Link](0).endsWith(".");
Console:
Console for Code section 4.46
Exception in thread "main" [Link]: [Link]
incompatible with [Link]
at [Link]([Link])
This situation could have been avoided if the addAtBottom(Collection) method was de-
fined with an unbounded wildcard: addAtBottom(Collection<?>). With this signature,
it is impossible to compile a code that is dependent of the parameterized type. Only inde-
pendent methods of a collection (clear(), isEmpty(), iterator(), remove(Object o),
308
Class<T>
size(), ...) can be called. For instance, addAtBottom(Collection<?>) could contain the
following code:
Example:
Code section 4.47: Safe operation.
1 public void addAtBottom(Collection<?> anyCollection) {
2 Iterator<?> iterator = [Link]();
3 while ([Link]()) {
4 [Link]([Link]());
5 }
6 }
42.4 Class<T>
Since Java 1.5, the class [Link] is generic. It is an interesting example of using
generics for something other than a container class. For example, the type of [Link]
is Class<String>, and the type of [Link] is Class<Serializable>. This can
be used to improve the type safety of your reflection code. In particular, since the
newInstance() method in Class now returns T, you can get more precise types when creat-
ing objects reflectively. Now we can use the newInstance() method to return a new object
with exact type, without casting. An example with generics:
Example:
Code section 4.48: Automatic cast.
1 Customer cust = [Link]([Link]); // No casting
2 ...
3 public static <T> T createAnyObject(Class<T> cls) {
4 T ret = null;
5 try {
6 ret = [Link]();
7 } catch (Exception e) {
8 // Exception Handling
9 }
10 return ret;
11 }
309
Generics
Example:
Code section 4.49: Former version.
1 Customer cust = (Customer) [Link]([Link]); //
Casting
2 is needed
3 ...
4 public static Object createAnyObject(Class cls) {
5 Object ret = null;
6 try {
7 ret = [Link]();
8 } catch (Exception e) {
9 // Exception Handling
10 }
11 return ret;
12 }
42.5 Motivation
Java was long criticized for the need to explicitly type-cast an element when it was taken
out of a ”container/collection” class. There was no way to enforce that a ”collection” class
contains only one type of object (e.g., to forbid at compile time that an Integer object
is added to a Collection that should only contain Strings). This is possible since Java
1.5. In the first couple of years of Java evolution, Java did not have a real competitor.
This has changed by the appearance of Microsoft C#. With Generics Java is better suited
to compete against C#. Similar constructs to Java Generics exist in other languages, see
Generic programming3 for more information. Generics were added to the Java language
syntax in version 1.5. This means that code using Generics will not compile with Java 1.4
and less. Use of generics is optional. For backwards compatibility with pre-Generics code,
it is okay to use generic classes without the generics type specification (<T>). In such a case,
when you retrieve an object reference from a generic object, you will have to manually cast
it from type Object to the correct type.
Example:
Code section 4.50: Java generics.
1 Collection<String> collString = new ArrayList<String>();
2 Collection<Integer> collInteger = new ArrayList<Integer>();
3 [Link]
310
Note for C++ programmers
Both these objects appear as the same type at runtime (both ArrayList's). The generic
type information is erased during compilation (type erasure). For example:
Example:
Code section 4.51: Type erasure.
1 public <T> void method(T argument) {
2 T variable;
3 …
4 }
Example:
Code section 4.52: Transformation.
1 public void method(Object argument) {
2 Object variable;
3 …
4 }
1 import [Link];
2 import [Link];
3
4 public class Question9 {
5 public static void main(String[] args) {
6 Collection<String> collection1 = new ArrayList<String>();
7 Collection<? extends Object> collection2 = new ArrayList<String>();
8 Collection<? extends String> collection3 = new ArrayList<String>();
9 Collection<? extends String> collection4 = new ArrayList<Object>();
10 Collection<? super Object> collection5 = new ArrayList<String>();
11 Collection<? super Object> collection6 = new ArrayList<Object>();
12 Collection<?> collection7 = new ArrayList<String>();
13 Collection<? extends Object> collection8 = new ArrayList<?>();
14 Collection<? extends Object> collection9 = new ArrayList<Object>();
15 Collection<? extends Integer> collection10 = new ArrayList<String>();
16 Collection<String> collection11 = new ArrayList<? extends String>();
17 Collection collection12 = new ArrayList<String>();
18 }
19 }
1 import [Link];
2 import [Link];
3
4 public class Answer9 {
5 public static void main(String[] args) {
6 Collection<String> collection1 = new ArrayList<String>();
7 Collection<? extends Object> collection2 = new ArrayList<String>();
8 Collection<? extends String> collection3 = new ArrayList<String>();
9 Collection<? extends String> collection4 = new ArrayList<Object>();
10 Collection<? super Object> collection5 = new ArrayList<String>();
311
Generics
312
43 Contributors
Edits User
1 1997kB1
1 94rain2
29 A.T.M.Schipperijn3
1 AGMS4
1 Abdull5
2 Abhijaju6
1 AdRiley7
36 Adrignola8
1 Akumm2k9
3 Alainr34510
3 Albmont11
1 Alexander.orlov12
1 Alextejthompson13
1 Alexy1014
2 AllenZh15
1 Alsocal16
1 Amokk.zgz17
1 Andrybak18
1 Anjishnu1519
1 Antidrugue20
1 [Link]
2 [Link]
[Link]
3
redlink=1
4 [Link]
5 [Link]
6 [Link]
7 [Link]
8 [Link]
9 [Link]
10 [Link]
11 [Link]
[Link]
12
redlink=1
13 [Link]
14 [Link]
15 [Link]
16 [Link]
17 [Link]
18 [Link]
19 [Link]
20 [Link]
313
Contributors
1 Aphonik~enwikibooks21
1 Apocalyte22
1 Arsenalfan23
240 Arunreginald24
7 Ashmailit25
4 Atcovi26
6 Audriusa27
1 Avicennasis28
2 Az156829
1 Badgecrimson30
6 BenTels31
1 Beno100032
5 Bheilig33
1 Billy the Goat II34
1 Boaz Benzvi35
5 Brzlnboi36
1 Bxj37
1 CSB radio38
6 Callkalpa39
1 Case45140
1 Ceclauson41
1 Cg0def~enwikibooks42
1 Chaofan2543
1 Chazz44
[Link]
21
redlink=1
22 [Link]
23 [Link]
24 [Link]
25 [Link]
26 [Link]
27 [Link]
28 [Link]
29 [Link]
30 [Link]
31 [Link]
32 [Link]
33 [Link]
[Link]
34
redlink=1
35 [Link]
36 [Link]
37 [Link]
38 [Link]
39 [Link]
40 [Link]
41 [Link]
[Link]
42
redlink=1
43 [Link]
44 [Link]
314
Note for C++ programmers
2 Chiapr~enwikibooks45
1 Chornge46
1 Cleartrain47
8 Colfulus48
1 CommonsDelinker49
2 Corax2650
1 Crcarter51
1 Cshinx52
1 Cspurrier53
1 Cyoub54
3 Dallas127855
2 Dan Polansky56
1 DanCherek57
1 Danny8129958
43 DannyS71259
1 Darklama60
5 Darkxxxxillusion61
5 Davemulkey62
2 DavidBourguignon63
4 DavidCary64
1 DavidL65
1 Deanonwiki66
1 Deathlaser67
1 Derbeth68
1 Desb4269
[Link]
45
redlink=1
46 [Link]
47 [Link]
48 [Link]
49 [Link]
50 [Link]
51 [Link]
52 [Link]
53 [Link]
54 [Link]
55 [Link]
56 [Link]
57 [Link]
58 [Link]
59 [Link]
60 [Link]
[Link]
61
redlink=1
62 [Link]
[Link]
63
redlink=1
64 [Link]
65 [Link]
66 [Link]
67 [Link]
68 [Link]
69 [Link]
315
Contributors
1 Devourer0970
1 Dino Bronto Rex71
25 Dirk Hünniger72
3 Dirk gently~enwikibooks73
12 DisturbedNerd999~enwikibooks74
93 Djb75
1 Dmonego76
1 Dooyamind77
1 Drawde83~enwikibooks78
1 Dumbmoron201879
2 Dwightdda80
1 EG1681
1 Elton82
714 Ervinn83
1 Escortkeel84
3 Esquivalience85
1 Evj86
6 Exabyte~enwikibooks87
2 Explanator88
1 FJalchemist89
1 Federhalter90
3 Felipe Dachshund91
5 Felipeochoa091892
4 Fishpi93
1 Fkereki94
70 [Link]
71 [Link]
72 [Link]
[Link]
73
edit&redlink=1
74 [Link]
75 [Link]
76 [Link]
77 [Link]
78 [Link]
79 [Link]
80 [Link]
81 [Link]
82 [Link]
83 [Link]
84 [Link]
85 [Link]
86 [Link]
87 [Link]
88 [Link]
89 [Link]
90 [Link]
[Link]
91
redlink=1
[Link]
92
redlink=1
93 [Link]
94 [Link]
316
Note for C++ programmers
5 Forage95
2 Fraterm~enwikibooks96
2 Fredmaranhao97
238 Ftiercel98
3 Gandalfxviv99
1 Geekler~enwikibooks100
1 Gilward Kukel101
4 Glaisher102
2 GoLLoXp103
1 Good afternoon104
1 Greenbreen105
2 Grokus106
1 Grunny107
6 Guangpu.huang108
1 Gxwarr109
1 HMPerson1110
1 Harrybrowne1986111
6 Haukli112
6 Hbar~enwikibooks113
1 Hermione1980114
1 HethrirBot115
2 Hillowrym116
1 HotBBQ117
3 Hungariantoast118
95 [Link]
[Link]
96
redlink=1
97 [Link]
98 [Link]
99 [Link]
[Link]
100
redlink=1
101 [Link]
102 [Link]
103 [Link]
104 [Link]
105 [Link]
106 [Link]
107 [Link]
108 [Link]
109 [Link]
110 [Link]
111 [Link]
112 [Link]
[Link]
113
redlink=1
114 [Link]
115 [Link]
116 [Link]
117 [Link]
[Link]
118
1
317
Contributors
2 IMacWin95~enwikibooks119
2 IT Enginner120
1 Ian Kelling121
1 Israelzeffren122
1 Itsborin123
1 J. Finkelstein124
1 J36miles125
1 JMentis126
39 JackBot127
62 JackPotte128
2 JamesNZ129
1 JayC130
1 Jecruzs~enwikibooks131
2 Jellysandwich0132
41 Jguk133
1 Jimmyatic134
1 Jk33135
6 Jomegat136
1 Jonathan Webley137
1 Jpkotta138
1 Jspring139
1 Juanvldz140
1 Jwy141
3 Kaktus142
2 Kelti143
119 [Link]
120 [Link]
121 [Link]
122 [Link]
123 [Link]
124 [Link]
125 [Link]
126 [Link]
127 [Link]
128 [Link]
129 [Link]
130 [Link]
[Link]
131
redlink=1
[Link]
132
1
133 [Link]
134 [Link]
135 [Link]
136 [Link]
137 [Link]
138 [Link]
139 [Link]
140 [Link]
141 [Link]
142 [Link]
143 [Link]
318
Note for C++ programmers
1 Kfitzner144
2 Kittycataclysm145
1 Lcawte146
3 Leaderboard147
1 Lkesteloot148
1 LlamaAl149
1 MCEmperor150
6 Malfist151
1 Manvinsh152
32 MarcGarver153
1 Marcobiscaro2112154
15 Maths314155
2 Matiia156
3 MatrixFrog~enwikibooks157
38 Mattylaws158
1 MaxBowsher159
1 MetaBohemian~enwikibooks160
1 Migcrown161
27 Mikm~enwikibooks162
1 Mild Bill Hiccup163
1 MinderBender164
3 Minorax165
8 Mmurdoch~enwikibooks166
6 MoWasHere167
144 [Link]
145 [Link]
146 [Link]
147 [Link]
148 [Link]
149 [Link]
150 [Link]
151 [Link]
152 [Link]
153 [Link]
[Link]
154
redlink=1
155 [Link]
156 [Link]
[Link]
157
redlink=1
158 [Link]
159 [Link]
160 [Link]
161 [Link]
162 [Link]
[Link]
163
redlink=1
164 [Link]
165 [Link]
[Link]
166
redlink=1
167 [Link]
319
Contributors
3 Mrjulesd168
2 Ms2ger169
1 Mstenta170
2 N8chz171
1 Nikai172
1 Nikjava173
1 Nimrodmilo174
1 Nitrodist175
2 Nkrumpe176
3 NoToleranceForIntolerance177
1 Olivier.deste178
2 Omzig89179
5 Panic2k4180
1 PantheraLeo1359531181
1 Parthajava182
1 Pedant65183
6 Pi zero184
2 QUBot185
1 Qubodup186
8 Rappo187
1 Ravichandar84188
1 Razr Nation189
10 Recent Runes190
1 Red4tribe191
2 Ricky clarkson192
168 [Link]
169 [Link]
170 [Link]
171 [Link]
172 [Link]
173 [Link]
174 [Link]
175 [Link]
176 [Link]
[Link]
177
edit&redlink=1
178 [Link]
179 [Link]
180 [Link]
[Link]
181
redlink=1
182 [Link]
183 [Link]
184 [Link]
185 [Link]
186 [Link]
187 [Link]
188 [Link]
189 [Link]
190 [Link]
191 [Link]
[Link]
192
1
320
Note for C++ programmers
1 Robert Horning193
5 RockyJasper194
2 SHB2000195
1 Sabhandari196
117 Sae1962197
1 Salix alba198
1 Samuel Castrillo Dom.199
5 Samwilson200
1 Scratchy201
9 Sdiq77202
3 Sgxi203
10 ShakespeareFan00204
2 SharingNotes205
78 Sigma 7206
4 Spitfyre55207
1 Splibubay208
10 Spongebob88209
19 Spoon!210
1 Staph aureus211
1 Staticshakedown212
1 Stephan Kulla213
1 Stephanvaningen214
3 Steveth45215
54 Strange quark216
1 Stryn217
193 [Link]
194 [Link]
195 [Link]
196 [Link]
197 [Link]
198 [Link]
[Link]
199
redlink=1
200 [Link]
201 [Link]
202 [Link]
203 [Link]
204 [Link]
205 [Link]
206 [Link]
207 [Link]
208 [Link]
209 [Link]
210 [Link]
211 [Link]
212 [Link]
213 [Link]
214 [Link]
215 [Link]
216 [Link]
217 [Link]
321
Contributors
4 Sundar22in218
5 Sunnychan~enwikibooks219
6 Superfly Jon220
2 Surachit221
1 Svartava222
2 Synoman Barris223
5 Syum90224
1 Tahmid225
2 TamaraDeClassic226
1 Tegel227
1 TenWhile6228
2 ThatNateGuy229
3 Thephilwells230
1 Thisnamestaken~enwikibooks231
1 Tom Morris232
4 Tomz0rs233
1 Tropicalkitty234
2 Turkmen235
2 UNV236
1 Ubuprofaan237
1 Ursalist238
1 User000name239
2 Van der Hoorn240
1 Viartola241
1 Vinay h242
218 [Link]
[Link]
219
redlink=1
220 [Link]
221 [Link]
222 [Link]
223 [Link]
224 [Link]
225 [Link]
226 [Link]
227 [Link]
228 [Link]
229 [Link]
230 [Link]
[Link]
231
edit&redlink=1
232 [Link]
233 [Link]
234 [Link]
235 [Link]
236 [Link]
237 [Link]
238 [Link]
239 [Link]
240 [Link]
241 [Link]
242 [Link]
322
Note for C++ programmers
1 Vipingupta74243
1 Vitaly Zdanevich244
2 Volvens245
2 WOSlinker246
1 Wargo247
17 Weirdsomebody248
3 WereSpielChequers249
1 Whiteknight250
1 WikiBayer251
2 WikiWizard~enwikibooks252
1 WiseEyes253
1 Wjcw254
1 Wur-dene255
2 Wutzofant256
2 Xania257
2 YMS258
2 Yabobay259
5 Yuuki Mayuki~enwikibooks260
2 ZI Jony261
2 ZacharyJ262
62 ZeroOne263
1 Zorak1103264
1 Łukasz Palka~enwikibooks265
4 266
243 [Link]
244 [Link]
245 [Link]
246 [Link]
247 [Link]
248 [Link]
249 [Link]
250 [Link]
251 [Link]
[Link]
252
redlink=1
253 [Link]
254 [Link]
255 [Link]
256 [Link]
257 [Link]
258 [Link]
259 [Link]
[Link]
260
edit&redlink=1
261 [Link]
262 [Link]
263 [Link]
264 [Link]
[Link]
265
action=edit&redlink=1
266 [Link]
323
Contributors
1 267
1 268
1 269
[Link]
267 %25E4%25B8%2587%25E7%2589%25A9%25E3%2581%25AE%25E9%259C%258A%25E9%2595%25B7&action=
edit&redlink=1
[Link]
268
action=edit&redlink=1
269 [Link]
324
List of Figures
325
List of Figures
326
List of Figures
1 NASA PD
2 Peter Campbell271 , Peter Campbell272 CC-BY-SA-3.0
3 SVG by Gregory Maxwell273 , simplified by Sarang274 , SVG PD
by Gregory Maxwell275 , simplified by Sarang276
4 SVG by Gregory Maxwell277 , simplified by Sarang278 , SVG PD
by Gregory Maxwell279 , simplified by Sarang280
5 SVG by Gregory Maxwell281 , simplified by Sarang282 , SVG PD
by Gregory Maxwell283 , simplified by Sarang284
6 SVG by Gregory Maxwell285 , simplified by Sarang286 , SVG PD
by Gregory Maxwell287 , simplified by Sarang288
7 SVG by Gregory Maxwell289 , simplified by Sarang290 , SVG PD
by Gregory Maxwell291 , simplified by Sarang292
8 SVG by Gregory Maxwell293 , simplified by Sarang294 , SVG PD
by Gregory Maxwell295 , simplified by Sarang296
9 SVG by Gregory Maxwell297 , simplified by Sarang298 , SVG PD
by Gregory Maxwell299 , simplified by Sarang300
10 SVG by Gregory Maxwell301 , simplified by Sarang302 , SVG PD
by Gregory Maxwell303 , simplified by Sarang304
271 [Link]
272 [Link]
273 [Link]
274 [Link]
275 [Link]
276 [Link]
277 [Link]
278 [Link]
279 [Link]
280 [Link]
281 [Link]
282 [Link]
283 [Link]
284 [Link]
285 [Link]
286 [Link]
287 [Link]
288 [Link]
289 [Link]
290 [Link]
291 [Link]
292 [Link]
293 [Link]
294 [Link]
295 [Link]
296 [Link]
297 [Link]
298 [Link]
299 [Link]
300 [Link]
301 [Link]
302 [Link]
303 [Link]
304 [Link]
327
List of Figures
305 [Link]
306 [Link]
307 [Link]
308 [Link]
309 [Link]
310 [Link]
311 [Link]
312 [Link]
313 [Link]
314 [Link]
315 [Link]
316 [Link]
317 [Link]
318 [Link]
319 [Link]
320 [Link]
321 [Link]
322 [Link]
323 [Link]
324 [Link]
325 [Link]
326 [Link]
327 [Link]
328 [Link]
329 [Link]
330 [Link]
331 [Link]
332 [Link]
333 [Link]
334 [Link]
328
List of Figures
335 [Link]
336 [Link]
337 [Link]
338 [Link]
339 [Link]
340 [Link]
341 [Link]
342 [Link]
343 [Link]
344 [Link]
345 [Link]
346 [Link]
347 [Link]
348 [Link]
349 [Link]
350 [Link]
351 [Link]
352 [Link]
353 [Link]
354 [Link]
355 [Link]
356 [Link]
357 [Link]
[Link]
358
1
359 [Link]
[Link]
360
1
361 [Link]
329
List of Figures
[Link]
362
1
363 [Link]
[Link]
364
1
365 [Link]
[Link]
366
1
367 [Link]
[Link]
368
1
369 [Link]
[Link]
370
1
371 [Link]
[Link]
372
1
373 [Link]
[Link]
374
1
375 [Link]
376 [Link]
377 [Link]
378 [Link]
379 [Link]
380 [Link]
381 [Link]
382 [Link]
383 [Link]
384 [Link]
385 [Link]
[Link]
386
1
387 [Link]
[Link]
388
1
389 [Link]
330
44 Licenses