100% found this document useful (5 votes)
35 views

Introduction to Programming Using Java free on line 1st Edition David J. Eck ([email protected]) 2024 scribd download

Java

Uploaded by

panoorjanth
Copyright
© © All Rights Reserved
Available Formats
Download as PDF, TXT or read online on Scribd
100% found this document useful (5 votes)
35 views

Introduction to Programming Using Java free on line 1st Edition David J. Eck ([email protected]) 2024 scribd download

Java

Uploaded by

panoorjanth
Copyright
© © All Rights Reserved
Available Formats
Download as PDF, TXT or read online on Scribd
You are on page 1/ 50

Get ebook downloads in full at ebookmeta.

com

Introduction to Programming Using Java free on


line 1st Edition David J. Eck ([email protected])

https://ebookmeta.com/product/introduction-to-programming-
using-java-free-on-line-1st-edition-david-j-eck-eckhws-edu/

OR CLICK BUTTON

DOWNLOAD NOW

Explore and download more ebook at https://ebookmeta.com


Recommended digital products (PDF, EPUB, MOBI) that
you can download immediately if you are interested.

Mathematical Computing An Introduction to Programming


Using Maple Betounes David Redfern Mylan

https://ebookmeta.com/product/mathematical-computing-an-introduction-
to-programming-using-maple-betounes-david-redfern-mylan/

ebookmeta.com

Guide to Java: A Concise Introduction to Programming (2nd


Edition) James T. Streib

https://ebookmeta.com/product/guide-to-java-a-concise-introduction-to-
programming-2nd-edition-james-t-streib/

ebookmeta.com

Java An Introduction to Problem Solving and Programming


7th Edition Walter Savith

https://ebookmeta.com/product/java-an-introduction-to-problem-solving-
and-programming-7th-edition-walter-savith/

ebookmeta.com

A Primer on Scientific Programming with Python Texts in


Computational Science and Engineering 6 Langtangen

https://ebookmeta.com/product/a-primer-on-scientific-programming-with-
python-texts-in-computational-science-and-engineering-6-langtangen/

ebookmeta.com
Insight Guides Tanzania Zanzibar 4th Edition Insight Guies

https://ebookmeta.com/product/insight-guides-tanzania-zanzibar-4th-
edition-insight-guies/

ebookmeta.com

Safe Haven (Grove City Omegas Book 1) 1st Edition Jarica


James

https://ebookmeta.com/product/safe-haven-grove-city-omegas-book-1-1st-
edition-jarica-james/

ebookmeta.com

Fictional Portrayals of Spain s Transition to Democracy


Transitional Fantasies 1st Edition Anne L. Walsh

https://ebookmeta.com/product/fictional-portrayals-of-spain-s-
transition-to-democracy-transitional-fantasies-1st-edition-anne-l-
walsh/
ebookmeta.com

The Good Immigrants How the Yellow Peril Became the Model
Minority Madeline Y. Hsu

https://ebookmeta.com/product/the-good-immigrants-how-the-yellow-
peril-became-the-model-minority-madeline-y-hsu/

ebookmeta.com

Introduction to Advertising Understanding and Managing the


Advertising Process 1st Edition Emmanuel Mogaji

https://ebookmeta.com/product/introduction-to-advertising-
understanding-and-managing-the-advertising-process-1st-edition-
emmanuel-mogaji/
ebookmeta.com
Nature-based Solutions and Water Security: An Action
Agenda for the 21st Century 1st Edition Jan Cassin

https://ebookmeta.com/product/nature-based-solutions-and-water-
security-an-action-agenda-for-the-21st-century-1st-edition-jan-cassin/

ebookmeta.com
Introduction to Programming Using Java
Version 9, JavaFX Edition
May, 2022

David J. Eck
Hobart and William Smith Colleges

This is a PDF version of a free on-line book that is available at


https://math.hws.edu/javanotes/. The PDF does not include
source code files, solutions to exercises, or answers to quizzes, but
it does have external links to these resources, shown in blue.
The PDF also has internal links, shown in red. These links can
be used in Acrobat Reader and some other PDF reader programs.
ii

©1996–2022, David J. Eck

David J. Eck ([email protected])


Department of Mathematics and Computer Science
Hobart and William Smith Colleges
Geneva, NY 14456

This book can be distributed in unmodified form for non-commercial purposes.


Modified versions can be made and distributed for non-commercial purposes
provided they are distributed under the same license as the original. More
specifically: This work is licensed under the Creative Commons Attribution-
NonCommercial-ShareAlike 4.0 License. To view a copy of this license, visit
http://creativecommons.org/licenses/by-nc-sa/4.0/. Other uses require
permission from the author.

The web site for this book is: https://math.hws.edu/javanotes


Contents

Preface xi

1 The Mental Landscape 1


1.1 Machine Language . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1
1.2 Asynchronous Events . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3
1.3 The Java Virtual Machine . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7
1.4 Building Blocks of Programs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9
1.5 Object-oriented Programming . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11
1.6 The Modern User Interface . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13
1.7 The Internet and Beyond . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15
Quiz on Chapter 1 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18

2 Names and Things 19


2.1 The Basic Java Application . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19
2.2 Variables and Types . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23
2.2.1 Variables . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24
2.2.2 Types . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25
2.2.3 Literals . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26
2.2.4 Strings and String Literals . . . . . . . . . . . . . . . . . . . . . . . . . . . 27
2.2.5 Variables in Programs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28
2.3 Objects and Subroutines . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29
2.3.1 Built-in Subroutines and Functions . . . . . . . . . . . . . . . . . . . . . . 30
2.3.2 Classes and Objects . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33
2.3.3 Operations on Strings . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 34
2.3.4 Text Blocks: Multiline Strings . . . . . . . . . . . . . . . . . . . . . . . . 36
2.3.5 Introduction to Enums . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 37
2.4 Text Input and Output . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 38
2.4.1 Basic Output and Formatted Output . . . . . . . . . . . . . . . . . . . . . 39
2.4.2 A First Text Input Example . . . . . . . . . . . . . . . . . . . . . . . . . . 41
2.4.3 Basic TextIO Input Functions . . . . . . . . . . . . . . . . . . . . . . . . . 42
2.4.4 Introduction to File I/O . . . . . . . . . . . . . . . . . . . . . . . . . . . . 44
2.4.5 Other TextIO Features . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 46
2.4.6 Using Scanner for Input . . . . . . . . . . . . . . . . . . . . . . . . . . . . 47
2.5 Details of Expressions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 49
2.5.1 Arithmetic Operators . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 50
2.5.2 Increment and Decrement . . . . . . . . . . . . . . . . . . . . . . . . . . . 50
2.5.3 Relational Operators . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 51
2.5.4 Boolean Operators . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 52

i
CONTENTS ii

2.5.5 Conditional Operator . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 53


2.5.6 Assignment Operators and Type Conversion . . . . . . . . . . . . . . . . 53
2.5.7 Precedence Rules . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 55
2.6 Programming Environments . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 56
2.6.1 Getting a JDK . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 56
2.6.2 Command Line Environment . . . . . . . . . . . . . . . . . . . . . . . . . 57
2.6.3 Eclipse IDE . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 60
2.6.4 BlueJ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 64
2.6.5 The Problem of Packages . . . . . . . . . . . . . . . . . . . . . . . . . . . 65
2.6.6 About jshell . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 65
2.6.7 JavaFX on the Command Line . . . . . . . . . . . . . . . . . . . . . . . . 66
2.6.8 Using JavaFX in Eclipse . . . . . . . . . . . . . . . . . . . . . . . . . . . . 68
Exercises for Chapter 2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 71
Quiz on Chapter 2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 73

3 Control 75
3.1 Blocks, Loops, and Branches . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 75
3.1.1 Blocks . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 75
3.1.2 The Basic While Loop . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 76
3.1.3 The Basic If Statement . . . . . . . . . . . . . . . . . . . . . . . . . . . . 79
3.1.4 Control Abstractiont . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 81
3.1.5 Definite Assignment . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 82
3.2 Algorithm Development . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 83
3.2.1 Pseudocode and Stepwise Refinement . . . . . . . . . . . . . . . . . . . . 83
3.2.2 The 3N+1 Problem . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 86
3.2.3 Coding, Testing, Debugging . . . . . . . . . . . . . . . . . . . . . . . . . . 89
3.3 while and do..while . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 91
3.3.1 The while Statement . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 91
3.3.2 The do..while Statement . . . . . . . . . . . . . . . . . . . . . . . . . . . . 93
3.3.3 break and continue . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 95
3.4 The for Statement . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 97
3.4.1 For Loops . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 97
3.4.2 Example: Counting Divisors . . . . . . . . . . . . . . . . . . . . . . . . . . 100
3.4.3 Nested for Loops . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 102
3.5 The if Statement . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 105
3.5.1 The Dangling else Problem . . . . . . . . . . . . . . . . . . . . . . . . . . 106
3.5.2 Multiway Branching . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 106
3.5.3 If Statement Examples . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 108
3.5.4 The Empty Statement . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 112
3.6 The switch Statement . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 113
3.6.1 The Basic switch Statement . . . . . . . . . . . . . . . . . . . . . . . . . . 113
3.6.2 Menus and switch Statements . . . . . . . . . . . . . . . . . . . . . . . . . 115
3.6.3 Enums in switch Statements . . . . . . . . . . . . . . . . . . . . . . . . . 116
3.6.4 Definite Assignment and switch Statements . . . . . . . . . . . . . . . . . 117
3.6.5 Switch Expressions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 118
3.6.6 The Traditional switch Statement . . . . . . . . . . . . . . . . . . . . . . 118
3.7 Exceptions and try..catch . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 120
CONTENTS iii

3.7.1 Exceptions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 120


3.7.2 try..catch . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 120
3.7.3 Exceptions in TextIO . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 122
3.8 Introduction to Arrays . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 124
3.8.1 Creating and Using Arrays . . . . . . . . . . . . . . . . . . . . . . . . . . 124
3.8.2 Arrays and For Loops . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 126
3.8.3 Random Access . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 128
3.8.4 Partially Full Arrays . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 129
3.8.5 Two-dimensional Arrays . . . . . . . . . . . . . . . . . . . . . . . . . . . . 131
3.9 GUI Programming . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 132
3.9.1 Drawing Shapes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 133
3.9.2 Drawing in a Program . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 136
3.9.3 Animation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 137
Exercises for Chapter 3 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 140
Quiz on Chapter 3 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 144

