You are on page 1of 41

(eBook PDF) Big Java: Early Objects,

6th Edition by Cay S. Horstmann


Visit to download the full and correct content document:
https://ebooksecure.com/download/ebook-pdf-big-java-early-objects-6th-edition-by-ca
y-s-horstmann/
Cay Horstmann

Big Java
6/e Early Objects

Includes Java 8 coverage

Horstmann_BJ6_JC8_cvs_final_cj.indd 1 4/29/15 1:46 PM


vi Preface

Part B: Object-Oriented Design (Chapters 8–12)


Chapter 8 takes up the subject of class design in a systematic fashion, and it intro-
duces a very simple subset of the UML notation. The discussion of polymorphism
and inheritance is split into two chapters. Chapter 9 covers inheritance and polymor-
phism, whereas Chapter 10 covers interfaces. Exception handling and basic file input/
output are covered in Chapter 11. The exception hierarchy gives a useful example for

1. Introduction

Fundamentals
2. Using Objects
Object-Oriented Design
Data Structures & Algorithms
Applied Topics
3. Implementing
Online Chapters
Classes

4. Fundamental
Data Types

5. Decisions

6. Loops

Sections 11.1 and 11.2


(text file processing) can be 7. Arrays
covered with Chapter 6. 6. Iteration
and Array Lists

11. Input/Output 8. Designing


13. Recursion
and Exception Classes
Handling

21. Advanced 23. Internet 24. Relational 15. The Java 14. Sorting
9. Inheritance
Input/Output Networking Databases Collections and Searching
Framework

26. Web
Applications 19. Stream
Processing

20. Graphical 22. 16. Basic


25. XML 10. Interfaces
User Interfaces Multithreading Data Structures

Figure 1 12. Object-


Chapter Oriented Design 18. Generic 17. Tree
Classes Structures
Dependencies
Preface vii

inheritance. Chapter 12 contains an introduction to object-oriented design, including


two significant case studies.

Part C: Data Structures and Algorithms (Chapters 13–19)


Chapters 13 through 19 contain an introduction to algorithms and data structures,
covering recursion, sorting and searching, linked lists, binary trees, and hash tables.
These topics may be outside the scope of a one-semester course, but can be covered
as desired after Chapter 7 (see Figure 1). Recursion, in Chapter 13, starts with simple
examples and progresses to meaningful applications that would be difficult to imple-
ment iteratively. Chapter 14 covers quadratic sorting algorithms as well as merge sort,
with an informal introduction to big-Oh notation. Each data structure is presented
in the context of the standard Java collections library. You will learn the essential
abstractions of the standard library (such as iterators, sets, and maps) as well as the
performance characteristics of the various collections. Chapter 18 introduces Java
generics. This chapter is suitable for advanced students who want to implement their
own generic classes and methods. Finally, Chapter 19 introduces the Java 8 streams
library and shows how it can be used to analyze complex real-world data.

Part D: Applied Topics (Chapters 20–26)


Chapters 20 through 26 cover Java programming techniques that definitely go
beyond a first course in Java (21–26 are on the book’s companion site). Although, as
already mentioned, a comprehensive coverage of the Java library would span many
© Alex Slobodkin/iStockphoto.

volumes, many instructors prefer that a textbook should give students additional
reference material valuable beyond their first course. Some institutions also teach a
second-semester course that covers more practical programming aspects such as data-
base and network programming, rather than the more traditional in-depth material
on data structures and algorithms. This book can be used in a two-semester course
to give students an introduction to programming fundamentals and broad coverage
of applications. Alternatively, the material in the final chapters can be useful for stu-
dent projects. The applied topics include graphical user-interface design, advanced
file handling, multithreading, and those technologies that are of particular interest to
server-side programming: networking, databases, XML, and web applications. The
Internet has made it possible to deploy many useful applications on servers, often
accessed by nothing more than a browser. This server-centric approach to application
development was in part made possible by the Java language and libraries, and today,
much of the industrial use of Java is in server-side programming.

Appendices
Many instructors find it highly beneficial to require a consistent style for all assign-
ments. If the style guide in Appendix E conflicts with instructor sentiment or local
customs, however, it is available in electronic form so that it can be modified. Appen-
dices F–J are available on the Web.
A. The Basic Latin and Latin-1 F. Tool Summary
Subsets of Unicode G. Number Systems
B. Java Operator Summary H. UML Summary
C. Java Reserved Word Summary I. Java Syntax Summary
D. The Java Library J. HTML Summary
E. Java Language Coding Guidelines
viii Preface

Custom Book and eBook Options


Big Java may be ordered in both custom print and eBook formats. You can order a
custom print version that includes your choice of chapters—including those from
other Horstmann titles. Visit customselect.wiley.com to create your custom order.
Big Java is also available in an electronic eBook format with three key advantages:
• The price is significantly lower than for the printed book.
• The eBook contains all material in the printed book plus the web chapters and
worked examples in one easy-to-browse format.
• You can customize the eBook to include your choice of chapters.
The interactive edition of Big Java adds even more value by integrating a wealth of
interactive exercises into the eBook. See http://wiley.com/go/bjeo6interactivities to
find out more about this new format.
Please contact your Wiley sales rep for more information about any of these
options or check www.wiley.com/college/horstmann for available versions.

Web Resources
This book is complemented by a complete suite of online resources. Go to www.wiley.
com/college/horstmann to visit the online companion sites, which include

• Source code for all example programs in the book and its Worked Examples, plus
additional example programs.
• Worked Examples that apply the problem-solving steps in the book to other
realistic examples.
• Lecture presentation slides (for instructors only).
• Solutions to all review and programming exercises (for instructors only).
• A test bank that focuses on skills, not just terminology (for instructors only). This
extensive set of multiple-choice questions can be used with a word processor or
imported into a course management system.
• “CodeCheck” assignments that allow students to work on programming prob-
lems presented in an innovative online service and receive immediate feedback.
Instructors can assign exercises that have already been prepared, or easily add
their own.

WORKED EXAMPLE 6.3 A Sample Debugging Session


Learn how to find bugs in an algorithm for counting the
Pointers in the book syllables of a word. Go to wiley.com/go/bjeo6examples and
download Worked Example 6.3.
describe what students
will find on the Web.
FULL CODE EXAMPLE

Go to wiley.com/go/
bjeo6code to download
a program that dem-
onstrates variables
and assignments.
Walkthrough ix

Walkthrough of the Learning Aids


The pedagogical elements in this book work together to focus on and reinforce key
concepts and fundamental principles of programming, with additional tips and detail
organized to support and deepen these fundamentals. In addition to traditional
features, such as chapter objectives and a wealth of exercises, each chapter contains
elements geared to today’s visual learner.

250 Chapter 6 Loops

6.3 The for Loop


Throughout each chapter,
It often happens that you want to execute a sequence of statements a given number
margin notes show where The for loop is
used when a of times. You can use a while loop that is controlled by a counter, as in the following
example:
new concepts are introduced
value runs from a
starting point to an
ending point with a int counter = 1; // Initialize the counter
and provide an outline of key ideas. constant increment
or decrement.
while (counter <= 10) // Check the counter
{
System.out.println(counter);
counter++; // Update the counter
}

Because this loop type is so common, there is a spe-


cial form for it, called the for loop (see Syntax 6.2).
for (int counter = 1; counter <= 10; counter++)
{
Additional full code examples }
System.out.println(counter);

provides complete programs for FULL CODE EXAMPLE Some people call this loop count-controlled. In con-
Go to wiley.com/go/ trast, the while loop of the preceding section can be
students to run and modify. bjeo6code to download
a program that
called an event-controlled loop because it executes
uses common loop until an event occurs; namely that the balance reaches
algorithms. the target. Another commonly used term for a
count-controlled loop is definite. You know from
the outset that the loop body will be executed a
definite number of times; ten times in our example.
In contrast, you do not know how many iterations it
takes to accumulate a target balance. Such a loop is
Annotated syntax boxes called indefinite. You can visualize the for loop as
an orderly sequence of steps.
provide a quick, visual overview
of new language constructs. Syntax 6.2 for Statement

Syntax for (initialization; condition; update)


{
statements
}
These three
expressions should be related.
See page 255.

Annotations explain required This initialization The condition is This update is


components and point to more happens once
before the loop starts .
checked before
each iteration.
executed after
each iteration.
information on common errors for (int i = 5; i <= 10; i++)
or best practices associated The v ariable i is
{
sum = sum + i; This loop executes 6 times.
with the syntax. defined only in this for loop.
See page 257.
} See page 256.

Analogies to everyday objects are


used to explain the nature and behavior
of concepts such as variables, data
Like a variable in a computer types, loops, and more.
program, a parking space has
an identifier and a contents.
x Walkthrough

Memorable photos reinforce


analogies and help students
remember the concepts.

In the same way that there can be a street named “Main Street” in different cities,
a Java program can have multiple variables with the same name.

Problem Solving sections teach


techniques for generating ideas and 7.5 Problem Solving: Discovering Algorithms by Manipulating Physical Objects 333

evaluating proposed solutions, often Now how does that help us with our problem, switching the first and the second
using pencil and paper or other half of the array?
Let’s put the first coin into place, by swapping it with the fifth coin. However, as
artifacts. These sections emphasize Java programmers, we will say that we swap the coins in positions 0 and 4:

that most of the planning and problem


solving that makes students successful
happens away from the computer.

Next, we swap the coins in positions 1 and 5:

HOW TO 6.1 Writing a Loop How To guides give step-by-step


This How To walks you through the process of implementing a guidance for common programming
loop statement. We will illustrate the steps with the following
example problem. tasks, emphasizing planning and
Problem Statement Read twelve temperature values (one for
each month) and display the number of the month with the high- testing. They answer the beginner’s
est temperature. For example, according to worldclimate.com, the
average maximum temperatures for Death Valley are (in order by question, “Now what do I do?” and
month, in degrees Celsius):
18.2 22.6 26.4 31.1 36.6 42.2 45.7 44.5 40.2 33.1 24.2 17.6
integrate key concepts into a
In this case, the month with the highest temperature (45.7 degrees problem-solving sequence.
Celsius) is July, and the program should display 7.

Step 1 Decide what work must be done inside the loop.

Every loop needs to do some kind of repetitive work, such as


• Reading another item.
• Updating a value (such as a bank balance or total).
• Incrementing a counter. Worked Examples apply
If you can’t figure out what needs to go inside the loop, start by writing down the steps that
the steps in the How To to a
WORKED EXAMPLE 6.1 Credit Card Processing different example, showing
Learn how to use a loop to remove spaces from a credit card
number. Go to wiley.com/go/bjeo6examples and download
how they can be used to
Worked Example 6.1.
plan, implement, and test
a solution to another
programming problem.
Table 1 Variable Declarations in Java
Variable Name Comment

int width = 20; Declares an integer variable and initializes it with 20.