4 Subroutines 147
4.1 Black Boxes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 147
4.2 Static Subroutines and Variables . . . . . . . . . . . . . . . . . . . . . . . . . . . 149
4.2.1 Subroutine Definitions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 150
4.2.2 Calling Subroutines . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 152
4.2.3 Subroutines in Programs . . . . . . . . . . . . . . . . . . . . . . . . . . . . 152
4.2.4 Member Variables . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 155
4.3 Parameters . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 158
4.3.1 Using Parameters . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 158
4.3.2 Formal and Actual Parameters . . . . . . . . . . . . . . . . . . . . . . . . 159
4.3.3 Overloading . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 161
4.3.4 Subroutine Examples . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 161
4.3.5 Array Parameters . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 163
4.3.6 Command-line Arguments . . . . . . . . . . . . . . . . . . . . . . . . . . . 164
4.3.7 Throwing Exceptions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 166
4.3.8 Global and Local Variables . . . . . . . . . . . . . . . . . . . . . . . . . . 166
4.4 Return Values . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 167
4.4.1 The return statement . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 167
4.4.2 Function Examples . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 168
4.4.3 3N+1 Revisited . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 171
4.5 Lambda Expressions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 173
4.5.1 First-class Functions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 173
4.5.2 Functional Interfaces . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 174
4.5.3 Lambda Expressions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 175
4.5.4 Method References . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 177
4.6 APIs, Packages, Modules, and Javadoc . . . . . . . . . . . . . . . . . . . . . . . . 178
4.6.1 Toolboxes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 178
4.6.2 Java’s Standard Packages . . . . . . . . . . . . . . . . . . . . . . . . . . . 179
4.6.3 Using Classes from Packages . . . . . . . . . . . . . . . . . . . . . . . . . 181
4.6.4 About Modules . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 182
4.6.5 Javadoc . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 184
CONTENTS iv

4.6.6 Static Import . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 185


4.7 More on Program Design . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 186
4.7.1 Preconditions and Postconditions . . . . . . . . . . . . . . . . . . . . . . . 187
4.7.2 A Design Example . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 187
4.7.3 The Program . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 192
4.8 The Truth About Declarations . . . . . . . . . . . . . . . . . . . . . . . . . . . . 194
4.8.1 Initialization in Declarations . . . . . . . . . . . . . . . . . . . . . . . . . 194
4.8.2 Declaring Variables with var . . . . . . . . . . . . . . . . . . . . . . . . . 196
4.8.3 Named Constants . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 196
4.8.4 Naming and Scope Rules . . . . . . . . . . . . . . . . . . . . . . . . . . . 199
Exercises for Chapter 4 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 202
Quiz on Chapter 4 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 205

5 Objects and Classes 207


5.1 Objects and Instance Methods . . . . . . . . . . . . . . . . . . . . . . . . . . . . 207
5.1.1 Objects, Classes, and Instances . . . . . . . . . . . . . . . . . . . . . . . . 208
5.1.2 Fundamentals of Objects . . . . . . . . . . . . . . . . . . . . . . . . . . . 210
5.1.3 Getters and Setters . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 215
5.1.4 Arrays and Objects . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 216
5.2 Constructors and Object Initialization . . . . . . . . . . . . . . . . . . . . . . . . 217
5.2.1 Initializing Instance Variables . . . . . . . . . . . . . . . . . . . . . . . . . 218
5.2.2 Constructors . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 219
5.2.3 Garbage Collection . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 224
5.3 Programming with Objects . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 225
5.3.1 Some Built-in Classes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 225
5.3.2 The class “Object” . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 227
5.3.3 Writing and Using a Class . . . . . . . . . . . . . . . . . . . . . . . . . . . 228
5.3.4 Object-oriented Analysis and Design . . . . . . . . . . . . . . . . . . . . . 230
5.4 Programming Example: Card, Hand, Deck . . . . . . . . . . . . . . . . . . . . . . 232
5.4.1 Designing the classes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 232
5.4.2 The Card Class . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 235
5.4.3 Example: A Simple Card Game . . . . . . . . . . . . . . . . . . . . . . . . 238
5.5 Inheritance and Polymorphism . . . . . . . . . . . . . . . . . . . . . . . . . . . . 241
5.5.1 Extending Existing Classes . . . . . . . . . . . . . . . . . . . . . . . . . . 242
5.5.2 Inheritance and Class Hierarchy . . . . . . . . . . . . . . . . . . . . . . . 244
5.5.3 Example: Vehicles . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 245
5.5.4 Polymorphism . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 247
5.5.5 Abstract Classes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 250
5.5.6 Final Methods and Classes . . . . . . . . . . . . . . . . . . . . . . . . . . 253
5.6 this and super . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 253
5.6.1 The Special Variable this . . . . . . . . . . . . . . . . . . . . . . . . . . . 253
5.6.2 The Special Variable super . . . . . . . . . . . . . . . . . . . . . . . . . . 255
5.6.3 super and this As Constructors . . . . . . . . . . . . . . . . . . . . . . . . 256
5.7 Interfaces . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 257
5.7.1 Defining and Implementing Interfaces . . . . . . . . . . . . . . . . . . . . 258
5.7.2 Default Methods . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 260
5.7.3 Interfaces as Types . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 261
CONTENTS v

5.8 Nested Classes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 262


5.8.1 Static Nested Classes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 262
5.8.2 Inner Classes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 263
5.8.3 Anonymous Inner Classes . . . . . . . . . . . . . . . . . . . . . . . . . . . 264
5.8.4 Local Classes and Lambda Expressions . . . . . . . . . . . . . . . . . . . 266
Exercises for Chapter 5 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 268
Quiz on Chapter 5 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 272

6 Introduction to GUI Programming 275


6.1 A Basic JavaFX Application . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 275
6.1.1 JavaFX Applications . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 276
6.1.2 Stage, Scene, and SceneGraph . . . . . . . . . . . . . . . . . . . . . . . . 278
6.1.3 Nodes and Layout . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 279
6.1.4 Events and Event Handlers . . . . . . . . . . . . . . . . . . . . . . . . . . 280
6.2 Some Basic Classes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 281
6.2.1 Color and Paint . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 281
6.2.2 Fonts . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 282
6.2.3 Image . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 283
6.2.4 Canvas and GraphicsContext . . . . . . . . . . . . . . . . . . . . . . . . . 284
6.2.5 A Bit of CSS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 289
6.3 Basic Events . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 291
6.3.1 Event Handling . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 292
6.3.2 Mouse Events . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 293
6.3.3 Dragging . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 295
6.3.4 Key Events . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 298
6.3.5 AnimationTimer . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 300
6.3.6 State Machines . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 301
6.3.7 Observable Values . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 304
6.4 Basic Controls . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 305
6.4.1 ImageView . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 306
6.4.2 Label and Button . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 306
6.4.3 CheckBox and RadioButton . . . . . . . . . . . . . . . . . . . . . . . . . . 308
6.4.4 TextField and TextArea . . . . . . . . . . . . . . . . . . . . . . . . . . . . 310
6.4.5 Slider . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 312
6.5 Basic Layout . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 314
6.5.1 Do Your Own Layout . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 315
6.5.2 BorderPane . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 317
6.5.3 HBox and VBox . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 319
6.5.4 GridPane and TilePane . . . . . . . . . . . . . . . . . . . . . . . . . . . . 322
6.6 Complete Programs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 325
6.6.1 A Little Card Game . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 325
6.6.2 Menus and Menubars . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 328
6.6.3 Scene and Stage . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 331
6.6.4 Creating Jar Files . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 333
6.6.5 jpackage . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 334
Exercises for Chapter 6 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 336
Quiz on Chapter 6 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 342
CONTENTS vi

7 Arrays, ArrayLists, and Records 343


7.1 Array Details . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 343
7.1.1 For-each Loops . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 344
7.1.2 Variable Arity Methods . . . . . . . . . . . . . . . . . . . . . . . . . . . . 346
7.1.3 Array Literals . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 347
7.2 Array Processing . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 349
7.2.1 Some Processing Examples . . . . . . . . . . . . . . . . . . . . . . . . . . 349
7.2.2 Some Standard Array Methods . . . . . . . . . . . . . . . . . . . . . . . . 352
7.2.3 RandomStrings Revisited . . . . . . . . . . . . . . . . . . . . . . . . . . . 354
7.2.4 Dynamic Arrays . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 357
7.3 ArrayList . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 359
7.3.1 ArrayList and Parameterized Types . . . . . . . . . . . . . . . . . . . . . 359
7.3.2 Wrapper Classes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 361
7.3.3 Programming With ArrayList . . . . . . . . . . . . . . . . . . . . . . . . . 363
7.4 Records . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 366
7.4.1 Basic Java Records . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 366
7.4.2 More Record Syntax . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 368
7.4.3 A Complex Example . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 369
7.5 Searching and Sorting . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 371
7.5.1 Searching . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 372
7.5.2 Association Lists . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 374
7.5.3 Insertion Sort . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 376
7.5.4 Selection Sort . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 378
7.5.5 Unsorting . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 380
7.6 Two-dimensional Arrays . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 380
7.6.1 The Truth About 2D Arrays . . . . . . . . . . . . . . . . . . . . . . . . . 381
7.6.2 Conway’s Game Of Life . . . . . . . . . . . . . . . . . . . . . . . . . . . . 383
7.6.3 Checkers . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 387
Exercises for Chapter 7 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 395
Quiz on Chapter 7 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 399

8 Correctness, Robustness, Efficiency 401


8.1 Introduction to Correctness and Robustness . . . . . . . . . . . . . . . . . . . . . 401
8.1.1 Horror Stories . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 402
8.1.2 Java to the Rescue . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 403
8.1.3 Problems Remain in Java . . . . . . . . . . . . . . . . . . . . . . . . . . . 405
8.2 Writing Correct Programs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 406
8.2.1 Provably Correct Programs . . . . . . . . . . . . . . . . . . . . . . . . . . 407
8.2.2 Preconditions and Postconditions . . . . . . . . . . . . . . . . . . . . . . . 407
8.2.3 Invariants . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 410
8.2.4 Robust Handling of Input . . . . . . . . . . . . . . . . . . . . . . . . . . . 413
8.3 Exceptions and try..catch . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 417
8.3.1 Exceptions and Exception Classes . . . . . . . . . . . . . . . . . . . . . . 417
8.3.2 The try Statement . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 419
8.3.3 Throwing Exceptions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 423
8.3.4 Mandatory Exception Handling . . . . . . . . . . . . . . . . . . . . . . . . 424
8.3.5 Programming with Exceptions . . . . . . . . . . . . . . . . . . . . . . . . 425
CONTENTS vii

8.4 Assertions and Annotations . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 429


8.4.1 Assertions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 429
8.4.2 Annotations . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 432
8.5 Analysis of Algorithms . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 434
Exercises for Chapter 8 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 440
Quiz on Chapter 8 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 444

9 Linked Data Structures and Recursion 445


9.1 Recursion . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 445
9.1.1 Recursive Binary Search . . . . . . . . . . . . . . . . . . . . . . . . . . . . 446
9.1.2 Towers of Hanoi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 448
9.1.3 A Recursive Sorting Algorithm . . . . . . . . . . . . . . . . . . . . . . . . 451
9.1.4 Blob Counting . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 453
9.2 Linked Data Structures . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 457
9.2.1 Recursive Linking . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 457
9.2.2 Linked Lists . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 459
9.2.3 Basic Linked List Processing . . . . . . . . . . . . . . . . . . . . . . . . . 460
9.2.4 Inserting into a Linked List . . . . . . . . . . . . . . . . . . . . . . . . . . 463
9.2.5 Deleting from a Linked List . . . . . . . . . . . . . . . . . . . . . . . . . . 465
9.3 Stacks, Queues, and ADTs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 466
9.3.1 Stacks . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 467
9.3.2 Queues . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 470
9.3.3 Postfix Expressions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 475
9.4 Binary Trees . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 478
9.4.1 Tree Traversal . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 479
9.4.2 Binary Sort Trees . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 481
9.4.3 Expression Trees . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 485
9.5 A Simple Recursive Descent Parser . . . . . . . . . . . . . . . . . . . . . . . . . . 489
9.5.1 Backus-Naur Form . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 489
9.5.2 Recursive Descent Parsing . . . . . . . . . . . . . . . . . . . . . . . . . . . 490
9.5.3 Building an Expression Tree . . . . . . . . . . . . . . . . . . . . . . . . . . 494
Exercises for Chapter 9 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 498
Quiz on Chapter 9 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 501

10 Generic Programming and Collection Classes 503


10.1 Generic Programming . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 503
10.1.1 Generic Programming in Smalltalk . . . . . . . . . . . . . . . . . . . . . . 504
10.1.2 Generic Programming in C++ . . . . . . . . . . . . . . . . . . . . . . . . 505
10.1.3 Generic Programming in Java . . . . . . . . . . . . . . . . . . . . . . . . . 506
10.1.4 The Java Collection Framework . . . . . . . . . . . . . . . . . . . . . . . . 507
10.1.5 Iterators and for-each Loops . . . . . . . . . . . . . . . . . . . . . . . . . . 509
10.1.6 Equality and Comparison . . . . . . . . . . . . . . . . . . . . . . . . . . . 511
10.1.7 Generics and Wrapper Classes . . . . . . . . . . . . . . . . . . . . . . . . 514
10.2 Lists and Sets . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 514
10.2.1 ArrayList and LinkedList . . . . . . . . . . . . . . . . . . . . . . . . . . . 515
10.2.2 Sorting . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 518
10.2.3 TreeSet and HashSet . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 519
10.2.4 Priority Queues . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 521
CONTENTS viii

10.3 Maps . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 522


10.3.1 The Map Interface . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 523
10.3.2 Views, SubSets, and SubMaps . . . . . . . . . . . . . . . . . . . . . . . . 524
10.3.3 Hash Tables and Hash Codes . . . . . . . . . . . . . . . . . . . . . . . . . 527
10.4 Programming with the JCF . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 529
10.4.1 Symbol Tables . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 529
10.4.2 Sets Inside a Map . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 531
10.4.3 Using a Comparator . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 534
10.4.4 Word Counting . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 535
10.5 Writing Generic Classes and Methods . . . . . . . . . . . . . . . . . . . . . . . . 537
10.5.1 Simple Generic Classes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 538
10.5.2 Simple Generic Methods . . . . . . . . . . . . . . . . . . . . . . . . . . . . 540
10.5.3 Wildcard Types . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 542
10.5.4 Bounded Types . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 545
10.6 Introduction the Stream API . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 548
10.6.1 Generic Functional Interfaces . . . . . . . . . . . . . . . . . . . . . . . . . 549
10.6.2 Making Streams . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 550
10.6.3 Operations on Streams . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 552
10.6.4 An Experiment . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 555
Exercises for Chapter 10 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 557
Quiz on Chapter 10 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 562

11 I/O Streams, Files, and Networking 565


11.1 I/O Streams, Readers, and Writers . . . . . . . . . . . . . . . . . . . . . . . . . . 565
11.1.1 Character and Byte Streams . . . . . . . . . . . . . . . . . . . . . . . . . 566
11.1.2 PrintWriter . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 568
11.1.3 Data Streams . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 569
11.1.4 Reading Text . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 570
11.1.5 The Scanner Class . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 571
11.1.6 Serialized Object I/O . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 573
11.2 Files . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 574
11.2.1 Reading and Writing Files . . . . . . . . . . . . . . . . . . . . . . . . . . . 574
11.2.2 Files and Directories . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 578
11.2.3 File Dialog Boxes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 580
11.3 Programming With Files . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 583
11.3.1 Copying a File . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 583
11.3.2 Persistent Data . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 586
11.3.3 Storing Objects in Files . . . . . . . . . . . . . . . . . . . . . . . . . . . . 588
11.4 Networking . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 593
11.4.1 URLs and URLConnections . . . . . . . . . . . . . . . . . . . . . . . . . . 594
11.4.2 TCP/IP and Client/Server . . . . . . . . . . . . . . . . . . . . . . . . . . 596
11.4.3 Sockets in Java . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 598
11.4.4 A Trivial Client/Server . . . . . . . . . . . . . . . . . . . . . . . . . . . . 599
11.4.5 A Simple Network Chat . . . . . . . . . . . . . . . . . . . . . . . . . . . . 603
11.5 A Brief Introduction to XML . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 607
11.5.1 Basic XML Syntax . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 608
11.5.2 Working With the DOM . . . . . . . . . . . . . . . . . . . . . . . . . . . . 609
CONTENTS ix

Exercises for Chapter 11 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 615


Quiz on Chapter 11 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 618

12 Threads and Multiprocessing 619


12.1 Introduction to Threads . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 619
12.1.1 Creating and Running Threads . . . . . . . . . . . . . . . . . . . . . . . . 620
12.1.2 Operations on Threads . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 625
12.1.3 Mutual Exclusion with “synchronized” . . . . . . . . . . . . . . . . . . . . 627
12.1.4 Volatile Variables . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 631
12.1.5 Atomic Variables . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 632
12.2 Programming with Threads . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 633
12.2.1 Threads versus Timers . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 633
12.2.2 Recursion in a Thread . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 635
12.2.3 Threads for Background Computation . . . . . . . . . . . . . . . . . . . . 637
12.2.4 Threads for Multiprocessing . . . . . . . . . . . . . . . . . . . . . . . . . . 639
12.3 Threads and Parallel Processing . . . . . . . . . . . . . . . . . . . . . . . . . . . 641
12.3.1 Problem Decomposition . . . . . . . . . . . . . . . . . . . . . . . . . . . . 641
12.3.2 Thread Pools and Task Queues . . . . . . . . . . . . . . . . . . . . . . . . 642
12.3.3 Producer/Consumer and Blocking Queues . . . . . . . . . . . . . . . . . . 645
12.3.4 The ExecutorService Approach . . . . . . . . . . . . . . . . . . . . . . . . 649
12.3.5 Wait and Notify . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 651
12.4 Threads and Networking . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 656
12.4.1 The Blocking I/O Problem . . . . . . . . . . . . . . . . . . . . . . . . . . 656
12.4.2 An Asynchronous Network Chat Program . . . . . . . . . . . . . . . . . . 658
12.4.3 A Threaded Network Server . . . . . . . . . . . . . . . . . . . . . . . . . . 661
12.4.4 Using a Thread Pool . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 663
12.4.5 Distributed Computing . . . . . . . . . . . . . . . . . . . . . . . . . . . . 665
12.5 Network Programming Example . . . . . . . . . . . . . . . . . . . . . . . . . . . 670
12.5.1 The Netgame Framework . . . . . . . . . . . . . . . . . . . . . . . . . . . 670
12.5.2 A Simple Chat Room . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 674
12.5.3 A Networked TicTacToe Game . . . . . . . . . . . . . . . . . . . . . . . . 677
12.5.4 A Networked Poker Game . . . . . . . . . . . . . . . . . . . . . . . . . . . 680
Exercises for Chapter 12 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 681
Quiz on Chapter 12 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 685

13 GUI Programming Continued 687


13.1 Properties and Bindings . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 687
13.1.1 Observable Values . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 688
13.1.2 Bindable Properties . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 689
13.1.3 Bidirectional Bindings . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 691
13.2 Fancier Graphics . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 693
13.2.1 Fancier Strokes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 694
13.2.2 Fancier Paints . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 695
13.2.3 Transforms . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 698
13.2.4 Stacked Canvasses . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 701
13.2.5 Pixel Manipulation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 702
13.2.6 Image I/O . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 705
13.3 Complex Components and MVC . . . . . . . . . . . . . . . . . . . . . . . . . . . 707
CONTENTS x

13.3.1 A Simple Custom Component . . . . . . . . . . . . . . . . . . . . . . . . . 707


13.3.2 The MVC Pattern . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 709
13.3.3 ListView and ComboBox . . . . . . . . . . . . . . . . . . . . . . . . . . . 710
13.3.4 TableView . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 714
13.4 Mostly Windows and Dialogs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 719
13.4.1 Dialog Boxes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 719
13.4.2 WebView and WebEngine . . . . . . . . . . . . . . . . . . . . . . . . . . . 722
13.4.3 Managing Multiple Windows . . . . . . . . . . . . . . . . . . . . . . . . . 723
13.5 Finishing Touches . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 727
13.5.1 The Mandelbrot Set . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 727
13.5.2 Design of the Program . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 729
13.5.3 Events, Listeners, and Bindings . . . . . . . . . . . . . . . . . . . . . . . . 732
13.5.4 A Few More GUI Details . . . . . . . . . . . . . . . . . . . . . . . . . . . 733
13.5.5 Internationalization . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 735
13.5.6 Preferences . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 737
Exercises for Chapter 13 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 739
Quiz on Chapter 13 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 741

Appendix: Source Files 743

Glossary 753
Preface

Introduction to Programming Using Java is a free introductory computer programming


textbook that uses Java as the language of instruction. This version of the book covers Java 17.
It is suitable for use in an introductory programming course and for people who are trying to
learn programming on their own. There are no prerequisites beyond a general familiarity with
the ideas of computers and programs. There is more than enough material for a full year of
college-level programming. Chapters 1 through 7 can be used as a textbook in a one-semester
college-level course or in a year-long high school course. The remaining chapters can be covered
in a second course.
The textbook home page, https://math.hws.edu/javanotes/, has links for downloading both
web site and PDF versions of the book. Example programs and solutions to end-of-chapter
exercises are part of the web site download and can also be downloaded separately. Readers are
encouraged to download the source code for the examples and to read and run the programs as
they read the book. Readers are also strongly encouraged to read the exercise solutions if they
want to get the most out of this book.
In style, this is a textbook rather than a tutorial. That is, it concentrates on explaining
concepts rather than giving step-by-step how-to-do-it guides. I have tried to use a conversational
writing style that might be closer to classroom lecture than to a typical textbook. This is
certainly not a Java reference book, and it is not a comprehensive survey of all the features
of Java. It is not written as a quick introduction to Java for people who already know
another programming language. Instead, it is directed mainly towards people who are learning
programming for the first time, and it is as much about general programming concepts as
it is about Java in particular. I believe that Introduction to Programming using Java is
fully competitive with the conventionally published, printed programming textbooks that are
available on the market. (Well, all right, I’ll confess that I think it’s better.)
There are several approaches to teaching Java. One approach uses graphical user interface
programming from the very beginning. And some people believe that object oriented
programming should be emphasized from the very beginning. These are not the approach that I
take. The approach that I favor starts with the more basic building blocks of programming and
builds from there. After an introductory chapter, I cover procedural programming in Chapters
2, 3, and 4. Object-oriented programming is introduced in Chapter 5. Chapter 6 covers the
closely related topic of event-oriented programming and graphical user interfaces. Arrays are
introduced in Chapter 3 with a full treatment in Chapter 7. Chapter 8 is a short chapter that
marks a turning point in the book, moving beyond the fundamental ideas of programming to
cover more advanced topics. Chapter 8 is about writing robust, correct, and efficient programs.
Chapters 9 and 10 cover recursion and data structures, including generic programming and
the Java Collection Framework. Chapter 11 is about files and networking. Chapter 12 covers
threads and parallel processing. Finally, Chapter 13 returns to the topic of graphical user
interface programming to cover some more advanced features.