int perimeter = 4 * width; The initial value need not be a fixed value. (Of course, width
must have been previously declared.)
String greeting = "Hi!"; This variable has the type String and is initialized with the
Example tables support beginners
string “Hi”. with multiple, concrete examples.
height = 30; Error: The type is missing. This statement is not a declaration
but an assignment of a new value to an existing variable—see These tables point out common
Section 2.2.5.
errors and present another quick
int width = "20"; Error: You cannot initialize a number with the string “20”.
(Note the quotation marks.) reference to the section’s topic.
int width; Declares an integer variable without initializing it. This can be a
cause for errors—see Common Error 2.1 on page 40.
int width, height; Declares two integer variables in a single statement. In this
book, we will declare each variable in a separate statement.
Walkthrough xi

This means “compute the value of width + 10 1 and store that value in the variable
width 2 ” (see Figure 4).
Progressive figures trace code
In Java, it is not a problem that the variable width is used on both sides of the = sym-
bol. Of course, in mathematics, the equation width = width + 10 has no solution.
segments to help students visualize
the program flow. Color is used
1 Compute the value of the right-hand side
consistently to make variables and
width = 30
other elements easily recognizable.
width + 10

40

2 Store the value in the variable Figure 3


1 Initialize counter
Execution of a for (int counter = 1; counter <= 10; counter++)
Figure 4 width = 40 for Loop {
Executing the Statement System.out.println(counter);
counter = 1 }
width = width + 10

2 Check condition
for (int counter = 1; counter <= 10; counter++)
{
System.out.println(counter);
counter = 1 }

3 Execute loop body


for (int counter = 1; counter <= 10; counter++)
{
System.out.println(counter);
counter = 1 }

4 Update counter
for (int counter = 1; counter <= 10; counter++)
{
System.out.println(counter);
counter = 2 }

5 Check condition again


for (int counter = 1; counter <= 10; counter++)
Self-check exercises at the {
System.out.println(counter);
end of each section are designed counter = 2 }

to make students think through


the new material—and can The for loop neatly groups the initialization, condition, and update expressions
together. However, it is important to realize that these expressions are not executed
spark discussion in lecture. together (see Figure 3).

• The initialization is executed once, before the loop is entered. 1


• The condition is checked before each iteration. 2 5
• The update is executed after each iteration. 4
11. Write the for loop of the Investment class as a while loop.
SELF CHECK
12. How many numbers does this loop print?
for (int n = 10; n >= 0; n--)
{
System.out.println(n);
}

13. Write a for loop that prints all even numbers between 10 and 20 (inclusive).
14. Write a for loop that computes the sum of the integers from 1 to n.

Practice It Now you can try these exercises at the end of the chapter: R6.4, R6.10, E6.8, E6.12.
Optional science and business
exercises engage students with •• Business E6.17 Currency conversion. Write a program

realistic applications of Java. that first asks the user to type today’s
price for one dollar in Japanese yen,
then reads U.S. dollar values and
converts each to yen. Use 0 as a sentinel.

• Science P6.15 Radioactive decay of radioactive materials can be