xi
Preface xii

∗ ∗ ∗
Java currently has two major approaches to Graphical User Interface programming: JavaFX
and Swing. This edition of the textbook uses JavaFX, but there is an alternative edition
that uses Swing. The main differences are in Chapters 6 and 13, which are devoted to GUI
programming, but GUI programs and GUI-related material in other chapters also use JavaFX
exclusively. For the Swing edition, much of the GUI material is taken from Version 7 of this
textbook, with some updating and modification.
Swing is a standard part of Java. JavaFX was introduced as a more modern approach to
GUI programming, but it must be downloaded and installed separately from Java itself, which
makes it more complicated to use. Swing and JavaFX can both be used to write complex, fully
functional GUI programs, and either one is a reasonable choice. Version 8 of this textbook used
JavaFX. The alternative edition that uses Swing has been added for Version 9.
GUI programming was never included in the textbook as an end in itself, and it would take
another textbook to cover the topic in its entirety. I cover GUI because it is a great example of
object-oriented programming, it lets me introduce event-driven programs, and it lets students
literally see the effect of the code that they write. JavaFX and Swing both offer good support
for all of those purposes.
∗ ∗ ∗
Version 8 of this textbook originally covered Java 8, but minor updates of that version added
notes about new features in Java 9 through Java 16. Version 9 of the book covers Java 17. The
main change from Version 8 is the addition of the Swing edition. A section on records has been
added to Chapter 7. Many examples have been modified to use text blocks and the new switch
statement syntax. Some references to the general idea of “abstraction” have been added, such
as a short subsection on control abstraction in Section 3.1. A short subsection on final classes
and methods has been added to Section 5.5. There are also small corrections and modifications
throughout.
The majority of this textbook is valid for Java 8, and the book does not cover features
added after Java 8 in as much detail. Note that only Java 8, 11, and 17 are “long-term
support” releases. When I introduce a feature that requires Java 11 or Java 17, I will make
note of that fact. However, I will never refer to any of the non-long-term-support releases.
∗ ∗ ∗
The first version of the book was written in 1996, and there have been several versions since
then. Version 9 will be the last version. All editions are archived (at least until my retirement
in December 2022 and hopefully beyond) at the following Web addresses:
• First edition: https://math.hws.edu/eck/cs124/javanotes1/ (Covers Java 1.0.)
• Second edition: https://math.hws.edu/eck/cs124/javanotes2/ (Covers Java 1.1.)
• Third edition: https://math.hws.edu/eck/cs124/javanotes3/ (Covers Java 1.1.)
• Fourth edition: https://math.hws.edu/eck/cs124/javanotes4/ (Covers Java 1.4.)
• Fifth edition: https://math.hws.edu/eck/cs124/javanotes5/ (Covers Java 5.0.)
• Sixth edition: https://math.hws.edu/eck/cs124/javanotes6/ (Covers Java 5.0, with a bit
of 6.0.)
• Seventh edition: https://math.hws.edu/eck/cs124/javanotes7/ (Covers Java 7.)
• Eighth edition: https://math.hws.edu/eck/cs124/javanotes8/ (Covers Java 8, plus a bit
of 11 and 17.)
Preface xiii

• Ninth edition with JavaFX: https://math.hws.edu/eck/cs124/javanotes9/ (Covers Java


17.)
• Ninth edition with Swing: https://math.hws.edu/eck/cs124/javanotes9-swing/ (Covers
Java 17.)
This textbook is free, but it is not in the public domain. Version 9 is published under the
terms of the Creative Commons Attribution-NonCommercial-ShareAlike 4.0 License. To view
a copy of this license, visit http://creativecommons.org/licenses/by-nc-sa/4.0/. For example,
you can:
• Post an unmodified copy of the on-line version on your own Web site (including the parts
that list the author and state the license under which it is distributed!).
• Give away unmodified copies of this book or sell them at cost of production, as long as
they meet the requirements of the license.
• Use the book as a textbook for a course that you are teaching (even though the students
are paying to take that course).
• Make modified copies of the complete book or parts of it and post them on the web or
otherwise distribute them non-commercially, provided that attribution to the author is
given, the modifications are clearly noted, and the modified copies are distributed under
the same license as the original. This includes translations to other languages.
For uses of the book in ways not covered by the license, permission of the author is required.
∗ ∗ ∗
A technical note on production: The on-line and PDF versions of this book are created
from a single source, which is written largely in XML. To produce the PDF version, the XML
is processed into a form that can be used by the TeX typesetting program. In addition to XML
files, the source includes DTDs, XSLT transformations, Java source code files, image files, a
TeX macro file, and a couple of scripts that are used in processing. The scripts work on Linux
and on MacOS. I have made the complete source files available for download here:
https://math.hws.edu/eck/cs124/downloads/javanotes9-full-source.zip
These files were not originally meant for publication, and therefore are not very cleanly
written. Furthermore, it requires a fair amount of expertise to use them. However, I have had
several requests for the sources and have made them available on an “as-is” basis. For more
information about the sources and how they are used see the README file from the source
download.
The source files for the JavaFX edition and for the Swing edition are actually generated
from a common set of source files that would be even harder to use. If you are interested in
exploring them, those ultimate source files can be found on Github. You can browse the files
online, or you can clone the git repository, using the following URL:
https://github.com/davidjeck/javanotes9
∗ ∗ ∗
Professor David J. Eck
Department of Mathematics and Computer Science
Hobart and William Smith Colleges
Email: [email protected]
WWW: https://math.hws.edu/eck/
Random documents with unrelated
content Scribd suggests to you:
»Erehdytte, hyvä herra», vastasi kuolemaantuomittu, »minulla on
jäljellä lisäksi se lohtu, jonka omatunto antaa».

Markiisi tervehti sanantuojaa. Tällä ei ollut enempää tehtävää ja


hän poistui.

Ovella hän sentään kääntyi ja kysyi kuolemaantuomitulta:

»Haluatteko, että lähetän luoksenne rippi-isän?»

»Rippi-isän niiden taholta, jotka tappavat minut? Ei, herra, se olisi


minusta vastenmielistä. Minä haluan kyllä luovuttaa teille henkeni,
mutta sieluni autuuden pidätän itselleni… Pyydän luokseni Saint-
Paulin kirkkoherran.»

Kahta tuntia myöhemmin se kunnianarvoisa hengenmies, jota hän


oli pyytänyt, oli hänen luonansa.
XVII

Grève-tori

Nämä kaksi tuntia oli käytetty hyvin.

Sanantuojan perässä oli koppiin tullut kaksi miestä, molemmat


synkännäköisiä, yllä teloittajan asu.

Favras oli ymmärtänyt joutuvansa nyt asioimaan kuoleman


edeltäjien, pyövelin etuvartijajoukon kanssa.

»Seuratkaa meitä!» oli toinen miehistä sanonut.

Favras oli kumartanut myöntymyksen merkiksi.

Sitten hän osoitti tuolilla olevia vaatekappaleita ja kysyi:

»Suotteko minulle aikaa pukeutua?»

»Saatte aikaa», vastasi mies.

Favras meni pöydän luo, jolle oli sirotettu hänen käsilaukkunsa


erinäköiset esineet, ja seinää koristavan pikku kuvastimen edessä
hän napitti paidankauluksen, laskosti siroihin poimuihin röyhelönsä ja
sitaisi kaulanauhansa kaikkein aatelisimpaan solmuun.

Sen jälkeen hän puki yllensä liivit ja takin.

»Saanko ottaa mukaani hatun, herrat?» kysyi vanki.

»Se on tarpeetonta», vastasi mies, joka oli tähänkin saakka


puhunut.

Äänettömänä pysynyt mies oli silmäillyt Favrasia kaiken aikaa niin


tarkasti, että se oli herättänyt markiisin huomiota.

Hän oli huomaavinaan, että tämä mies teki hänelle jonkun


salamyhkäisen merkin silmillään.

Mutta tämä merkki oli ollut niin väläyksellinen, että Favras jäi
epätietoiseksi, mitä se merkitsi.

Ja mitäpä tuolla miehellä oli hänelle sanottavaa?

Hän ei piitannut siitä sen enempää, vaan heilautti ystävällisesti


kättänsä vartija Louisille ja sanoi:

»Olen valmis, herrat, menkää edellä, seuraan teitä.»

Ovella odotteli muuan oikeudenpalvelija.

Oikeudenpalvelija kulki ensimmäisenä, sitten Favras, sitten


molemmat synkkäilmeiset miehet.

Tämä synkkä saattue suuntasi kulkunsa ensimmäiseen kerrokseen.


Näiden kahden koppikerrosten välimailla odotteli ryhmä
kansalliskaartilaisia.

Oikeudenpalvelija tunsi saavansa näistä tukea ja sanoi vangille:

»Herra, ojentakaa minulle se Pyhän Ludvigin ritarimerkki.»

»Luulin olevani tuomittu kuolemaan eikä arvon alennukseen»,


vastasi
Favras.

»Sellainen on määräys, herra», intti oikeudenpalvelija.

Favras irroitti ritarimerkin ja koska hän ei halunnut luovuttaa sitä


tälle oikeuden kätyrille, antoi hän sen kansalliskaartilaisia
komentavalle kersantille.

»Hyvä niinkin», tokaisi oikeudenpalvelija välittämättä enää vaatia,


että ritarimerkki luovutettaisiin hänelle itselleen. »Seuratkaa minua.»

Noustiin arviolta parikymmentä porrasta ja pysähdyttiin


kauttaaltaan raudoitetun tammioven eteen. Se oli niitä ovia, joita
katsellessaan kuolemaantuomitut tuntevat veren suonissaan
hyytyvän. Tällaisia ovia on pari kolme kuolemaantuomitun viimeisellä
matkalla. Niiden takana matkalainen vaistomaisesti arvaa
kohtaavansa jonkin kauhean häntä odottamassa.

Ovi aukeni.

Favrasillec ei suotu aikaa astua sisälle; hänet työnnettiin


huoneeseen.

Sitten ovi äkkiä sulkeutui kuin rautakouran painalluksesta.


Favras oli kidutuskammiossa..

»Ah, herrat», huudahti hän lievästi kalveten, »kun ihmisiä aiotaan


tuoda tällaisiin paikkoihin, pitäisi heitä hitossa siihen ennakolta
valmistaa!»

Hän ehti tuskin lopettaa lausettaan, kun häntä seuranneet kaksi


miestä syöksyivät hänen kimppuunsa, riistivät takin ja liivit hänen
yltänsä, taiteellisesti solmitun nauhan hänen kaulastaan ja sitoivat
hänen kätensä selän taa.

Mutta auttaessaan toveriaan tässä tehtävässä kuiskasi se näistä


kiduttajista, jonka Favras oli luullut nähneensä tekevän hänelle
salaisen merkin, hänen korvaansa seuraavat sanat:

»Haluatteko pelastua? Vielä on aikaa.»

Tämä tarjous sai Favrasin huulet hymyyn, sillä se palautti hänen


mieleensä hänen tehtävänsä suuruuden.

Hän ravisti lempeästi päätänsä epäyksen merkiksi.

Huoneessa oli puuhevonen valmiina. Kuolemaantuomittu pantiin


pitkälleen tämän hevosen selkään.

Kiduttaja lähestyi häntä esiliina täynnä tammivaajoja ja kädessä


rautamoukari.

Favras ojensi omasta aloitteestaan tätä miestä kohden hienon


jalkansa, joissa oli puna-anturaiset kengät ja silkkisukat.

Mutta silloin oikeudenpalvelija kohotti kätensä.


»Riittää», sanoi hän. »Hovi armahtaa kuolemaantuomitun
kidutukselta.»

»Ah», virkkoi Favras, »hovi näyttää pelkäävän, että minä


lavertelisin. Suuri kiitos. Minä saan mennä hirsipuulle kahdella kelpo
jalalla. Se on jotakin. Ja nyt, herrat, te tiedätte, että olen
käytettävissänne.»

»Teidän on vietettävä yksi tunti tässä salissa», sanoi


oikeudenpalvelija.

»Se ei ole virkistävää, mutta se voi olla hauskaa», huomautti


Favras.

Ja hän alkoi kävellä salissa ja tutki yksitellen niitä hirveitä kojeita,


jotka olivat kuin mitäkin jättimäisiä rautahämähäkkejä, suunnattomia
skorpioneja.

Katselija tunsi, että määrätyllä hetkellä, kohtalokkaan äänen


määräyksestä koko tämä kojerykelmä heräsi eloon, liikkui ja puri
julmasti.

Niitä oli kaikenmuotoisia ja kaikenaikaisia, Filip Augustin päiviltä


Ludvig XVI:n aikaan saakka. Joukossa oli rautapiikkejä, joilla 13.
vuosisadan juutalaisia oli paloiteltu, ja teilirattaita, joilla oli silvottu
17. vuosisadan protestantteja.

Favras pysähtyi jokaisen voitonmerkin eteen ja kyseli kunkin


kojeen nimeä.

Moinen kylmäverisyys lopulta kummastutti kiduttajiakin, jotka,


kuten tiettyä, eivät helposti ihmettele mitään.
»Miksi tätä kaikkea kyselette?» tiedusti toinen miehistä.

Vanki silmäili häntä tutun ilkamoivasti, aatelismiehille ominaisin


ilmein.

»Hyvä herra», vastasi hän, »voin tavata edessäni olevalla matkalla


Saatanan, eikä olisi hullumpaa, jos saisin hänestä ystävän
mainitsemalla hänelle kadotettujen kidutukseen sopivia kojeita, joita
hän ei tunne».

Vanki oli juuri lopettanut tarkastuskäyntinsä, kun Châteletin kello


löi viisi.

Kaksi tuntia oli kulunut siitä, kun hän lähti kopistaan.

Hänet opastettiin sinne takaisin.

Saint-Paulin kirkkoherra odotteli häntä siellä.

Kaikesta saattoi nähdä, etteivät nämä kaksi odotustuntia olleet


menneet hukkaan ja että jos mikään, niin hänen äsken kokemansa
elämys oli sopivalla tavalla valmistanut hänet kuolemaan.

Hänet nähdessään kirkkoherra avasi hänelle sylinsä.

»Isä», sanoi Favras, »suokaa anteeksi, etten minä voi avata teille
muuta kuin sydämeni. Nämä herrat ovat järjestäneet niin, että voin
teille avata vain sen.»

Ja hän näytti selän taakse sidottuja käsiään.

»Ettekö voi irroittaa tuomitun käsiä siksi ajaksi, jonka hän viipyy
parissani?» kysyi kirkkoherra.
»Se ei ole meidän vallassamme», vastasi oikeudenpalvelija.

»Isä», sanoi Favras, »kysykää, eivätkö he voisi sitoa niitä


etupuolelle. Se on kuitenkin tehtävä silloin, kun joudun pitelemään
kynttilää kädessäni ja lukemaan tuomiotani.»

Apulaiset katsahtivat oikeudenpalvelijaan. Tämä nyökäytti


päätänsä merkiksi, ettei se olisi mitenkään sopimatonta, ja markiisin
armonanomukseen suostuttiin.

Sitten hänet jätettiin kahden kesken hengenmiehen seuraan.

Kukaan ei tiedä, mitä tapahtui tämän maailmanmiehen ja Jumalan


miehen välisessä viimeisessä keskustelussa. Avasiko Favras
uskonnon pyhyyden edessä sydämensä, joka oikeuden majesteetin
edessä oli pysynyt suljettuna? Kostuivatko hänen ivan kuivaamat
silmänsä niistä lohdutuksista, sen toisen maailman tarjoamista,
johon hän oli astumaisillaan? Kimmelsikö niissä joku hänen
sydämensä vuodattamista kyynelistä? Kyynelistä, jotka hän
varmaankin oli vuodattanut rakkaitten omaistensa takia, jotka hän
maailmasta erotessaan joutuisi jättämään orvoiksi ja hylätyiksi? Sitä
eivät ainakaan huomanneet miehet, jotka viiden tienoissa astuivat
hänen koppiinsa ja jotka tapasivat hänet hymyhuulisena, kuivin
ripsin ja suljetuin sydämin.

Hänelle tultiin ilmoittamaan, että kuolinhetki oli koittanut.

»Hyvät herrat», sanoi hän, »pyydän teiltä anteeksi, mutta te olette


antaneet minun odottaa».

Koska hän oli jo takitta ja liivittä ja hänen kätensä oli sidottu,


riisuttiin häneltä nyt kengät ja sukat ja hänen yllensä jätettyjen
vaatteitten päälle vedettiin valkoinen mekkopaita.

Sitten hänen rinnalleen pantiin kirjoitustaulu, jossa oli sanat:

VEHKEILIJÄ VALTIOTA VASTAAN

Châteletin portilla odottelivat häntä rattaat isolukuisen vartioston


ympäröiminä.

Näillä rattailla oli sytytetty tuohus.

Kuolemantuomitun nähdessään joukko alkoi taputtaa käsiään.

Kello kuudesta aamulla oli tuomio ollut tiedossa ja väkijoukon


mielestä aika kului perin verkkaisesti tuomion ja teloituksen välillä.

Kaduilla liikuskeli ihmisiä anellen juomarahoja ohikulkijoilta.

»Mitä juomarahoilla?» utelivat jotkut.

»Herra de Favrasin teloitusta varten», vastasivat nämä kuoleman


kerjäläiset.

Favras nousi lujin askelin rattaille. Hän istahti sille puolelle, mihin
tuohus oli kiinnitetty, sillä hän oivalsi, että tuohus oli nimenomaan
häntä varten.

Saint-Paulin kirkkoherra nousi rattaille hänen jälkeensä ja istuutui


hänen vasemmalle puolelleen.

Teloittaja nousi viimeisenä ja sijoittui hänen taakseen.

Hän oli sama alakuloisen näköinen ja lempeäkatseinen mies, jonka


olemme nähneet Bicêtren pihamaalla tohtori Guillotinin konetta
koeteltaessa.

Olemme nähneet hänet, näemme hänet nyt ja saamme tilaisuuden


nähdä hänet myöhemminkin. Hän on sen aikakauden todellinen
sankari, johon olemme astumassa.

Ennenkuin istahti paikalleen, pyöveli pani Favrasin kaulaan nuoran,


jolla hänet hirtettäisiin.

Nuoran toista päätä hän piteli kädessään.

Kun rattaat lähtivät liikkeelle, syntyi väkijoukossa liikehtimistä.


Favraskin käänsi katseensa sinne päin, mistä tämä melu lähti.

Hän näki ihmisten työntelevän toisiaan päästäkseen ensimmäiseen


riviin ja paremmalle paikalle vangin ohi ajaessa. Äkkiä hän
vaistomaisesti hätkähti, sillä ensi rivissä, viiden kuuden toverinsa
keskellä, joiden kanssa oli raivannut kujan väkijoukkoon, hän
huomasi hallikantajan asuun pukeutuneena saman yöllisen vieraan,
joka oli sanonut suojelevansa häntä viimeiseen hetkeen saakka.

Kuolemaantuomittu nyökäytti päätänsä merkiksi, että oli tuntenut


vieraan; muuta hän ei sillä tarkoittanutkaan.

Rattaat jatkoivat kulkuaan ja pysähtyivät vasta Notre-Damen


edustalle.

Pääovi oli auki ja sen kautta näkyi kirkon hämärässä peräpäässä


pääalttari hohtavan palavien kynttiläinsä alla.

Uteliaitten tulva oli niin voimakas, että rattaitten oli pakko tuon
tuostakin pysähtyä ja ne pääsivät etenemään vain kun vartiosto oli
raivannut niille tien, jonka heti taas sulki kansanvuo särkien sen tielle
nousseen heikon padon.

Siellä, kirkkoaukealla, voitiin tungoksen uhallakin toimia vapaasti.

»Teidän on nyt astuttava rattailta ja tehtävä julkinen katumus,


hyvä herra», sanoi teloittaja kuolemaantuomitulle.

Favras totteli mitään vastaamatta.

Hengenmies astui rattailta ensimmäisenä, häntä seurasi vanki ja


sitten teloittaja, joka yhä piteli kiinni nuoran toisesta päästä.

Kädet oli sidottu ranteista, joten markiisi voi käyttää kouriaan.

Hänen oikeaan käteensä pantiin tuohus ja vasempaan


tuomiopaperi.

Kuolemaantuomittu eteni kirkon portaille saakka ja polvistui.

Ympäröivien ihmisten joukossa hän huomasi etualalla äskeisen


hallikantajan tovereineen, jotka oli nähnyt jo Châteletista
lähdettäessä.

Moinen sitkeys näytti liikuttavan häntä, mutta sanaakaan ei


kuulunut hänen huuliltaan.