section_1/Investment.java modeled by the equation A = A0e-t (log 2/h), where A is
1 /** the amount of the material at time t, A0 is the amount
2 A class to monitor the growth of an investment that at time 0, and h is the half-life.
3 accumulates interest at a fixed annual rate.
4 */ Technetium-99 is a radioisotope that is used in imaging
5 public class Investment of the brain. It has a half-life of 6 hours. Your program
6 { should display the relative amount A / A0 in a patient
7 private double balance; body every hour for 24 hours after receiving a dose.
8 private double rate;
9 private int year;
10
11 /**
12 Constructs an Investment object from a starting balance and
13 interest rate.
14 @param aBalance the starting balance
15
16 */
@param aRate the interest rate in percent
Program listings are carefully
17 public Investment(double aBalance, double aRate)
18 { designed for easy reading,
19 balance = aBalance;
20
21
rate = aRate;
year = 0;
going well beyond simple
22
23
}
color coding. Methods are set
24
25
/**
Keeps accumulating interest until a target balance has off by a subtle outline.
26 been reached.
27 @param targetBalance the desired balance
28 */
xii Walkthrough

Length and Size


Common Errors describe the kinds Common Error 7.4
Unfortunately, the Java syntax for Data Type Number of Elements
of errors that students often make, determining the number of elements
in an array, an array list, and a string Array a.length
with an explanation of why the errors is not at all consistent. It is a com-
mon error to confuse these. You just Array list a.size()

occur, and what to do about them. have to remember the correct syntax
for every data type. String a.length()

Programming Tip 5.5 Hand-Tracing


A very useful technique for understanding whether a pro-
gram works correctly is called hand-tracing. You simulate
the program’s activity on a sheet of paper. You can use this
method with pseudocode or Java code.
Get an index card, a cocktail napkin, or whatever sheet
of paper is within reach. Make a column for each variable.
Have the program code ready. Use a marker, such as a
paper clip, to mark the current statement. In your mind,
execute statements one at a time. Every time the value of a
variable changes, cross out the old value and write the new
value below the old one. Hand-tracing helps you
For example, let’s trace the getTax method with the data understand whether a
Programming Tips explain from the program run above.
When the TaxReturn object is constructed, the income
program works correctly.

good programming practices, instance variable is set to 80,000 and status is set to MARRIED. Then the getTax method is called.
In lines 31 and 32 of TaxReturn.java, tax1 and tax2 are initialized to 0.
and encourage students to be 29 public double getTax()
30 {

more productive with tips and income status tax1 tax2


31 double tax1 = 0;
32 double tax2 = 0;
33 80000 MARRIED 0 0
techniques such as hand-tracing. Because status is not SINGLE, we move to the else
branch of the outer if statement (line 46).
34 if (status == SINGLE)
35 {
36 if (income <= RATE1_SINGLE_LIMIT)
37 {
38 tax1 = RATE1 * income;
39 }
40 else
41 {
42 tax1 = RATE1 * RATE1_SINGLE_LIMIT;
43 tax2 = RATE2 * (income - RATE1_SINGLE_LIMIT);
44 }
45 }
46 else
47 {

Special Topic 11.2 File Dialog Boxes


In a program with a graphical user interface, you will want to use a file dialog box (such as the
one shown in the figure below) whenever the users of your program need to pick a file. The
JFileChooser class implements a file dialog box for the Swing user-interface toolkit.
The JFileChooser class has many options to fine-tune the display of the dialog box, but in its
Special Topics present optional most basic form it is quite simple: Construct a file chooser object; then call the showOpenDialog
or showSaveDialog method. Both methods show the same dialog box, but the button for select-
topics and provide additional ing a file is labeled “Open” or “Save”, depending on which method you call.
For better placement of the dialog box on the screen, you can specify the user-interface
explanation of others. component over which to pop up the dialog box. If you don’t care where the dialog box pops
up, you can simply pass null. The showOpenDialog and showSaveDialog methods return either
JFileChooser.APPROVE_OPTION, if the user has chosen a file, or JFileChooser.CANCEL_OPTION, if the
user canceled the selection. If a file was chosen, then you call the getSelectedFile method to
obtain a File object that describes the file. Here is a complete example:
JFileChooser chooser = new JFileChooser();
Scanner in = null;
if (chooser.showOpenDialog(null) == JFileChooser.APPROVE_OPTION)
{

Java 8 Note 10.4 Lambda ExpressionsFile selectedFile = chooser.getSelectedFile();


in = new Scanner(selectedFile);
In the preceding. section,
. . you saw how to use interfaces for specifying variations in behavior.
The average method
} needs to measure each object, and it does so by calling the measure method
of the supplied Measurer object.
Unfortunately, the caller of the average method has to do a fair amount of work; namely,
to define a class that implements the Measurer interface and to construct an object of that class.
Java 8 has a convenient shortcut for these steps, provided that the interface has a single abstract
Java 8 Notes provide detail method. Such an interface is called a functional interface because its purpose is to define a
single function. The Measurer interface is an example of a functional interface.
about new features in Java 8. To specify that single function, you can use a lambda expression, an expression that defines
the parameters and return value of a method in a compact notation. Here is an example:
(Object obj) -> ((BankAccount) obj).getBalance()
This expression defines a function that, given an object, casts it to a BankAccount and returns the
balance.
(The term “lambda expression” comes from a mathematical notation that uses the Greek
letter lambda (λ) instead of the -> symbol. In other programming languages, such an expres-
sion is called a function expression.)
Computing
A lambda expression cannot stand& Society
alone. 1.1
It needs to Computers
be assigned Are
to a variable Everywhere
whose type is
a functional interface:
When computers Button
The is “Save”
advent when
of ubiqui-
Measurer accountMeas
were =first
(Object obj) -> tous
invented ((BankAccount)
showSaveDialog obj).getBalance();
computing changedmethod
in the 1940s, a computer filled an many aspects is calledof our
entire room. The photo below shows lives. Factories used
the ENIAC (electronic numerical inte- to employ people to
grator and computer),A JFileChooser
completed Dialog
in doBoxrepetitive assembly
1946 at the University of Pennsylvania. tasks that are today car-
The ENIAC was used by the military ried out by computer-
Computing & Society presents social to compute the trajectories of projec- controlled robots, oper-
tiles. Nowadays, computing facilities ated by a few people

and historical topics on computing—for of search engines, Internet shops, and who know how to work
social networks fill huge buildings with those computers.

interest and to fulfill the “historical and


called data centers. At the other end of Books, music, and mov-
the spectrum, computers are all around ies are nowadays often
us. Your cell phone has a computer consumed on com- This transit card contains a computer.
social context” requirements of the inside, as do many credit cards and fare puters, and comput-
cards for public transit. A modern car ers are almost always
ACM/IEEE curriculum guidelines. has several computers––to control the involved in their production. The
engine, brakes, lights, and the radio. book that you are reading right now
could not have been written without
computers.
Acknowledgments xiii

Acknowledgments
Many thanks to Bryan Gambrel, Don Fowley, Jenny Welter, Jessy Moor, Jennifer
Lartz, Billy Ray, and Tim Lindner at John Wiley & Sons, and Vickie Piercey at Pub-
lishing Services for their help with this project. An especially deep acknowledgment
and thanks goes to Cindy Johnson for her hard work, sound judgment, and amazing
attention to detail.
I am grateful to Jose Cordova, The University of Louisiana at Monroe, Suzanne
Dietrich, Arizona State University,West Campus, Mike Domaratzki, University of
Manitoba, Guy Helmer, Iowa State University, Peter Lutz, Rochester Institute of
Technology, Carolyn Schauble, Colorado State University, Brent Seales, University
of Kentucky, and Brent Wilson, George Fox University for their excellent contribu-
tions to the supplementary materials.
Many thanks to the individuals who reviewed the manuscript for this edition,
made valuable suggestions, and brought an embarrassingly large number of errors
and omissions to my attention. They include:
Robin Carr, Drexel University
Gerald Cohen, The Richard Stockton College of New Jersey
Aaron Keen, California Polytechnic State University, San Luis Obispo
Aurelia Smith, Columbus State University
Aakash Taneja, The Richard Stockton College of New Jersey
Craig Tanis, University of Tennessee at Chattanooga
Katherine Winters, University of Tennessee at Chattanooga
Every new edition builds on the suggestions and experiences of prior reviewers and
users. I am grateful for the invaluable contributions these individuals have made:

Eric Aaron, Wesleyan University John Bundy, DeVry University Lennie Cooper, Miami Dade College
James Agnew, Anne Arundel Chicago Jose Cordova, University of
Community College Robert P. Burton, Brigham Young Louisiana, Monroe
Tim Andersen, Boise State University Valentino Crespi, California State
University Frank Butt, IBM University, Los Angeles
Ivan Bajic, San Diego State Jerry Cain, Stanford University Jim Cross, Auburn University
University Adam Cannon, Columbia Russell Deaton, University
Greg Ballinger, Miami Dade College University of Arkansas
Ted Bangay, Sheridan Institute Michael Carney, Finger Lakes Geoffrey Decker, Northern Illinois
of Technology Community College University
Ian Barland, Radford University Christopher Cassa, Massachusetts H. E. Dunsmore, Purdue University
George Basham, Franklin University Institute of Technology Robert Duvall, Duke University
Jon Beck, Truman State University Nancy Chase, Gonzaga University Sherif Elfayoumy, University of
Sambit Bhattacharya, Fayetteville Dr. Suchindran S. Chatterjee, North Florida
State University Arizona State University Eman El-Sheikh, University of
Rick Birney, Arizona State Archana Chidanandan, Rose- West Florida
University Hulman Institute of Technology Henry A. Etlinger, Rochester
Paul Bladek, Edmonds Community Vincent Cicirello, The Richard Institute of Technology
College Stockton College of New Jersey John Fendrich, Bradley University
Matt Boutell, Rose-Hulman Teresa Cole, Boise State University David Freer, Miami Dade College
Institute of Technology Deborah Coleman, Rochester John Fulton, Franklin University
Joseph Bowbeer, Vizrea Corporation Institute of Technology David Geary, Sabreware, Inc.
Timothy A. Budd, Oregon State Tina Comston, Franklin University Margaret Geroch, Wheeling Jesuit
University University
xiv Acknowledgments

Ahmad Ghafarian, North Georgia Joan McGrory, Christian Brothers John Santore, Bridgewater State
College & State University University College
Rick Giles, Acadia University Carolyn Miller, North Carolina Javad Shakib, DeVry University
Stacey Grasso, College of San Mateo State University Carolyn Schauble, Colorado State
Jianchao Han, California State Sandeep R. Mitra, State University University
University, Dominguez Hills of New York, Brockport Brent Seales, University of Kentucky
Lisa Hansen, Western New England Teng Moh, San Jose State University Christian Shin, SUNY Geneseo
College Bill Mongan, Drexel University Charlie Shu, Franklin University
Elliotte Harold John Moore, The Citadel Jeffrey Six, University of Delaware
Eileen Head, Binghamton Jose-Arturo Mora-Soto, Jesica Don Slater, Carnegie Mellon
University Rivero-Espinosa, and Julio-Angel University
Cecily Heiner, University of Utah Cano-Romero, University Ken Slonneger, University of Iowa
Guy Helmer, Iowa State University of Madrid Donald Smith, Columbia College
Ed Holden, Rochester Institute Faye Navabi, Arizona State Joslyn A. Smith, Florida
of Technology University International University
Brian Howard, Depauw University Parviz Partow-Navid, California Stephanie Smullen, University of
Lubomir Ivanov, Iona College State University, Los Angeles Tennessee, Chattanooga
Norman Jacobson, University of George Novacky, University Robert Strader, Stephen F. Austin
California, Irvine of Pittsburgh State University
Steven Janke, Colorado College Kevin O’Gorman, California Monica Sweat, Georgia Institute
Curt Jones, Bloomsburg University Polytechnic State University, San of Technology
Luis Obispo Peter Stanchev, Kettering University
Mark Jones, Lock Haven University
of Pennsylvania Michael Olan, Richard Stockton Shannon Tauro, University of
College California, Irvine
Dr. Mustafa Kamal, University of
Central Missouri Mimi Opkins, California State Ron Taylor, Wright State University
University Long Beach
Mugdha Khaladkar, New Jersey Russell Tessier, University of
Institute of Technology Derek Pao, City University of Massachusetts, Amherst
Hong Kong
Gary J. Koehler, University of Jonathan L. Tolstedt, North Dakota
Florida Kevin Parker, Idaho State University State University
Elliot Koffman, Temple University Jim Perry, Ulster County David Vineyard, Kettering
Community College University
Ronald Krawitz, DeVry University
Cornel Pokorny, California Joseph Vybihal, McGill University
Norm Krumpe, Miami University
Polytechnic State University,
Ohio Xiaoming Wei, Iona College
San Luis Obispo
Jim Leone, Rochester Institute Jonathan S. Weissman, Finger Lakes
Roger Priebe, University of Texas,
of Technology Community College
Austin
Kevin Lillis, St. Ambrose University Todd Whittaker, Franklin University
C. Robert Putnam, California State
Darren Lim, Siena College University, Northridge Robert Willhoft, Roberts Wesleyan
Hong Lin, DeVry University College
Kai Qian, Southern Polytechnic
Kathy Liszka, University of Akron State University Lea Wittie, Bucknell University
Hunter Lloyd, Montana State Cyndi Rader, Colorado School David Womack, University of Texas
University of Mines at San Antonio
Youmin Lu, Bloomsburg University Neil Rankin, Worcester Polytechnic David Woolbright, Columbus State
Kuber Maharjan, Purdue University Institute University
College of Technology at Brad Rippe, Fullerton College Tom Wulf, University of Cincinnati
Columbus Pedro I. Rivera Vega, University Catherine Wyman, DeVry
John S. Mallozzi, Iona College of Puerto Rico, Mayaguez University
John Martin, North Dakota State Daniel Rogers, SUNY Brockport Arthur Yanushka, Christian Brothers
University University
Chaman Lal Sabharwal, Missouri
Jeanna Matthews, Clarkson University of Science and Qi Yu, Rochester Institute of
University Technology Technology
Patricia McDermott-Wells, Florida Katherine Salch, Illinois Central Salih Yurttas, Texas A&M University
International University College
Scott McElfresh, Carnegie Mellon
University
CONTENTS

PREFACE iii 2.5 Accessor and Mutator Methods  48


SPECIAL FEATURES xxiv 2.6 The API Documentation  50
Browsing the API Documentation   50
Packages  52
1 INTRODUCTION 1
2.7 Implementing a Test Program  53
1.1 Computer Programs   2 ST1 Testing Classes in an Interactive
1.2 The Anatomy of a Computer   3 Environment 54
WE1 How Many Days Have You Been Alive?
1.3 The Java Programming Language   6 © Alex Slobodkin/iStoc
WE2 Working with Pictures
1.4 Becoming Familiar with Your © Alex Slobodkin/iStockphoto.
2.8 Object References  55
Programming Environment   7
2.9 Graphical Applications  59
1.5 Analyzing Your First Program   11
Frame Windows  59
1.6 Errors  14 Drawing on a Component   60
1.7 PROBLEM SOLVING Algorithm Design   15 Displaying a Component in a Frame   63
The Algorithm Concept   16 2.10 Ellipses, Lines, Text, and Color  64
An Algorithm for Solving an Investment Ellipses and Circles   64
Problem  17
Lines  65
Pseudocode  18
Drawing Text  65
From Algorithms to Programs   18
Colors  66
HT1 Describing an Algorithm with
Pseudocode 19
WE1 Writing an Algorithm for Tiling a Floor 21 3 IMPLEMENTING CLASSES 79
3.1 Instance Variables and Encapsulation  80
2 USING OBJECTS 31 Instance Variables  80
The Methods of the Counter Class   82
2.1 Objects and Classes  32
Encapsulation  82
Using Objects  32
Classes  33 3.2 Specifying the Public Interface
of a Class  84
2.2 Variables  34
Specifying Methods  84
Variable Declarations  34
Specifying Constructors  85
Types  36
Using the Public Interface   87
Names  37
Commenting the Public Interface   87
Comments  38
Assignment  38 3.3 Providing the Class Implementation  91
Providing Instance Variables   91
2.3 Calling Methods  41
Providing Constructors  92
The Public Interface of a Class   41
Providing Methods  93
Method Arguments  42
HT1 Implementing a Class 96
Return Values  43
WE1 Making a Simple Menu
Method Declarations  45
© Alex Slobodkin/iStockphoto.
2.4 Constructing Objects  46 3.4 Unit Testing  100

xv
xvi Contents

3.5 PROBLEM SOLVING Tracing Objects  103 5 DECISIONS 177


3.6 Local Variables  105
5.1 The if Statement   178
3.7 The this Reference  107
ST1 The Conditional Operator 182
ST1 Calling One Constructor from Another 110
5.2 Comparing Values   183
3.8 Shape Classes  110
Relational Operators  184
HT2 Drawing Graphical Shapes 114
Comparing Floating-Point Numbers   185
Comparing Strings  186
4 FUNDAMENTAL DATA Comparing Objects  187
TYPES 129 Testing for null  187
HT1 Implementing an if Statement 190
4.1 Numbers  130 WE1 Extracting the Middle
Number Types  130 © Alex Slobodkin/iStockphoto.
5.3 Multiple Alternatives   193
Constants  132 ST2 The switch Statement 196
ST1 Big Numbers 136
5.4 Nested Branches   196
4.2 Arithmetic  137 ST3 Block Scope 201
Arithmetic Operators  137 ST4 Enumeration Types 203
Increment and Decrement   138
5.5 PROBLEM SOLVING Flowcharts   203
Integer Division and Remainder   138
Powers and Roots   139 5.6 PROBLEM SOLVING Selecting Test
Converting Floating-Point Numbers Cases  206
to Integers  140 ST5 Logging 208
J81 Avoiding Negative Remainders 143
5.7 Boolean Variables and Operators   209
ST2 Combining Assignment and Arithmetic 143
ST6 Short-Circuit Evaluation of Boolean
ST3 Instance Methods and Static Methods 143 Operators 213
4.3 Input and Output   145 ST7 De Morgan’s Law 213
Reading Input    145 5.8 APPLICATION Input Validation   214
Formatted Output  146
HT1 Carrying Out Computations 149
WE1 Computing the Volume and Surface Area of
6 LOOPS 237
a Pyramid
© Alex Slobodkin/iStockphoto.
6.1 The while Loop   238
4.4 PROBLEM SOLVING First Do it By Hand   152
6.2 PROBLEM SOLVING Hand-Tracing   245
WE2 Computing Travel Time
© Alex Slobodkin/iStockphoto.6.3 The for Loop   250
4.5 Strings  154
ST1 Variables Declared in a for Loop
The String Type  154 Header 257
Concatenation  155
String Input  155 6.4 The do Loop   258
Escape Sequences  156 6.5 APPLICATION Processing Sentinel
Strings and Characters   156 Values  259
Substrings  157 ST2 Redirection of Input and Output 262
ST4 Using Dialog Boxes for Input and ST3 The “Loop and a Half” Problem 262
Output 160 ST4 The break and continue Statements 263

6.6 PROBLEM SOLVING Storyboards   265


6.7 Common Loop Algorithms   268
Sum and Average Value   268
Counting Matches  268
Contents xvii

Finding the First Match   269 7.6 Two-Dimensional Arrays  336


Prompting Until a Match is Found   270 Declaring Two-Dimensional Arrays   336
Maximum and Minimum   270 Accessing Elements  337
Comparing Adjacent Values   271 Locating Neighboring Elements   338
HT1 Writing a Loop 272 Accessing Rows and Columns   338
WE1 Credit Card Processing WE2 A World Population Table
© Alex Slobodkin/iStockphoto. © Alex Slobodkin/iStockphoto.
6.8 Nested Loops   275 ST3 Two-Dimensional Arrays with Variable
WE2 Manipulating the Pixels in an Image Row Lengths 341
ST4 Multidimensional Arrays
© Alex Slobodkin/iStockphoto. 343
6.9 APPLICATION Random Numbers and
Simulations  279 7.7 Array Lists  343
Generating Random Numbers   279 Declaring and Using Array Lists   344
The Monte Carlo Method   281 Using the Enhanced for Loop with
Array Lists  345
6.10 Using a Debugger  282 Copying Array Lists   346
HT2 Debugging 285 Wrappers and Auto-boxing   347
WE3 A Sample Debugging Session Using Array Algorithms with Array Lists   348
© Alex Slobodkin/iStockphoto. Storing Input Values in an Array List   348

Removing Matches  348
7 ARRAYS AND ARRAY Choosing Between Array Lists and Arrays   349
LISTS 307 ST5 The Diamond Syntax 352

7.1 Arrays  308 7.8 Regression Testing  352


Declaring and Using Arrays   308
Array References  311
8 DESIGNING CLASSES 375
Using Arrays with Methods   312
Partially Filled Arrays   312 8.1 Discovering Classes   376
ST1 Methods with a Variable Number of
8.2 Designing Good Methods   377
Arguments 315
Providing a Cohesive Public Interface   377
7.2 The Enhanced for Loop  317 Minimizing Dependencies  378
7.3 Common Array Algorithms  318 Separating Accessors and Mutators   379
Filling  318 Minimizing Side Effects   380
Sum and Average Value   319 ST1 Call by Value and Call by Reference 382
Maximum and Minimum   319 8.3 PROBLEM SOLVING Patterns for
Element Separators  319
Object Data   386
Linear Search  320
Keeping a Total   386
Removing an Element   320
Counting Events  387
Inserting an Element   321
Collecting Values  387
Swapping Elements  322
Managing Properties of an Object   388
Copying Arrays  323
Modeling Objects with Distinct States   388
Reading Input  324
Describing the Position of an Object   389
ST2 Sorting with the Java Library 327
8.4 Static Variables and Methods   391
7.4 PROBLEM SOLVING Adapting
ST2 Alternative Forms of Instance and Static
Algorithms  327 Variable Initialization 394
HT1 Working with Arrays 330
ST3 Static Imports 395
WE1 Rolling the Dice
© Alex Slobodkin/iStockphoto. 8.5 PROBLEM SOLVING Solve a Simpler
7.5 PROBLEM SOLVING Discovering Algorithms by
Problem First   395
Manipulating Physical Objects  332
xviii Contents

8.6 Packages  400 10.2 Working with Interface Variables   475


Organizing Related Classes into Pack­ages   400 Converting from Classes to Interfaces   475
Importing Packages  401 Invoking Methods on Interface Variables   476
Package Names  401 Casting from Interfaces to Classes    476
Packages and Source Files   402 WE1 Investigating Number Sequences
ST4 Package Access 403 © Alex Slobodkin/iStockphoto.
10.3 The Comparable Interface   477
HT1 Programming with Packages 404 ST2 The clone Method and the Cloneable
8.7 Unit Test Frameworks   405 Interface 479
10.4 Using Interfaces for Callbacks   482
9 INHERITANCE 423 J84 Lambda Expressions 485
ST3 Generic Interface Types 486
9.1 Inheritance Hierarchies   424 10.5 Inner Classes   487
9.2 Implementing Subclasses   428 ST4 Anonymous Classes 488
9.3 Overriding Methods   433 10.6 Mock Objects   489
ST1 Calling the Superclass Constructor 438 10.7 Event Handling   490
9.4 Polymorphism  439 Listening to Events   491
ST2 Dynamic Method Lookup and the Implicit Using Inner Classes for Listeners   493
Parameter 442 J85 Lambda Expressions for Event Handling 496
ST3 Abstract Classes 443
10.8 Building Applications with Buttons   496
ST4 Final Methods and Classes 444
ST5 Protected Access 444 10.9 Processing Timer Events   499
HT1 Developing an Inheritance Hierarchy 445 10.10 Mouse Events   502
WE1 Implementing an Employee Hierarchy for ST5 Keyboard Events 506
Payroll Processing ST6 Event Adapters 506
© Alex Slobodkin/iStockphoto.
9.5 Object: The Cosmic Superclass   450
Overriding the toString Method    450 11 INPUT/OUTPUT AND
The equals Method  452 EXCEPTION HANDLING 519
The instanceof Operator  453
ST6 Inheritance and the toString Method 455 11.1 Reading and Writing Text Files   520
ST7 Inheritance and the equals Method 456 ST1 Reading Web Pages 523
ST2 File Dialog Boxes 523
ST3 Character Encodings 524
10 INTERFACES 465
11.2 Text Input and Output   525
10.1 Using Interfaces for Algorithm Reading Words  525
Reuse  466 Reading Characters  526
Discovering an Interface Type   466 Classifying Characters  526
Declaring an Interface Type   467 Reading Lines  527
Implementing an Interface Type   469 Scanning a String   528
Comparing Interfaces and Inheritance   471 Converting Strings to Numbers   528
ST1 Constants in Interfaces 473 Avoiding Errors When Reading Numbers   529
J81 Static Methods in Interfaces 473 Mixing Number, Word, and Line Input   529
J82 Default Methods 473 Formatting Output  530
J83 Conflicting Default Methods 474 ST4 Regular Expressions 532
ST5 Reading an Entire File 533
Contents xix

11.3 Command Line Arguments   533 13.3 The Efficiency of Recursion   604
HT1 Processing Text Files 536 13.4 Permutations  609
WE1 Analyzing Baby Names
© Alex Slobodkin/iStockphoto.
13.5 Mutual Recursion   614
11.4 Exception Handling   540
13.6 Backtracking  620
Throwing Exceptions  540
WE2 Towers of Hanoi
Catching Exceptions  542 © Alex Slobodkin/iStockphoto.
Checked Exceptions  543
Closing Resources  545 14 SORTING AND
Designing Your Own Exception Types   546 SEARCHING 635
ST6 Assertions 549
ST7 The try/finally Statement 549 14.1 Selection Sort   636
11.5 APPLICATION Handling Input Errors   549 14.2 Profiling the Selection Sort
Algorithm  639
14.3 Analyzing the Performance of the
12 OBJECT-ORIENTED
Selection Sort Algorithm   642
DESIGN 565
ST1 Oh, Omega, and Theta 644
12.1 Classes and Their Responsibilities   566 ST2 Insertion Sort 645
Discovering Classes  566 14.4 Merge Sort   647
The CRC Card Method   567
14.5 Analyzing the Merge Sort Algorithm   650
12.2 Relationships Between Classes   569 ST3 The Quicksort Algorithm 652
Dependency  569 14.6 Searching  654
Aggregation  570
Linear Search  654
Inheritance  571
Binary Search  655
HT1 Using CRC Cards and UML Diagrams in
Program Design 572 14.7 PROBLEM SOLVING Estimating the Running
ST1 Attributes and Methods in UML Time of an Algorithm   659
Diagrams 573 Linear Time  659
ST2 Multiplicities 574 Quadratic Time  660
ST3 Aggregation, Association, and The Triangle Pattern   661
Composition 574 Logarithmic Time  662
12.3 APPLICATION Printing an Invoice   575 14.8 Sorting and Searching in the Java
Requirements  575 Library  664
CRC Cards  576 Sorting  664
UML Diagrams  578 Binary Search  664
Method Documentation  579 Comparing Objects  665
Implementation  581 ST4 The Comparator Interface 666
WE1 Simulating an Automatic Teller Machine J81 Comparators with Lambda Expressions 667
© Alex Slobodkin/iStockphoto.
WE1 Enhancing the Insertion Sort Algorithm
© Alex Slobodkin/iSt
13 RECURSION 593
15 THE JAVA COLLECTIONS
13.1 Triangle Numbers   594
FRAMEWORK 677
HT1 Thinking Recursively 599
WE1 Finding Files 15.1 An Overview of the Collections
© Alex Slobodkin/iStockphoto.
13.2 Recursive Helper Methods   602 Framework  678
xx Contents

15.2 Linked Lists   681 Stacks as Linked Lists   741


The Structure of Linked Lists   681 Stacks as Arrays   743
The LinkedList Class of the Java Collections Queues as Linked Lists   743
Framework  682 Queues as Circular Arrays   744
List Iterators  683 16.4 Implementing a Hash Table   747
15.3 Sets  687 Hash Codes  747
Choosing a Set Implementation   687 Hash Tables  747
Working with Sets   688 Finding an Element   749
Adding and Removing Elements    749
15.4 Maps  692
Iterating over a Hash Table   750
J81 Updating Map Entries 694
ST2 Open Addressing 755
HT1 Choosing a Collection 694
WE1 Word Frequency
© Alex Slobodkin/iStockphoto.
ST1 Hash Functions 696 17 TREE STRUCTURES 765
15.5 Stacks, Queues, and Priority Queues   698
17.1 Basic Tree Concepts   766
Stacks  698
17.2 Binary Trees   770
Queues  699
Priority Queues  699 Binary Tree Examples   770
Balanced Trees  772
15.6 Stack and Queue Applications   701
A Binary Tree Implementation   773
Balancing Parentheses  701 WE1 Building a Huffman Tree
Evaluating Reverse Polish Expressions   702 © Alex Slobodkin/iStockphoto.
Evaluating Algebraic Expressions   703 17.3 Binary Search Trees   775
Backtracking  706 The Binary Search Property   775
WE2 Simulating a Queue of Waiting Insertion  776
Customers Removal  778
© Alex
ST2 Reverse Polish Slobodkin/iStockphoto.
Notation 709 Efficiency of the Operations   780
17.4 Tree Traversal   784
16 BASIC DATA Inorder Traversal  784
Preorder and Postorder Traversals   785
STRUCTURES 721
The Visitor Pattern   786
16.1 Implementing Linked Lists   722 Depth-First and Breadth-First Search   787
Tree Iterators  789
The Node Class   722
Adding and Removing the First Element   723 17.5 Red-Black Trees  790
The Iterator Class   724 Basic Properties of Red-Black Trees   790
Advancing an Iterator   725 Insertion  792
Removing an Element   726 Removal  793
Adding an Element   728 WE2 Implementing a Red-Black Tree
Setting an Element to a Different Value   729 © Alex Slobodkin/iStockphoto.
17.6 Heaps  797
Efficiency of Linked List Operations   729
ST1 Static Classes 736 17.7 The Heapsort Algorithm   808
WE1 Implementing a Doubly-Linked List

16.2 Implementing Array Lists   737


© Alex Slobodkin/iStockphoto.
18 GENERIC CLASSES 823
Getting and Setting Elements   737
18.1 Generic Classes and Type
Removing or Adding Elements   738
Growing the Internal Array   739 Parameters  824

16.3 Implementing Stacks and Queues   741 18.2 Implementing Generic Types   825
Contents xxi

18.3 Generic Methods   829 Achieving Complex Layouts   885


Using Inheritance to Customize Frames   886
18.4 Constraining Type Parameters   831
ST1 Adding the main Method to the
ST1 Wildcard Types 834
Frame Class 888
18.5 Type Erasure   835
20.2 Processing Text Input   888
ST2 Reflection 838
Text Fields  888
WE1 Making a Generic Binary Search
Text Areas  891
Tree Class
© Alex Slobodkin/iStockphoto. 20.3 Choices  894
Radio Buttons  894
19 STREAM PROCESSING 845
Check Boxes  895
19.1 The Stream Concept   846 Combo Boxes  896
HT1 Laying Out a User Interface 901
19.2 Producing Streams   848
WE1 Programming a Working Calculator
19.3 Collecting Results   850 © Alex Slobodkin/iStockph
20.4 Menus  905
ST1 Infinite Streams 851
20.5 Exploring the Swing Documentation   911
19.4 Transforming Streams   852
19.5 Lambda Expressions   855
ST2 Method and Constructor References 857
21 ADVANCED INPUT/OUTPUT
ST3 Higher-Order Functions 858
(WEB ONLY)
© Alex Slobodkin/iStockphoto.

ST4 Higher-Order Functions and


21.1 Readers, Writers, and Input/Output Streams
Comparators 859
21.2 Binary Input and Output
19.6 The Optional Type   859
21.3 Random Access
19.7 Other Terminal Operations   862
21.4 Object Input and Output Streams
19.8 Primitive-Type Streams   863
HT1 Choosing a File Format
Creating Primitive-Type Streams   864
Mapping a Primitive-Type Stream   864 21.5 File and Directory Operations
Processing Primitive-Type Streams   864 Paths
Creating and Deleting Files and Directories
19.9 Grouping Results   866
Useful File Operations
19.10 Common Algorithms Revisited   868 Visiting Directories
Filling  868
Sum, Average, Maximum, and Minimum   869
Counting Matches  869
22 MULTITHREADING
Element Separators  869 (WEB ONLY)
© Alex Slobodkin/iStockphoto.
Linear Search  870
22.1 Running Threads
Comparing Adjacent Values   870
ST1 Thread Pools
HT1 Working with Streams 871
WE1 Word Properties 22.2 Terminating Threads
© Alex Slobodkin/iStockphoto.
WE2 A Movie Database 22.3 Race Conditions
© Alex Slobodkin/iStockphoto.
22.4 Synchronizing Object Access
20 GRAPHICAL USER 22.5 Avoiding Deadlocks
INTERFACES 883 ST2 Object Locks and Synchronized Methods
ST3 The Java Memory Model
20.1 Layout Management   884
22.6 APPLICATION Algorithm Animation
Using Layout Managers   884
xxii Contents

23 INTERNET NETWORKING 25.3 Creating XML Documents


(WEB ONLY) HT2 Writing an XML Document
© Alex Slobodkin/iStockphoto.
ST1 Grammars, Parsers, and Compilers
23.1 The Internet Protocol
25.4 Validating XML Documents
23.2 Application Level Protocols Document Type Definitions
23.3 A Client Program Specifying a DTD in an XML Document
Parsing and Validation
23.4 A Server Program
HT3 Writing a DTD
HT1 Designing Client/Server Programs
ST2 Schema Languages
23.5 URL Connections
ST3 Other XML Technologies

24 RELATIONAL DATABASES 26 WEB APPLICATIONS


(WEB ONLY) (WEB ONLY)
© Alex Slobodkin/iStockphoto.
© Alex Slobodkin/iStockphoto.

24.1 Organizing Database Information


26.1 The Architecture of a Web Application
Database Tables
26.2 The Architecture of a JSF Application
Linking Tables
Implementing Multi-Valued Relation­ships JSF Pages
ST1 Primary Keys and Indexes Managed Beans
Separation of Presentation and Business Logic
24.2 Queries Deploying a JSF Application
Simple Queries ST1 Session State and Cookies
Selecting Columns
26.3 JavaBeans Components
Selecting Subsets
Calculations 26.4 Navigation Between Pages
Joins HT1 Designing a Managed Bean
Updating and Deleting Data 26.5 JSF Components
24.3 Installing a Database 26.6 APPLICATION A Three-Tier Application
24.4 Database Programming in Java ST2 AJAX
Connecting to the Database
Executing SQL Statements Appendix A THE BASIC LATIN AND LATIN-1 SUBSETS
Analyzing Query Results OF UNICODE    A-1
Result Set Metadata Appendix B JAVA OPERATOR SUMMARY   A-5
24.5 APPLICATION Entering an Invoice Appendix C JAVA RESERVED WORD SUMMARY   A-7
ST2 Transactions Appendix D THE JAVA LIBRARY   A-9
ST3 Object-Relational Mapping Appendix E JAVA LANGUAGE CODING
WE1 Programming a Bank Database GUIDELINES  A-39
Appendix F TOOL SUMMARY
25 XML (WEB ONLY) Appendix G NUMBER SYSTEMS © Alex Slobodkin/iStockphoto.
© Alex Slobodkin/iStockphoto.
Appendix H UML SUMMARY © Alex Slobodkin/iStockphoto.
25.1 XML Tags and Documents Appendix I © Alex Slobodkin/iStockphoto.
JAVA SYNTAX SUMMARY
Advantages of XML Appendix J HTML SUMMARY © Alex Slobodkin/iStockphoto.
Differences Between XML and HTML © Alex Slobodkin/iStockphoto.
The Structure of an XML Document
GLOSSARY  G-1
HT1 Designing an XML Document Format
INDEX  I-1
25.2 Parsing XML Documents
CREDITS  C-1
Contents xxiii

ALPHABETICAL LIST OF SYNTAX BOXES


Arrays   309
Array Lists    343
Assignment   39
Calling a Superclass Method   433
Cast  141
Catching Exceptions    542
Class Declaration  87
Comparisons   184
Constant Declaration  134
Constructor with Superclass Initializer   438
Declaring a Generic Class   826
Declaring a Generic Method   830
Declaring an Interface   468
for Statement    250
if Statement    180
Implementing an Interface   469
Importing a Class from a Package   52
Input Statement    145
Instance Variable Declaration   81
Java Program  12
Lambda Expressions  855
Object Construction  47
Package Specification  401
Subclass Declaration  430
The Enhanced for Loop  318
The instanceof Operator  453
The throws Clause  545
The try-with-resources Statement  545
Throwing an Exception   540
Two-Dimensional Array Declaration   337
while Statement  239
Variable Declaration  35
Another random document with
no related content on Scribd:
he ovat tyytyväiset sittenkin, he ovat halukkaat tekemään vieläkin
työtä puolestanne ja tyytymään pieneen palkkaan, joka jättää heidät
köyhiksi, mutta ei puutteeseen. He ovat melkein orjia, mutta
kumminkin onnellisia omistamallanne kauniilla tasangolla, jota
Jumala on erityisesti siunannut».

»Tuohan on hyvin kiltisti tehty heiltä, aivan varmasti, ystäväni,


enkä minä aiokaan tilata työmiehiä itselleni mistään toisesta
maakunnasta. Tosin en kyllä tarvitse myllyssäni niin monta miestä
kuin ennen, sillä olen iloinen voidessani ilmoittaa, että höyrymyllyni
on valmis ja…»

»Suokaa minulle anteeksi, kreivi, että keskeytän, mutta juuri tuo


mylly onkin kaiken tämän levottomuuden syy. Muistakaa, ettemme
ole niin oppineita kuin teidän korkeutenne, emmekä senvuoksi
ymmärräkään kaikkia noita keinoja, miten tuli ja teräs pakotetaan
tekemään ihmisten töitä. Se on peloittanut naiset kokonaan, ja
miehet, vaikka he eivät halua tunnustaakaan pelkoaan, kiroilevat
mielessään tuota laitosta, joka on vievä leivän heidän suustaan
siten, etteivät he enää saa tarpeeksi palkkaa».

»Mutta, hyvä mies, olen uhrannut tuhansia tuohon myllyyn. Et


suinkaan ole niin suuri tyhmeliini, että ehdotat minulle luopumista
tuosta vuosia kestäneestä työstä senvuoksi, että muutamat
taikauskoiset vanhat naiset ovat iskeneet pääsi täyteen kaikenlaisia
pirullisia tyhmyyksiä»?

»Ei, ei senvuoksi», sanoi András kiihkeästi. »En luule ollenkaan,


että teidän korkeutenne luopuu suunnitelmistaan jostakin
mitättömästä syystä, vaan uskon varmasti, että teette sen
säästääksenne tilallanne asuvat inmisraukat surusta ja
levottomuudesta».
»Kunnon mies, sanoin sinulle jo äsken, että puhut kuin litkisit
kirjasta, mutta kirjoissa on joskus hyvin paljon tyhmyyksiä. Kuulit kai,
kun sanoin, että höyrymyllyni, jota te pian tulette polvistuen
palvelemaan, on maksanut minulle neljännesmiljoonan. Luuletko
minun heittävän niin suuren rahamäärän menemään»?

»Teidän korkeutenne ei tarvitsekaan tehdä sellaista», sanoi


András kiihkeästi. »Jos tuo mylly on tullut maksamaan teille
neljännesmiljoonan, haluan maksaa siitä niin paljon kuin haluatte —
kolme- tahi neljäsataatuhatta floriiniakin».

»Vai sellaista se olikin», sanoi Bideskuty ivallisesti. »Näytät


luulevan minua tyhmemmäksi, ystäväni, kuin itseäsi. Haluat ostaa
myllyn, etkö haluakin, ja panna sen käyntiin omaksi hyödyksesi?
Suunnitelmasi ei ole huono eikä tuo kaunis juttusi levottomista
äideistä, raivostuneista talonpojista ja pustalla raivoavasta myrskystä
ollut ollenkaan huonosti keksitty. Mutta siitä saat olla varma,
ystäväni, ettei myllyä ole tehty myytäväksi».

»Teidän korkeutenne mielestä näyttää se olevan jonkunlaista


huvia, kun saa nauraa talonpojille», sanoi András kylmäverisesti,
»mutta teidän korkeutenne on väärässä. Haluan kyllä ostaa myllyn,
ja kun teidän korkeutenne on suostunut myymään sen minulle,
hajoitan sen».

»Hajoittaisitko sen»?

»Kyllä. Kaikki työmieheni, jotka nyt laiskoittelevat sallien viljan


varista maahan leikkaamatta sitä, tulisivat vain hyvin onnellisiksi, jos
he saisivat iskeä hakkunsa tuohon viilattuun rakennukseen.
Neljännesmiljoonani tulee hyvin käytetyksi, kun näen heidän
palaavan jälleen iloisesti työhönsä».
»Mutta, mies, onko sinulla sitten niin joutilaita rahoja?» huudahti
Bideskuty, unhottaen hetkeksi kieltonsa ihmetellessään rikkauksia,
joilla András tietämättään pöyhkeili.

»Isäni säästi koko ikänsä. Hän oli hyvin ahkera työmies ja kokosi
minulle suuren perinnön», sanoi András kehuvasti. »Ja kai teidän
korkeutenne sen tietää, että minulla on sitä riittävästi»?

»Miten sen tietäisin? Olen kyllä kuullut kaikenlaisia huhuja


elämästänne tuolla luhistuvassa vanhassa Kisfalussa».

»Äitini rakastaa sitä senvuoksi, että olen syntynyt siellä, ja minä


rakastan sitä senvuoksi, että hän viihtyy siellä. Luonani ei kyllä ole
satoja vieraita, mutta olen halukas luopumaan kaikista rahoistani,
että Heven maakunnan asukkaat jälleen hymyilisivät».

»Olet hävytön!» sanoi Bideskuty synkistyen. »Aiotko ruveta


saarnaamaan minulle»?

»Suokaa anteeksi, teidän korkeutenne, aikomukseni ei ole olla


julkea. Katsokaa, olen tuonut rahat mukanani. Niitä on kyllä
tarpeeksi», lisäsi hän taputtaen raskasta nahkavyötään. »Teidän
korkeutenne on vain niin hyvä ja sanoo hinnan, että saan iskeä
hakkuni tuon pitkän piipun nokkaan».

»Olet aivan hullu, hyvä mies! Olet sitäpaitsi aika konna


koettaessasi pettää minua vielä omien tarkoitustesi saavuttamiseksi.
Sanon sinulle, että jos joku haluaa ansaita rahaa tuolla myllyllä, niin
tuo joku olen minä. En halua myydä sitä, en vaikka peittäisit koko
tämän lattian juutalaisella kullallasi, jota sinun olisi parempi käyttää
muihin juutalaisiin suunnitelmiin, sillä tässä asiassa et kykene minua
pettämään».
»Teidän korkeutenne ei ymmärrä minua. Voi, Jumalani, ilmoita
minulle, miten minun on selitettävä hänelle! Talonpojat ovat
raivoissaan. He aiheuttavat joko itselleen tahi teille jonkun suuren
onnettomuuden. Teidän korkeutenne, ajatelkaa Jumalan nimessä
omaa äitiänne ja puolisoanne. Talonpojat luulevat pirun käyttävän
noita koneita, he ovat peloissaan nyt, mutta pian he raivostuvat ja
saavat aikaan jonkun suuren onnettomuuden».

»Jos siitä koituu joku onnettomuus, on se sinun itsesi aiheuttama,


hävytön mies»! sanoi Bideskuty raivoissaan ja nousi. »Olen saanut
tästä jo kynikseni. Käsken sinua poistumaan talostani. En myy
myllyäni! Riittääkö se»?

András kalpeni hirveästi. Hän oli myöskin noussut ja painanut


kyntensä kämmeniinsä hillitäkseen itsensä siten aiheuttamallaan
ruumiillisella tuskalla sanomasta vihaisia sanoja. Hän halusi puhua
ystäviensä ja toveriensa puolesta kärsivällisesti ja sovinnollisesti
murtaakseen tuon miehen itsepäisen vastustuksen.

»Kreivi, kuunnelkaa nyt minua Jumalan nimessä! Kaikki


miesraukat ovat kokoutuneet pelloille, ja naiset, joiden pojat, isät ja
veljet työskentelevät myllyssänne, pelkäävät onnettomuutta, jonka
he tietävät tulevan. Heidän itkunsa ja valituksensa murtavat
väkevänkin miehen sydämen. Jos nyt jotenkin — sellaistahan aina
sattuu — jollekin heistä tapahtuisi joku onnettomuus, voisitteko silloin
mitenkään rauhoittaa heitä? Raivoissaan suhtautuisivat he teihin
kuten murhaajaan. He rakastavat minua ja kuuntelevat puhettani, ja
vaikka olenkin rikas, olen pysynyt heidän vertaisenaan, mutta en
minäkään voisi sitten enää tukahduttaa heidän vihaansa teitä
kohtaan. Muistakaa, että teilläkin on vaimo ja lapsi, joille voi käydä
hyvinkin huonosti, sillä kukaan ei tiedä, milloin tietämättömien
ihmisten kosto on tyydytetty».

»Ja minä sanon sinulle, hävytön mies, että jos minulle tahi
omaisilleni tapahtuu jotakin, on sinun oma kätesi suunnannut iskun
ja valehteleva kielesi suunnitellut teon. Ymmärrän selvästi alhaisen
saidan talonpoikaisluonteesi, joka on valmis vaikka mihin omaksi
hyödykseen…»

»Keskeyttäkää, teidän korkeutenne», sanoi András hilliten vieläkin


luontonsa. »Tulin tänne kaikessa ystävyydessä keskustelemaan
kanssanne kärsivällisesti ja sovinnollisesti. Toverieni puolesta siedän
paljon, mutta teidän korkeutenne on unhottamaisillaan oman
arvonsa ja minun. Olen ollut kaikissa raha-asioissa hyvin antelias ja
kohtuullinen teitä kohtaan ja…»

»Niin, olet maksanut vuokrasi hyvin säännöllisesti. Karkoittaisin


sinut
Kisfalusta heti, ellet olisi sitä tehnyt.»

»Mutta eihän siinä vielä ole kaikki».

»Mitä tarkoitat tuolla kaikella? Sano se minulle»!

»Teidän korkeutenne näyttää olevan valmis unhottamaan, että


tuon saman hävyttömän talonpojan kukkaro on varjellut teitä
joutumasta juutalaisten nyljettäväksi viimeisten vuosien kuluessa».

»Sinunko kukkarosi? Oletko sitten yhteistoiminnassa tuon


verenimijän
Rosensteinin kanssa?»
»Kyllä kai teidän korkeutenne sen varmasti tietää, että rahat, jotka
tuhlaatte niistä sen enempää välittämättä, tulevat minulta, ja
paperit…»

»Hei mies, luuletko minun välittävän kaikista papereista? Kuinka


olisin voinutkaan arvata, että kerrankin miesmuistiin juutalaisen puhe
henkilöstä, joka luovuttaa hänelle rahat, sattuikin olemaan totta?
Mutta mitä sillä on tässä tekemistä? Vaatimasi hirmuiset korot eivät
oikeuta sinua ollenkaan sekautumaan asioihin, sillä olen maksanut
ne säännöllisesti, enkö olekin»?

Bideskuty oli suunniltaan raivosta. Hänen tavallisesti niin lempeät


kasvonsa olivat vääntyneet vihasta. András oli näöltään vielä tyyni,
vaikka hyvin kalpea, ja suonet hänen otsallaan olivat paisuneet
hirveästi. Hän koetti pysyä tyynenä keskustellessaan raivoisan
kreivin kanssa pakottamalla ajatuksensa pysymään noissa pelloille
kokoutuneissa ihmisraukoissa, jotka vieläkin tuijottivat tuohon heidän
rakastamansa tasangon taivaanrantaa pimittävään savupilveen.

»Teidän korkeutenne käsittää puheeni tahallaan väärin», sanoi


hän tyynesti, »sillä minun asiani ei ole sekautua teidän korkeutenne
asioihin enkä sitä haluakaan. Tulin tänne rehellisin tarkoituksin, sillä
viime kuukausien kuluessa olen huomannut tyytymättömyyden ja
pelon sitä mukaa enenevän talonpojissa, kuta useamman tiilen olette
liittänyt tuohon onnettomaan rakennukseen. Koska en ollenkaan
halua, että teidän korkeutenne menettää siihen uhraamansa rahat,
tulin rehellisesti ostamaan rakennuksen ja koneet, saadakseni
oikeuden hävittää ne. Jos teidän korkeutenne epäilee sanojani, olen
halukas jättämään rahat tänne, jos annatte minulle kunniasananne,
että rakennus hajoitetaan».
Ja András veti vyöstään suuren pussin, jonka sisus kilisi ja ritisi, ja
asetti sen pöydälle.

»Vaikene»! karjaisi Bideskuty menettäen nyt kokonaan


viimeisenkin malttinsa, sillä Andráksen hyökkäys hänen
lempiaatettaan vastaan suututti häntä hirveästi. »Haluat vain lainata
minulle enemmän noita kirottuja rahojasi rikastuaksesi yhä
enemmän kustannuksellani ja imeäksesi yhä enemmän verta
minusta. Olit mielestäni ennen vain alhaissäätyinen hävytön
talonpoika, jonkun vapautetun orjan poika tahi pojanpoika, jonka
vaimon oli pakko sukupolvi tahi pari taaksepäin maksaa omalla
ruumillaan tullia kartanonomistajalle, ennenkuin hänen miehensä voi
sanoa maata omakseen. Mutta nyt, Keményn András, olet
tunnustanut olevasi viemäriojista kotoisin olevien juutalaisten
kaltainen. Olen kuullut sinun polveutuvankin jostakin
juutalaisnaisesta syntyneestä äpärästä. Huomaan selvästi, millainen
olet. Tuossa, ota takaisin rahasi! En tarvitse niitä. Ne likastaisivat
palvelijani kädetkin, jos hän sattuisi koskemaan niihin».

Ja raivosta hehkuvin silmin, punastunein poskin ja vapisevin


huulin tarttui Bideskuty tuohon raskaaseen kultapussiin ja heitti sen
vihaisesti Keményn Andráksen kasvoihin.

Ylpeä talonpoika, joka oli kärsinyt Bideskuty’n loukkauksia


viimeiseen hetkeen asti sellaisin päätöksin, ettei hän anna myöten
tuumaakaan, ennenkuin hänen asiansa onnistuu, muuttui aivan
kalmankalpeaksi. Raskas pussi sattui hänen otsaansa jättäen siihen
ruman punaisen juovan, josta kihosi muutamia tippoja verta. Isku
mykistytti hänet hetkiseksi, mutta seuraavassa silmänräpäyksessä
hyökkäsi hän Bideskuty’a kohti kuin häkistään vapautunut leijona,
Kalmankalpein poskin ja tukahdutetusta raivosta leimuavin silmin.
Hän kohotti voimakkaan käsivartensa uhkaavasti korkealle ollen
valmis kurittamaan tuota ylpeätä kreiviä jokaisesta julkilausutusta
loukkauksesta, ja uhraamaan henkensä viimeisestä kuolettavasta
iskusta.

Bideskuty polveutui rodusta, joka huolimatta — ja ehkä juuri


senvuoksi — sivistyksen puutteesta, puolivilleydestään ja
rakkaudestaan suuriin maallisiin rikkauksiin ei ollut milloinkaan
pelännyt. Hän totesi nähdessään Andráksen kasvot menneensä liian
pitkälle, ja huomasi samalla, miten täydellisesti hän, joka oli jo
sivuuttanut elämänsä parhaat vuodet, oli tuon nuoren talonpojan
vallassa, jolle nuo monet loukkaukset olivat suoneet yli-inhimilliset
voimat. Hänen vihansa haihtui silmänräpäyksessä ja posket
kalpenivat, mutta hänen päähänsä ei juolahtanutkaan huutaa apua.
Siten seisoivat he hetkisen vastakkain, tuo jalo kreivi ja syvästi
loukkautunut talonpoika, jonka käsi oli kohoutunut ehkä kuolettavaan
lyöntiin. Mutta äkkiä tuntui ulkopuolelta kuuluva iloinen nauru
herpaisevan hänen käsivartensa. Pitäen sitä kumminkin yhä koholla
katsoi hän nyt huumautuneena ja lumottuna ovelle, joka työnnettiin
nopeasti auki, ja aivan valkoisiin puettu, jostakin sinisestä
pehmeästä kankaasta valmistetuin nauharuusuin koristettu tyttö tuli
näkyviin. Hänen päänsä ympärillä oli kuin kultaisista kiharoista
muodostunut sädekehä, jonka alta tuijotti pari pelästynyttä lemmikin
väristä silmää. Kuka hän oli? Häkistään karannut lintuko vaiko
tuollainen keijukainen, joista hänen äidillään oli ollut tapana kertoa
hänelle ennen ja kuvata hänelle, miten ne asuivat ruusujen ja
hyvältätuoksuvien orvokkien terälehtien välissä.

Mutta lintu lauloi ja keijukainen puhui tavallisia sanoja, jotka


kumminkin Andráksesta kuulostivat suloisimmalta soitolta, mitä
ihmiskorva milloinkaan on kuullut.
»Isä, saammeko ottaa vaunut ja mennä katsomaan noita
järveemme tuotuja uusia kaloja? — Mutta, isä rakas», lisäsi tuo
lumivalkoinen olento, »kuinka kalpea oletkaan! Oletko kipeä»?

Andráksen käsivarsi laskeutui turtuneena sivulle. Hänen


hurmaantuneet silmänsä seurasivat tuota keijukaismaista näkyä, kun
se meni hänen ohitseen kietoakseen käsivartensa hyvin lapsellisesta
mutta kumminkin suojelevasti hänen vihollisensa kaulaan.

Bideskuty oli jo melko vanha mies, ja viimeisten tuskallisten


hetkien jännitys oli uuvuttanut hänet niin, että hän vaipui tuoliinsa
hengästyneenä ja järkytettynä. Ilonka polvistui hänen viereensä ja
siveli hyvin hellästi hänen otsalle valunutta sotkuista tukkaansa.
András tuijotti häneen yhä. Hän ei voinut nähdä tytön kasvoja, sillä
tyttö oli selin häneen, mutta hän näki tytön pehmeän valkoisen
kaulan, joka tunkeutui esiin puvun laskoksista. Niskassa oli
muutamia kullanvärisiä kiharoita, jotka käänsivät hänen ajatuksensa
johonkin maalliseen paratiisiin. Ilonka ei katsahtanutkaan
toistamiseen talonpoikaan, joka, arveli tyttö epämääräisesti, oli ollut
väsyttävä ja suututtanut isän.

András siveli vaistomaisesti otsaansa, josta yhä tippui verta hänen


kalpeille poskilleen, kumartui sitten ja otti pussin lattialta kiinnittäen
sen jälleen vyöhönsä. Sitten hän kiinnitti katseensa jälleen tuohon
kultaiseen näkyyn ja painoi mieleensä jokaisen tuon miellyttävän
tyttömäisen vartalon piirteen niinkuin hän ei ikinä olisi aikonut luopua
haaveilemasta hänestä jälleen. Katse oli niin kiinteä, tulinen ja
magnetisoiva, että Ilonka tunsi sen jollakin tavoin, koska hän kääntyi
hieman ujostellen ja hänen tunteelliset lemmikkisilmänsä kohtasivat
Andráksen polttavan katseen.
Seuraavassa silmänräpäyksessä poistui András huoneesta ja
sitten koko rakennuksesta, kulki akasiakujanteen päähän ja
huudettuaan Csillagin luokseen hyppäsi hän sen selkään ja ajoi
laukkaa pustan poikki katsomatta taakseen.
XIII

KOSTO.

András ei halunnut ajatella eikä palauttaa muistiinsa hetkeksikään


noita viimeisiä kauhistuttavia tapahtumia, joista hän juuri oli
selviytynyt. Aurinko paistoi vielä kuumasti, vaikka se alkoikin jo
vaipua länteen, ja hänen otsassaan olevaa haavaa karvasteli silloin
tällöin kuin vasta poltettua häpeänmerkkiä tuomitun selässä. Hän
sivuutti valtatien ja pellot peläten kohtaavansa toverinsa, jotka
luultavasti odottivat levottomasti, voiko hän täyttää heille antamansa
lupauksen. Hän ei uskaltanut sanoa heille, kuinka hän oli pettynyt
toiveissaan ja kuinka hän oli aikonut vaatia hyvitystä eikä sitäkään,
miten sitten nuo lemmikin väriset silmät olivat karkottaneet hänet
taistelutantereelta ja pakottaneet hänet kääntämään selkänsä
viholliselle ennen taistelun voittamista.

Hän kiiruhti Csillagin juoksuun aution tasangon poikki, ja kun se


laukkasi tömisten eteenpäin, heräsivät naakat ja pienet sisiliskot
iltaunestaan. Kun András lähestyi Kisfalua, huusivat työmiehet
hänelle kaikilta kentiltä, mutta hän ei mennyt heitä puhuttelemaan
eikä hetkeksikään hiljentänyt Csillagin nopeata menoa, ennenkuin se
saapui oman tallinsa edustalle vaahdoten ja huohottaen.
András alkoi yhtä hellästi kuin muulloinkin hoitaa rakastamaansa
ratsua, kuivasi vaahdon sen vapisevista reisistä, silitti sen korvia ja
taputti sen kaulaa. Näytti siitä kuin Csillag olisi ymmärtänyt herransa
katkerat ajatukset, ja ajatellut, että ehkä jonkunlainen
myötämielisyyden osoitus lieventäisi hänen sydämensä kovia tuskia.
Se hieroi ystävällisesti sileää turpaansa isäntänsä käteen pyytäen
jotakin hellyydenosoitusta takaisin. Sen suuret silmät katsoivat niin
hellästi ja surullisesti Andrákseen, että hänen haavoitettu
sydämensä lopultakin löysi huojennuksen kiihkeästä itkusta. Kukaan
ei nähnyt häntä, eikä maakunnassa ollut olemassakaan ketään, joka
olisi voinut sanoa nähneensä tuon komean ja voimakkaan miehen
niin liikutettuna, että hän olisi ollut pois suunniltaan. Tämä heikkous
näytti lopettavan haavankin karvastelemisen. Nojaten päätään
tamman sileään kaulaan itki hän niinkuin hän ennen lapsena oli
itkenyt äidin polvea vasten, kun ankaran isän lyönnit olivat olleet
kovemmat kuin lapsi voi sietää. Kiihkeät nyyhkytykset tärisyttivät
hänen voimakasta ruumistaan, ja hän oli peittänyt toisella kädellään
tamman silmät, koska tämä olisi muutoin nähnyt tuon häpeänmerkin,
joka vielä kihelmöi kostamatta hänen otsassaan.

Kun hän neljännestunnin kuluttua meni sisälle suutelemaan


äitiään, ei hänen silmissään ollut enää kyynelten jälkiä eikä mitään
tuon mielenliikutuksen jättämää merkkiä, joka oli äsken vähältä
musertaa tämän intohimoisen unkarilaisen. Mutta Etelkan terävät
silmät huomasivat heti pojan kasvojen masentuneen ilmeen, ja hän
pudisti päätään surullisesti ymmärrettyään, ettei András ollut
onnistunut.

»Äiti», sanoi András ottaen kokoontaitetun paperin povitaskustaan


ja levittäen sen hänen eteensä pöydälle, »lopeta kehräämisesi
hetkiseksi ja kuuntele minua. Sinun on neuvottava minua».
Etelka totteli ja siirsi kehruuksensa syrjään. Sitten hän risti kätensä
valmistautuen kuuntelemaan. Nyt jo nopeasti laskeutuvan auringon
säteet tunkeutuivat pienistä ikkunoista muodostaen kirkkaan
valorenkaan tuon vanhan vaimon ympärille. Hän oli tottunut, että
András neuvotteli hänen kanssaan kaikista suunnittelemistaan
liikeasioista. Vaikka hän aina hyväksyikin ne, ei András kumminkaan
ollut tyytyväinen, ennenkuin hän oli ilmaissut myöntymyksensä.

»Muistat kai, äiti, nuo kolme velkakirjaa, jotka olen saanut kreiviltä
hänelle lainaamistani rahoista ja niille juoksevasta korosta»?

»Kyllä, poikaseni, muistan ne kaikki».

»Haluaisin lukea ne sinulle jälleen, äiti, ja pyydän sinua


punnitsemaan hyvin tarkasti mielessäsi, onko ehdoissa jotakin
kunniatonta».

»Tiedän, ettei niissä ole mitään sellaista, András, ja korko on


melko pieni, liian pieni, mielestäni».

»Ah, mutta äiti, tämä on hyvin merkityksellistä», sanoi András


innokkaasti. »Minusta tuntuu kuin tässä olisi kysymyksessä joko
elämä tahi kuolema. Sinun on kuunneltava jokaista sanaa niin
tarkasti kuin et niitä ikinä ennen olisi kuullutkaan».

»No lue sitten, András».

»Ensimmäinen näistä papereista on nyt viiden vuoden vanha ja


päivätty huhtikuussa 1855. Siinä on: 'Olen teille velkaa
kolmesataatuhatta floriinia, ja suoritan siitä, kunnes maksan velan
kokonaan takaisin, joka vuosi korkoa sata nautaa, joiden joukossa
pitää olla kymmenen sonnia ja yhdeksänkymmentä lehmää, ja
viisituhatta mitallista vehnää. Jos minä jonakin vuonna laiminlyön
tämän maksuni ettekä te voi saada sitä vaatiessannekaan minulta,
niin silloin Kisfalun kartano ja kaikki pellot, viinitarhat ja rakennukset
Nádasdyn pustasta Bélan kylään ja Tarnan rannasta vastakkaisella
puolella olevaan korkeaan tiehen asti muuttuvat peruuttamattomaksi
omaisuudeksenne, mutta silloin ette enää ole oikeutettu vaatimaan
minulta noita kolmeasataatuhatta floriinia! Alla on Bideskuty’n Gyurin
nimi, jonka Rosenstein on todistanut. Siinä on myös karttamerkki,
jonka hallitus vaatii ja jonka olen maksanut».

András lopetti ja katsoi levottomasti äitiinsä.

»Muistan», sanoi tämä, »että halusit lisätä karjaasi. Tuo kaikki on


aivan luonnollista, poikaseni, eikä siinä ole mitään kunniatonta.
Sitten sait jokaisesta Rosensteinille jälkeenpäin myymästäsi
lehmästä sataviisikymmentä tahi parisataa floriinia. Tuo ei ole
ainoastaan rehellistä, András, vaan myöskin hyvin jalomielistä».

»Toinen velkakirja on myös annettu kolmensadantuhannen floriinin


vastineeksi, ja kuuluu: 'Maksan teille viisituhatta mitallista vehnää,
kaksitoistatuhatta mitallista maissia ja sata lammasta, joista viisi
pässiä, ja ellen maksa tätä korkoa joka vuosi ja ellette sitä
vaatiessannekaan voi minulta saada, niin silloin kaikki peltoni,
viinitarhani, Bideskuty’n alusmaat ja kaikki muut rakennukset paitsi
päärakennusta, jossa asun, ja viereisiä talleja, muuttuvat
peruuttamattomaksi omaisuudeksenne. Tämä paperi on päivätty
kolme vuotta myöhemmin ja allekirjoitettu samoin kuin
ensimmäinenkin».

»Olet myöntänyt lainan niin lievin ehdoin kuin suinkin, András.


Juutalaiset olisivat vaatineet kymmenen kertaa enemmän, tiedät kai
sen».
»Kolmas velkakirja», lopetti András, »on allekirjoitettu pari päivää
sitten. Se on annettu kahdensadanviidenkymmenentuhannen
floriinin vastineeksi, ja kreivi on luvannut maksaa rahoista minulle
korkoa viisituhatta mitallista vehnää ja neljäkymmentä nautaa. Hän
on sitäpaitsi luovuttanut minulle Zárdan pantiksi samoin ehdoin kuin
nuo muutkin».

»Hän on tuhlaava ja varomaton mies», sanoi vanhus pudistaen


päätään. »Jos hän olisi lainannut kaikki nuo rahat juutalaisilta, olisi
hän nyt köyhtynyt mies».

»Oletko aivan varma, äiti», toisti András kiihkeästi, »etten ole


harjoittanut sellaista koronkiskomista, minkä vuoksi sinun olisi pakko
punastua poikasi vuoksi»?

»Kyllä, András, en usko sitä ollenkaan».

»Voitko vannoa sen äiti, suudellen ristiä»?

Hän otti valkoiselta seinältä karkeasti veistetyn puisen Vapahtajan


kuvan ja piti sitä vapisevin käsin äitinsä huulien edessä.

»Vannon Jeesuksen Kristuksen nimessä», sanoi tämä suudellen


kunnioittavasti mykkää puupalasta. András huokaisi syvään
helpotuksesta ja ripusti ristin takaisin seinälle. Sitten hän veti tuolin
aivan äitinsä viereen istuutuen sille.

Vanhus ei oikein käsittänyt poikansa tarkoitusta, mutta hän tunsi


kumminkin äidinsydämessään, että pojalla oli joitakin huolia. Hän ei
halunnut kysyäkään mitään, vaan koetti ainoastaan tyynnyttää
poikansa mieltä samoin kuin hän oli tehnyt silloinkin, kun András
pikku poikana oli tullut saamaan häneltä lohdutusta ankaran isän
kuritusten jälkeen. Hellästi pyyhki hän pois poikansa tukan otsalta.

»András», kysyi hän, »mistä olet saanut tuon merkin otsaasi»?

»Bideskuty’n kreivi löi minua, äiti» sanoi tämä kärsimättömästi,


»eikä sitä ole vielä kostettu».

»Löikö kreivi sinua, András»?

»Löi, ja minä olin sellainen raukka, etten lyönyt takaisin».

»Kerro minulle, András. Olen levoton enkä ymmärrä».

Ja András kertoi hänelle alusta loppuun saakka tuloksettoman


keskustelunsa kreivin kanssa. Hän jutteli äidilleen, miten hän ensin
oli selittänyt ja sitten rukoillut tuota miestä, että hän samalla kun hän
huvitteli satojen vieraiden kanssa säälisi myöskin heikkoja,
tietämättömiä ja onnettomia. Hän kertoi jalon kreivin ylpeydestä,
hänen loukkaavasta puheestaan ja lyönnistä. Tuntui niin
huojentavalta kertoa äidille kaikki. Äidin sydän, vaikka se olikin
tietämätön ja sivistymätön, ymmärsi ja oli myötätuntoinen
kumminkin, ja tiesi miten poika oli lepytettävä ja saatava
unhottamaan. Hän kertoi äidilleen kaiken, miten tytön käsivarsi oli
kiertynyt suojelevasti isän kaulaan ja herpaissut hänen käsivartensa,
joka oli kohonnut antamaan lyönnin lyönnistä. Mutta sitä hän ei
kertonut tälle hellälle lohduttajalle, tälle rakastetulle ja lempeälle
äidille, että tuosta hetkestä alkaen oli hän aina näkevinään silmiensä
edessä tuon kauniin kultakiharaisen tytön pilkkaamassa häntä
hymyilevin lemmikkisilmin. Ei hän puhunut siitäkään, että hän oli
koettanut ratsastaa pustan poikki niin nopeasti kuin suinkin
päästäkseen tuosta näystä, joka kumminkin oli seurannut häntä
tänne vaatimattomaan maalaistaloon, joka äkkiä oli Andráksesta
ruvennut näyttämään niin köyhältä, mitättömältä ja arvottomalta tuon
ylimyksellisen tytön harhakuvallekin. Eikä hän ilmaissut ajatustaan,
että hänen talonpoikaisvaatteensa olivat äkkiä ruvenneet
näyttämään hänestä niin karkeilta ja likaisilta, hänen kätensä kovilta
ja ruskeilta ja hänen saappaansa raskailta, eikä hän puhunut
ikävästään, että hän olisi tahtonut puristaa tuon hurmaavan näyn
syliinsä, mutta kun hän oli huomannut kuinka sivistymätön hän oli ja
heidän välillään olevan äärettömän säätyerotuksen olivat hänen
käsivartensa vaipuneet voimattomina alas ja suuret häpeän ja
kateuden kyyneleet olivat valuneet hänen poskilleen.

Vaikka äiti aavistikin epäselvästi, että joku muukin kuin


loukkaukset ja lyönti painoi raskaasti hänen poikansa mieltä, oli
hänen sydämessään kumminkin niin runsaasti rakkautta, että hän
voi saada hänet unhottamaan kaiken muun, paitsi kodin onnen ja
ilon istua äidin jalkojen juuressa. Aurinko oli jo laskeutunut kokonaan
länteen ja huoneen nurkat alkoivat verhoutua synkkään pimeyteen.
Sári ja Kati sytyttivät kynttilät ja toivat illallisen pöydälle. Mutta se
syötiin vaitiollen, sillä äitiä ja poikaa painosti tulevan onnettomuuden
aavistus.

Illallisen jäännökset vietiin pois samoin kuin kynttilätkin, sillä


András halusi istua pimeässä äitinsä vieressä ja pitää tämän hellää
kättä polttavalla otsallaan karkoittaakseen sieltä nuo vihan ja koston
paholaiset, jotka kurjistelivat hänen aivoissaan. Hän halusi olla
rauhassa ja pimeässä senkin vuoksi, että hän halusi muistella tuota
suloista näkyä, jonka selvä proosallinen valo ja hänen yleistajujansa
käskivät karkoittamaan, mutta joka pimeydessä muuttui unen
kaltaiseksi, josta herääminen ei ehkä tuntunutkaan niin katkeralta.
Kuinka kauan äiti ja poika istuivat pimeässä, eivät he tienneet, sillä
iltatunteja ei lasketa tässä maassa, jossa kellot ovat niin harvinaiset.

Etelka, jonka ajatuksia eivät muuttuvat harhakuvat häirinneet, oli


sulkenut silmänsä ja hänen rauhallinen hengityksensä säesti
tyynnyttävästi Andráksen valppaita unelmia. Äkkiä näytti siltä kuin
ikkunasta olisi tunkeutunut omituista valoa huoneeseen aution
tasangon takaa näkyvältä taivaanrannalta. András hyppäsi
seisoalleen ja katsoi ulos ymmärtämättä ollenkaan alussa tuota
synkkää valoa, joka vähitellen valaisi koko taivaanrannan. Kova
ulko-ovelta kuuluva koputus herätti myöskin Etelkan, ja molemmat
pienet tytöt juoksivat sisään näyttäen hyvin säikähtyneiltä. Jokaisen
mieli, yksinkertaisemmankin, oli ollut jännityksessä koko päivän, ja
kun Sári ja Kati olivat ensimmäiseksi huomanneet tuon omituisen
valon, joka ei ollut auringon eikä kuun aiheuttamaa, riensivät he
peloissaan isäntänsä luo kysymään sen syytä ja saamaan
lohdutusta.

Mutta András oli kalvennut hirveästi ja kun Etelkakin katsoi ulos


peloissaan, kalpenivat hänenkin poskensa kauhusta.

»Tulipalo»! kuiskasi hän hiljaa.

»Niin, tulipalo se on, äiti, ja luullakseni raivoaa se Bideskuty’n


tilalla. Maissipellot ovat juuri tuolla suunnalla», sanoi András, »ja
koska ei ole satanut pariin viikkoon, palavat ne yhtä hyvin kuin kuiva
heinä».

»Mutta tulihan näkyy parista, kolmesta paikasta yhtäaikaa»!


huudahti
Sári.
»Jumala rankaisee niin kreiviä», sanoi Etelka taikauskoisesti
tehden ristinmerkin.

»Äiti, lähden sinne katsomaan, voinko olla joksikin avuksi. Sári ja


Kati saavat mennä sanomaan kaikille miehille, että he kiiruhtaisivat
sinne niin nopeasti kuin suinkin. Tässä on tallin avaimet. Heidän on
valittava nopeimmat hevoset ja lähdettävä heti. Ja sinun, äiti rakas»,
lisäsi hän vakavasti, »on polvistuttava ristin eteen ja rukoiltava
Jumalaa, että hän kostaisi tulipalon sytyttäjille».

Ja suudeltuaan nopeasti äitiään kiiruhti András vielä kerran talliin,


satuloi tammansa ja ratsasti nopeasti Bideskuty’yn päin.

Kaukaa näkyvä tummanpunainen tuli näytti jo levinneen koko


taivaanrannalle. Yön rikkomattomassa hiljaisuudessa voitiin kuulla
aution tasangon poikki kantautuvia omituisia säikähtyneitä ääniä —
pelästyneen karjan ammumista, säikähtyneitten lampaitten
määkyntää ja paimenien huutoja, kun he koettivat ajaa laumojaan
turvaan synkälle ja kuivalle tasangolle.

Punainen tuli levisi yhä nopeammin, ja Andráksen ratsastaessa


syöksyi laumoittain villejä hevosia hänen ohitseen peloissaan,
liehuvin harjoin ja hurjasti hulmuavin hännin.

Hän voi jo erottaa liekit, jotka levisivät hirveän nopeasti peltojen


poikki, joilla olevien maissiaumojen hän tiesi auttamattomasti
joutuvan raivoavien liekkien saaliiksi. Tasangolta, joka tavallisesti
öisin on hyvin rauhallinen ja hiljainen levätessään siinä sinisen
taivaan alla tuikkivien tähtien valossa, kuului nyt pelästyneitä ääniä,
jotka tuntuivat kohoavan joka suunnalta. Heikko kesätuuli kiihdytti
liekkejä ja levitti niitä itään päin maissipeltoja, puumajoja ja talleja
kohti. András ratsasti eteenpäin synkän aavistuksen ahdistaessa
hänen sydäntään ja katsoi tuohon tuleen, jonka Jumala hänen
äitinsä sanojen mukaan oli sytyttänyt rangaistakseen tuota ylpeätä
kreiviä.

You might also like