Muuan Châteletin virkamies oli paikalla häntä odottamassa.

»Lukekaa, herra», sanoi tämä hänelle kovalla äänellä.

Sitten hän kuiskasi:


»Herra markiisi, te tiedätte, että jos haluatte pelastua, teidän
tarvitsee lausua vain sana.»

Vastaamatta kuolemaantuomittu aloitti lukemisensa.

Hän luki lujalla äänellä eikä hänen äänensä ilmaissut pienintäkään


mielenliikutusta. Kun lukeminen oli päättynyt, puhui hän
ympäröivälle joukolle:

»Valmiina astumaan Jumalan kasvojen eteen minä annan anteeksi


niille, jotka vastoin omaatuntoaan ovat syyttäneet minua rikollisista
hankkeista. Rakastin kuningastani, kuolen uskollisena tälle
tunteelleni. Minä näytän esimerkin ja toivon, että sitä seuraavat
monet ylevät sydämet. Kansa vaatii suurin äänin minun kuolemaani,
se tarvitsee uhrin. Hyvä, olen mielissäni, että kohtalo on valinnut
juuri minut eikä ketään heikkoa sydäntä, joka ansaitsemattoman
rangaistuksen edessä joutuisi epätoivoon. Ellei minulla nyt ole täällä
muuta tehtävää kuin mitä olen jo tehnyt, niin jatkakaamme matkaa,
hyvät herrat.»

Matkaa jatkettiin.

Notre-Damen portailta ei ole pitkä matka Grève-torille ja kuitenkin


rattaat laahustivat tätä taivalta kokonaisen tunnin.

Vihdoin saavuttiin torille.

»Herrat», sanoi Favras, »saanko poiketa hetkeksi


kaupungintaloon?»

»Haluatteko tehdä jonkun tunnustuksen, poikani?» kysyi


hengenmies vilkkaasti.
»En, isä. Haluan vain sanella kuolintestamenttini. Olen kuullut
kerrottavan, että kuolemaantuomitulle, joka on pidätetty
valmistumattomana, suodaan viimeisenä armonosoituksena tilaisuus
tehdä kuolintestamenttinsa.»

Rattaat eivät ajaneetkaan suoraan hirsipuulle, vaan poikkesivat


kaupungintaloon päin. Väkijoukosta alkoi kuulua kovaa hälinää.

»Hän menee tunnustuksille! Hän menee tunnustuksille!»


huudettiin joka suunnalta.

Tämä huuto pani kalpenemaan erään nuoren, kauniin miehen,


joka oli kauttaaltaan mustiin puettu kuin apotti ja seisoi irtokivellä
Pelletier-rantakadun kulmassa.

»Ah, älkää pelätkö, varakreivi Louis», virkkoi muuan ilkamoiva ääni


hiljaa hänen viereltään, »kuolemaantuomittu ei lausu sanaakaan
siitä, mitä on tapahtunut Royale-aukiolla».

Mustiin puettu nuori mies kääntyi äkkiä; nämä sanat oli lausunut
muuan hallikantaja, jonka kasvoja hän ei voinut nähdä, koska mies
oli lauseen lopetettuaan painanut hattunsa leveän lieren silmilleen.

Nuoren, kauniin miehen epäilykset — mikäli hän jotakin epäili —


hälvenivät muuten väleen.

Ehdittyään kaupungintalon porraskorokkeelle Favras teki merkin,


että hän aikoi puhua.

Siinä tuokiossa kaikki hälinä taukosi ikäänkuin tällä hetkellä


puhaltanut länsituuli olisi vienyt sen mennessään.
»Hyvät herrat», sanoi Favras, »kuulen ympärilläni toistettavan,
että menen kaupungintaloon tunnustuksille. Se ei ole totta, ja jos
joukossanne joku mahdollisesti pelkää minun tekevän paljastuksia,
niin rauhoittukoon, sillä minä menen kaupungintaloon sanelemaan
kuolintestamenttia.»

Ja hän poistui lujin askelin porttikäytävään, nousi portaat ja astui


huoneeseen, johon kuolemaantuomitut tavallisesti opastettiin ja jota
siitä syystä sanottiin tunnustuksien huoneeksi.

Kolme mustiin puettua miestä oli siellä häntä odottamassa, ja


näiden kolmen miehen joukossa Favras tunsi saman virkamiehen,
joka oli puhutellut häntä Notre-Damen edustalla.

Koska kuolemaantuomitun kädet oli sidottu eikä hän siis voinut


kirjoittaa, alkoi hän sanella testamenttiaan.

Paljon on puhuttu Ludvig XVI:n testamentista, sillä kuninkaitten


testamentista puhutaan paljon. Edessämme on herra de Favrasin
testamentti ja me sanomme yleisölle vain seuraavat sanat: »Lukekaa
ja verratkaa.»

Kun testamentti, oli saneltu, pyysi Favras sen lukeakseen ja


allekirjoittaakseen.

Hänen kätensä irroitettiin siteistä. Hän luki testamentin, korjasi


kolme kirjoitusvirhettä, jotka sihteeri oli tehnyt, ja kirjoitti jokaisen
sivun alareunaan sanat: »Mahi de Favras.»

Sen tehtyään hän ojensi kätensä jälleen sidottaviksi. Sen työn


suoritti teloittaja, joka ei ollut hetkeksikään poistunut hänen
takaansa.
Testamentin sanelu oli vaatinut aikaa pari tuntia. Aamusta saakka
odotellut joukko hermostui kovin. Mukana oli paljon kelpo porvareita,
jotka olivat saapuneet paikalle tyhjin vatsoin laskien pääsevänsä
haukkaamaan aamiaista teloituksen jälkeen ja jotka olivat saaneet
paastota tähän saakka.

Pian alkoikin kuulua samaa uhkaavaa, hirveää murinaa, jota oli


kuultu tällä samalla torilla silloin kun de Launay murhattiin, Foulon
hirtettiin ja Berthier raadeltiin kuoliaaksi.

Väkijoukko alkoi sitäpaitsi uskoa, että Favras oli päästetty pakoon


jostakin takaportista.

Tässä tilanteessa jotkut jo ehdottivatkin, että Favrasin asemasta


hirtettäisiin viranomaiset ja kaupungintalo hajoitettaisiin maan
tasalle.

Onneksi kellon yhdeksättä käydessä vanki tuli jälleen esille.


Vartiokujan muodostaneille sotilaille oli pantu soihtu käteen. Kaikki
torirakennusten ikkunat oli valaistu. Vain hirsipuu oli jäänyt
salaperäiseen, hirveään pimentoon.

Kuolemaantuomitun esiintuloa tervehti yksimielinen riemuhuuto ja


tuo torin täyteinen viisikymmentuhantinen joukko alkoi liikehtiä.

Nyt oltiin ihan varmoja, ettei vanki ollut karannut eikä enää
karkaisikaan.

Favras silmäili ympärilleen.

Sitten hän puheli itsekseen huulilla hänelle ominainen ivahymy:


— Ei ainoitakaan vaunuja. Ah, ylhäisö unohtaa helposti! Se on
ollut kohteliaampi kreivi de Hornille kuin minulle.

»Se johtuu siitä, että kreivi de Horn oli murhaaja, mutta sinä olet
marttyyri», virkkoi muuan ääni.

Favras kääntyi ja huomasi hallikantajan, jonka hän oli matkallaan


jo kahdesti tavannut.

»Hyvästi, herra», sanoi Favras. »Toivon, että tarpeen tullen


todistatte minun hyväkseni.»

Ja lujin askelin hän laskeutui rattailta ja asteli mestauslavaa


kohden.

Laskiessaan jalkansa hirsipuutikkaitten alimmalle portaalle hän


kuuli jonkun huutavan:

»Hyppää, markiisi!»

Kuolemaantuomitun vakava, sointuva ääni vastasi:

»Kansalaiset, minä kuolen syyttömänä. Rukoilkaa Jumalaa


puolestani!»

Neljännellä portaalla hän pysähtyi jälleen ja sanoi yhtä lujalla, yhtä


kaikuvalla äänellä kuin äskenkin:

»Kansalaiset, minä pyydän teitä auttamaan minua rukouksillanne…


Minä kuolen syyttömänä!»

Kahdeksannelta portaalta, miltä hänet syöstäisiin alas, hän huusi


kolmannen kerran:
»Kansalaiset, minä kuolen syyttömänä. Rukoilkaa Jumalaa
puolestani!»

»Mutta», sanoi toinen teloittajan apulaisista, joka nousi hänen


rinnallaan tikkaita, »ettekö siis halua, että teidät pelastetaan?»

»Kiitos, ystävä», vastasi Favras, »Jumala palkitkoon teille kauniit


aikeenne!»

Sitten hän kohotti päänsä teloittajaa kohden, joka näytti odottavan


hänen määräyksiään sen sijaan että olisi itse antanut määräykset.

»Täyttäkää velvollisuutenne», sanoi hän.

Tuskin hän oli lausunut nämä sanat, kun teloittaja sysäsi häntä ja
hänen ruumiinsa alkoi häälyä ilmassa.

Tämä näytelmä synnytti tavattoman kohinan Grève-torilla, jotkut


ensikertalaiset paukuttivat käsiään ja huusivat: »vielä kerran!»
ikäänkuin olisivat kuuntelemassa katuviisua tai suurta oopperalaulua.
Äsken mainitsemamme, mustiin puettu nuorukainen solahti alas
kiveltä, jolla oli seisonut, tunkeutui väkijoukon halki ja Pont-Neufin
kulmassa nousi nopeasti liverittömiin ja vaakunattomiin ajoneuvoihin
sekä huusi ajurille:

»Luxembourgiin ja niin nopeasti kuin ohjaksista pääsee!»


Ajoneuvot lähtivät liikkeelle täyttä neliä.

Kolme miestä odotteli ylen kärsimättöminä näiden ajopelien tuloa.

Yksi heistä oli Provencen kreivi ja toiset kaksi aatelismiehiä, jotka


olemme joskus maininneet näissä kuvauksissamme, mutta joiden
nimiä on tässä turhaa ilmoittaa.
He odottelivat sitäkin kärsimättömämmin, kun heidän oli pitänyt
mennä aterialle kello kaksi ja kun he levottomuudessaan eivät olleet
voineet sitä tehdä.

Keittiömestari puolestaan oli ihan epätoivoinen. Hän oli aloittanut


jo kolmannen päivällisen valmistelun, ja tämä päivällinen, joka
kelpasi nautittavaksi kymmenen minuutin aikana, turmeltuisi
neljännestunnissa.

Hetki oli siis äärimmäisen jännittynyt, kunnes vihdoin kuului


sisäpihaan vierivien ajoneuvojen kolina.

Provencen kreivi kiiruhti ikkunaan, mutta hän ehti nähdä vain


tumman varjon ponnahtavan vaunujen alimmalta astinlaudalta
palatsin portaitten ensimmäiselle askelmalle.

Hän siirtyi senvuoksi ikkunan luota ja riensi ovelle päin. Mutta


ennenkuin tämä Ranskan tuleva kuningas hidasliikkeisenä ennätti
ovelle saakka, aukeni tämä, ja mustapukuinen nuorukaisemme astui
huoneeseen.

»Monseigneur», sanoi hän, »kaikki on lopussa. Herra de Favras


kuoli sanaa lausumatta.»

»Me voimme siis kaikessa rauhassa käydä pöytään, kelpo Louis.»

»Kyllä, monseigneur. Hän on totisesti oikea aatelismies, hän!»

»Olen samaa mieltä kuten tekin, ystävä hyvä», myönsi hänen


kuninkaallinen korkeutensa. »Niinpä juommekin hänen kunniakseen
lasillisen Constance-viiniä. Pöytään, hyvät herrat!»
Tällä hetkellä aukenivat kaksoisovet selko selälleen ja nämä
ylhäiset pöytävieraat siirtyivät salongista ruokasaliin.
XVIII

Kuninkuus on pelastettu

Muutamia päiviä äsken kertomamme teloituksen jälkeen —


teloituksen, jonka kaikkiin yksityisseikkoihin olemme syventyneet
saadaksemme lukijamme käsittämään, mikä tunnustus kuninkaitten
ja ruhtinaitten taholta odotti heidän hyväkseen uhrautuneita —
muuan mies ratsasti harmaatäpläisellä hevosella hidasta ravia Saint-
Cloudin puistokatua pitkin.

Tämä hidas ajo ei kaikesta päättäen johtunut ratsastajan


velttoudesta eikä hevosen väsymyksestä; kumpaakaan ei ollut matka
rasittanut. Sen huomasi helposti, sillä ratsun suupieliin pärskynyt
vaahto johtui siitä, että sitä oli — ei ylettömästi kiihotettu — vaan
kiinteästi pidätelty. Ratsastaja taas, joka oli — sen huomasi ensi
silmäyksellä — aatelismies, ja hänen loasta puhdas ulkoasunsa
todistivat hänen varonneen tahraamasta vaatteitaan maantietä
peittävään lokaan.

Ratsastajan kulkua hidastutti syvä mietiskely, johon hän ilmeisesti


oli vaipunut, ehkä myöskin halu saapua perille määrätyllä hetkellä,
joka ei ollut vielä lyönyt.
Ratsastaja oli arviolta nelikymmenvuotias. Hänen valtavan rumat
piirteensä ilmaisivat suurta luonnetta. Liian iso pää, pulloposket,
rokonarpiset kasvot, helposti hehkuva hipiä, silmät aina valmiina
sinkoamaan salamoita, suu tottunut vääntämään ja kääntämään
pistosanoja, sellainen oli tämän miehen ulkomuoto, miehen, joka oli
luotu — sen tunsi jokainen hänet kerran nähtyään — suureen
asemaan ja suureen maineeseen.

Mutta hänen piirteitään näytti nyt peittävän verho. Se oli jonkun


elimellisen sairauden tuotetta, sellaisen, jota vastaan
voimakkaimmatkin luonteet saavat turhaan taistella. Himmeä,
harmaa iho, väsyneet, tulehtuneet silmät, veltot posket,
epäterveeseen suuntaan kehittynyt paksuus ja lihavuus — siinä sen
miehen ulkoiset ominaisuudet, jonka olemme nyt esitelleet lukijalle.

Ehdittyään puistokadun päähän hän poikkesi arkailematta palatsin


pihaan vievästä portista ja loi tutkivan silmäyksen pihan pimentoon.

Oikealla, kahden rakennuksen välissä, jotka muodostivat


eräänlaisen johtokäytävän, seisoi muuan mies odottelemassa.

Hän viittasi ratsastajaa tulemaan peremmäs.

Muuan portti oli auki. Odotteleva mies meni porttikäytävään.


Ratsastaja ajoi perässä ja yhä häntä seuraten joutui pian toiseen
pihaan.

Siellä mies pysähtyi — hänen yllänsä oli takki, housut ja mustat


liivit — silmäili ympärilleen ja huomattuaan pihan ihan autioksi
lähestyi ratsastajaa hattu kädessä.
Ratsastaja tuli tavallaan häntä vastaan, kumartui hevosensa
kaulan yli ja virkkoi puoliääneen:

»Herra Weber?»

»Herra kreivi de Mirabeau?» vastasi mies.

»Minä itse», sanoi ratsastaja.

Ja uskomattoman ketterästi hän hypähti maahan.

»Käykää sisään», kehoitti Weber nopeasti, »ja suvaitkaa odottaa


hetki, kunnes olen vienyt hevosenne talliin».

Samalla hän aukaisi erään oven. Siitä pääsi salonkiin, jonka


ikkunat ja toinen ovi olivat puiston puolella.

Mirabeau astui salonkiin ja käytti Weberin hänelle suoman


lomahetken irroittaakseen jalastaan eräänlaiset nahkasaappaat,
joiden alta tulivat näkyviin koskemattomat silkkisukat ja
moitteettomasti kiilloitetut puolikengät.

Weber tuli, kuten oli luvannutkin, viiden minuutin kuluttua.

»Tulkaa, herra kreivi», sanoi hän. »Kuningatar odottaa teitä.»

»Kuningatar odottaa minua!» huudahti Mirabeau. »Olisinko


onnettomuudekseni antanut kuningattaren odottaa? Luulin olevani
säntillinen.»

»Kuningatar odottaa teitä kärsimättömästi! Tulkaa, herra kreivi.»

Weber avasi puutarhaan vievän oven ja suuntasi kulkunsa


käytäväsokkeloon, josta pääsi puiston yksinäisimmälle ja
korkeimmalle kohdalle.

Siellä, keskellä lehdettömiä, pitkäoksaisia puita, oli harmahtavassa,


alakuloisessa hämärässä eräänlainen huvimaja, jota yleisesti
sanottiin kioskiksi.

Tämän paviljongin ikkunaluukut olivat tiukasti kiinni, paitsi kahta,


jotka oli vain työnnetty toisiaan vasten, niin että niiden raosta kuin
mistäkin linnantornin ampuma-aukosta pääsi tunkeutumaan pari
valonsädettä, jotka hädin tuskin jaksoivat valaista huonetta.

Iso roihu oli sytytetty takkaan ja kaksi pitkää kynttilää paloi


takanreunakkeella.

Weber ohjasi opastettavansa ensin eräänlaiseen


odotushuoneeseen.
Koputettuaan kevyesti kioskin ovelle hän aukaisi sen ja ilmoitti:

»Herra kreivi Riquetti de Mirabeau.»

Ja hän väistyi syrjään päästääkseen kreivin ohitseen.

Jos hän olisi kuunnellut tarkasti, kun kreivi sivuutti hänet, olisi hän
varmaankin kuullut, kuinka sydän löi tuossa leveässä rinnassa.

Kreivin astuessa sisälle nousi muuan nainen kioskin etäisimmästä


nurkasta ja empien, miltei kammoten astui pari askelta tulijaa
vastaan.

Tämä nainen oli kuningatar.

Hänenkin sydämensä sykki kiivaasti. Hän näki edessään, tuon


vihatun, julkisesti parjatun, kohtalokkaan miehen, sen, jota syytettiin
lokakuun 5 ja 6 päivän aiheuttajaksi, miehen, jonka apuun oli
hetkeksi turvauduttu, mutta jonka hovin väki oli itse työntänyt
luotansa ja joka sen jälkeen oli osannut vaatia solmiamaan liiton
hänen kanssaan parilla jyrähtävällä panoksella, parilla mahtavalla
vihanpurkauksella, jotka olivat tapailleet miltei ylevyyttä.

Edellinen oli hänen purkauksensa papistoa vastaan.

Jälkimäinen se puhe, missä hän oli selittänyt, että kansan


edustajat olivat kolmannen säädyn miehistä muuttuneet
kansalliskokoukseksi.

Mirabeau lähestyi sulavasti ja kohteliaasti, minkä kuningatar


suureksi kummakseen huomasi heti ensi silmäyksellä. Se ominaisuus
ei tuntunut luontuvan tuohon tarmokkaaseen olemukseen.

Nämä pari askelta astuttuaan Mirabeau tervehti kunnioittavasti ja


jäi odottamaan.

Kuningatar katkaisi äänettömyyden ja sanoi äänellä, jota hän ei


voinut estää värähtelemästä:

»Herra de Mirabeau, tohtori Gilbert on taannoin vakuuttanut


meille, että te olette valmis liittymään meihin.»

Mirabeau kumarsi myöntymyksen merkiksi.

Kuningatar jatkoi:

»No niin, ensimmäiseen teille tehtyyn esitykseen te vastasitte


ministeriösuunnitelmalla.»

Mirabeau kumarsi toistamiseen,


»Ei ole meidän vikamme, herra kreivi, että tuo ensimmäinen
suunnitelma ei voinut onnistua.»

»Uskon sen, madame», vastasi Mirabeau, »teidän majesteettinne


kannalta liiatenkin. Vika oli niiden miesten, jotka väittävät
uhrautuvansa kuninkuuden hyväksi.»

»Minkä sille voi, herra kreivi! Siinä juuri on asemamme kierous.


Kuninkaat eivät saa enää valita ystäviään eikä vihollisiaan. Heidän on
toisinaan pakko hyväksyä kaameatkin alttiuden osoitukset.
Ympärillämme on miehiä, jotka haluavat pelastaa meidät ja vievätkin
meidät turmioon. Heidän toimestaan päätettiin, että
kansalliskokouksen jäsenet eivät voi olla ministereitä; se on teitä
vastaan sovellettu esimerkki. Haluatteko, että kerron teille yhden
esimerkin, joka suuntautui minua vastaan? Voitteko uskoa, että
muuan uskollisimpia ystäviämme, mies, jonka varmasti tiedän olevan
valmiin kuolemaan puolestamme, on puhumatta meille mitään
aiheestaan tuonut julkisiin päivälliskutsuihimme markiisi de Favrasin
lesken ja lapset, kaikki kolme surupukuisina? Heidät nähtyäni aioin
nousta, mennä heidän luoksensa ja sijoittaa tuon meidän
hyväksemme niin urheasti kuolleen miehen lapset — sillä minä, herra
kreivi, en ole niitä, jotka kieltävät ystävänsä — sijoittaa hänen
lapsensa minun ja kuninkaan väliin… Kaikki katseet tuijottivat
meihin. Odotettiin, mitä me tekisimme. Käännyin taakseni…
tiedättekö, kuka oli takanani, neljän askelen päässä nojatuolistani?
Santerre, esikaupunkilainen! Painuin takaisin tuoliini raivosta itkien
enkä tohtinut edes katsahtaa tuon kovaonnisen perheen jäseniin.
Rojalistit soimasivat minua, kun en kaiken uhallakin osoittanut
harrastusta tuota kovaosaista perhettä kohtaan; vallankumoukselliset
raivostuivat, sillä he arvelivat äidin lapsineen saapuneen minun
toimestani. Ah, herra kreivi», jatkoi kuningatar päätänsä puistaen,
»turmioon johtaa, kun hyökkääjinä on nerokkaita miehiä ja
puolustajina henkilöitä, jotka epäilemättä ovat hyvin ansiokkaita,
mutta eivät hitustakaan tajua meidän asemamme vaikeutta.»

Ja huokaisten kuningatar nosti nenäliinan silmilleen.

»Madame», virkkoi Mirabeau syvästi liikutettuna moisesta suuresta


onnettomuudesta, jota ei salattu häneltä ja joka ilmaisemalla joko
taitavaa laskelmaa tai naisellista heikkoutta todisti hänelle
kuningattaren huolista ja antoi hänen nähdä hänen kyynelensä,
»puhuessanne hyökkääjistä ette toivottavasti tarkoita minua?
Omaksuin yksinvaltaiset periaatteet, vaikka näin hovissa vain
heikkoutta enkä vielä tuntenut Maria Teresian kuninkaallisen tyttären
henkeä enkä ajatusmaailmaa. Taistelin valtaistuimen oikeuksien
puolesta, vaikka herätin vain epäluottamusta ja kaikissa teoissani,
ilkeän panettelun myrkyttämissä, nähtiin yhtä monta salahanketta.
Palvelin kuningasta, vaikka tiesin hyvin, ettei tältä oikeamieliseltä,
mutta petetyltä kuninkaalta tullut odottaa ymmärtämystä eikä
kiitosta. Mitä minä nyt siis teenkään, madame, kun luottamus
kannustaa rohkeuttani, kun teidän majesteettinne suosion
aiheuttama kiitollisuus muuttaa periaatteeni velvollisuudeksi? Se
tapahtuu myöhään, kovin myöhään, tiedän sen», jatkoi Mirabeau
ravistaen päätänsä hänkin. »Kutsuessaan minut avukseen kuninkuus
ei kenties voi esittää minulle muuta mahdollisuutta kuin että
tuhoudun sen mukana! Jos olisin harkinnut asiaa, olisin kukaties
valinnut minulle nyt suodun tapaamisen ajaksi toisen hetken kuin
sen, jolloin hänen majesteettinsa juuri on luovuttanut kamarille
kuuluisan punaisen kirjan, toisin sanoen ystäviensä kunnian.»

»Ah, herra kreivi», huudahti kuningatar, »luuletteko siis kuninkaan


olleen mukana siinä petoksessa, ettekö siis tiedä, kuinka ne asiat
ovat tapahtuneet? Kuningas luovutti häneltä vaaditun punaisen
kirjan vain sillä ehdolla, että komitea tallettaisi sitä salaisena
asiakirjana. Komitea painatti sen, ja se teko todistaa komitean
tahdittomuutta eikä suinkaan kuninkaan petollisuutta ystäviään
kohtaan.»

»Ah, madame, tiedätte hyvin, mikä sai komitean ryhtymään sen


julkaisemiseen. Kunnianmiehenä en hyväksy sitä tekoa,
kansanedustajana en tunnusta sitä. Samaan aikaan kun kuningas
vannoi kiintymystänsä hallitusmuotoon hänellä oli Torinossa
jatkuvasti asiamies samaisen hallitusmuodon verivihollisten
keskuudessa. Hetkellä, jolloin hän puhui rahataloudellisista
uudistuksista ja tuntui hyväksyvän kansalliskokouksen siihen
suuntaan käyvät ehdotukset, hänellä oli Trierissä, hänen
palkkaamanaan ja avustamanaan iso ja pieni tallitalous, jota hoiti
prinssi de Lambesc, pariisilaisten verivihollinen, mies, jonka kansa
joka päivä vaatii hirtettäväksi kuvaannollisesti. Artoisin kreiville,
Condén prinssille ja kaikille emigranteille maksetaan suunnattomia
summia, vaikka kaksi kuukautta sitten säädettiin asetus, joka kieltää
nuo eläkkeet. Kuningas on tosin unohtanut hyväksyä asetuksen. Mitä
arvelette, madame! Näiden kahden kuukauden aikana on koetettu
saada selville, mihin on käytetty kuudenkymmenen miljoonan
suuruinen erä, muttei ole onnistuttu. Kun kuningasta pyydettiin ja
rukoiltiin ilmoittamaan, minne tämä rahamäärä oli joutunut, kieltäytyi
hän vastaamasta. Komitea arveli vapautuneensa lupauksestaan ja
painatti punaisen kirjan. Miksi kuningas luovuttaa hallustaan aseet,
jotka voidaan julmasti kääntää häntä itseään vastaan?»

»Jos teille, herra kreivi», huudahti kuningatar, »olisi suotu kunnia


neuvoa kuningasta, ette siis olisi neuvonut häntä niihin heikkouksiin,
joilla hänet johdetaan turmioon, joilla oli, sanokaamme suoraan…
joilla häneltä riistetään kunnia?»

»Jos minulle, madame, olisi suotu kunnia neuvoa kuningasta»,


vastasi Mirabeau, »seisoisin hänen rinnallaan puolustamassa lakiin
perustuvaa yksinvaltaa ja taistelemassa yksinvallan takaaman
vapauden puolesta. Tällä vapaudella, madame, on kolme vihollista:
papisto, aatelisto ja parlamentit. Papisto ei ole enää tämän
vuosisadan, sen on surmannut herra de Talleyrandin
valtiopäiväesitys. Aatelisto on kaikkien vuosisatojen. Sen apuun on
mielestäni turvauduttava, sillä aatelistotta ei ole kuninkuuttakaan,
mutta se täytyy pitää aisoissa, ja se on mahdollista vain liittämällä
kansa kuningasvaltaan. Kuningasvalta ei liittoudu milloinkaan
vapaaehtoisesti kansan kanssa, niin kauan kuin parlamentit pysyvät
pystyssä, sillä niiden mukana säilyy kuninkaalle kuten aatelistollekin
kohtalokas toivo palauttaa asiat ennalleen. Papiston tuhoamisen ja
parlamenttien lannistamisen jälkeen on minun politiikkani tehtäviä
voimistaa toimeenpanovaltaa, elvyttää kuninkaan arvovaltaa ja
yhdistää se kansalaisvapauteen. Madame, jos se on kuninkaankin
politiikkaa, hyväksyköön hän sen; ellei se sovellu hänelle, hylätköön
sen.»

»Herra kreivi», sanoi kuningatar hämmästellen tuon mahtavan


älyn säteilevää kirkkautta, joka yhtaikaa valaisi menneisyyttä,
nykyisyyttä ja tulevaisuutta, »en tiedä, omaksuuko kuningas sen
politiikan, mutta tiedän, että jos minulla olisi valta, minä sen
omaksuisin. Herra kreivi, esittäkää minulle keinonne, joiden avulla
aiotte pyrkiä tuohon päämäärään. Kuuntelen teitä, en sano
hartaana, innostuneena, sanon kiitollisena.»
Mirabeau loi kuningattareen nopean silmäyksen, kotkankatseen,
joka tunkeutui hänen sydämensä syvyyksiin, ja huomasi, että
kuningatar oli, ellei vakuutettu, niin ainakin lumottu.

Voitto Marie-Antoinetten kaltaisesta suurenmoisesta naisesta


hyväili mitä suloisimmin Mirabeaun turhamaisuutta.

»Madame», sanoi hän, »olemme menettäneet Pariisin, miltei


kokonaan. Mutta maaseudulla meillä on vielä hajanaisia joukkoja,
jotka me voimme yhdistää. Sen vuoksi, madame, on minun
käsittääkseni kuninkaan poistuttava Pariisista, muttei Ranskasta.
Menköön hän Roueniin armeijan suojaan. Sieltä käsin hän
julkaiskoon asetuksia, jotka lupaavat enemmän kuin
kansalliskokouksen päätökset. Siten vältetään kansalaissota, koska
kuningas osoittautuu vallankumouksellisemmaksi kuin itse
vallankumous.»

»Mutta eikö tämä vallankumous — edeltäköön tai seuratkoon se


meitä — eikö se siis kauhistuta teitä?» kysyi kuningatar.

»Ah, madame, luulen kaikkia muita paremmin tietäväni, että


vallankumouksessa on oltava mukana, sille on annettava jotakin
lahjaksi. Olen jo maininnut kuningattarelle, että on ihmisvoimat
ylittävä yritys koettaa rakentaa kuninkuus uudelleen niille antiikkisille
perusteille, jotka vallankumous on tuhonnut. Tässä
vallankumouksessa on koko Ranska ollut mukana, kuninkaasta
halvimpaan alamaiseen saakka, joko harrastajana, toimivana tai
vastustavana henkilönä. Minä en aiokaan puolustaa antiikkista
kuninkuutta, madame, minä haluan sitä rajoittaa, uudentaa ja
kohentaa sitä ja tehdä siitä likimain sellaisen hallituksen, joka on
kohottanut Englannin vallan ja maineen kukkulalle. Nähtyään
edessään — tohtori Gilbertin sanojen mukaan — Kaarlo ensimmäisen
vankilan- ja mestauslavan eikö kuningas mieluummin tyydykin
Wilhelm kolmannen ja Yrjö ensimmäisen valtaistuimeen?»

»Voi, herra kreivi», huudahti kuningatar, joka eräät Mirabeaun


sanat kuullessaan tuli kauhusta väristen muistelleeksi Taverneyn
linnassa näkemäänsä ilmestystä ja tohtori Guillotinin keksimän
teloituskoneen piirrosta, »voi, herra kreivi, antakaa meille se
kuninkuus ja te saatte kokea, olemmeko kiittämättömiä, kuten
meidän on syytetty olevan!»

»Hyvä, huudahti Mirabeau vuorostaan, »minä teen sen, madame.


Kuningas tukekoon, kuningatar rohkaiskoon minua, ja minä vannon
tässä jalkojenne juuressa aatelismiehen nimessä, että minä täytän
teidän majesteetillenne tekemäni lupauksen tai kuolen sitä
yrittäessäni!»

»Kreivi, kreivi», sanoi Marie-Antoinette, »älkää unohtako, että


useampi kuin yksi nainen on kuullut valanne: viiden vuosisadan
hallitsijasuku… seitsemänkymmentä Ranskan kuningasta, jotka
Pharamondista Ludvig viidenteentoista saakka nukkuvat haudassaan
ja jotka menettävät valtaistuimensa, jos meidän valtaistuimemme
luhistuu!»

»Tunnen tehtäväni laadun, madame. Tiedän, että se on


suunnaton. Mutta se ei ole suurempi kuin minun tahtoni, se ei ole
minun alttiuttani voimakkaampi. Kun olen varma kuningattareni
harrastuksesta ja kuninkaani luottamuksesta, käyn työhön käsiksi.»

»Ellei muusta ole kysymys, herra de Mirabeau, vakuutan, että


tulette saamaan molemmat.»

You might also like