Introduction to Programming Using Java Version 6.0, June 2011 (Version 6.0.3, with minor corrections, January 2014) David J. Eck Hobart and William Smith Colleges This is a PDF version of an on-line book that is available at http://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. In addition, each section has a link to the on-line version. The PDF also has internal links, shown in red. These links can be used in Acrobat Reader and some other PDF reader programs. ii c © 1996–2014, David J. Eck David J. Eck (eck@hws.edu) 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 3.0 License. To view a copy of this license, visit http://creativecommons.org/licenses/by-nc-sa/3.0/. Other uses require permission from the author. The web site for this book is: http://math.hws.edu/javanotes Contents Preface x 1 The Mental Landscape 1 1.1 Machine Language . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1 1.2 Asynchronous Events . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3 1.3 The Java Virtual Machine . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6 1.4 Building Blocks of Programs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8 1.5 Object-oriented Programming . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10 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 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22 2.2.1 Variables . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23 2.2.2 Types and Literals . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24 2.2.3 Variables in Programs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27 2.3 Objects and Subroutines . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28 2.3.1 Built-in Subroutines and Functions . . . . . . . . . . . . . . . . . . . . . . 29 2.3.2 Operations on Strings . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33 2.3.3 Introduction to Enums . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 35 2.4 Text Input and Output . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 36 2.4.1 A First Text Input Example . . . . . . . . . . . . . . . . . . . . . . . . . . 37 2.4.2 Text Output . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 38 2.4.3 TextIO Input Functions . . . . . . . . . . . . . . . . . . . . . . . . . . . . 39 2.4.4 Formatted Output . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 42 2.4.5 Introduction to File I/O . . . . . . . . . . . . . . . . . . . . . . . . . . . . 43 2.4.6 Using Scanner for Input . . . . . . . . . . . . . . . . . . . . . . . . . . . . 45 2.5 Details of Expressions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 46 2.5.1 Arithmetic Operators . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 47 2.5.2 Increment and Decrement . . . . . . . . . . . . . . . . . . . . . . . . . . . 47 2.5.3 Relational Operators . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 48 2.5.4 Boolean Operators . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 49 2.5.5 Conditional Operator . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 50 2.5.6 Assignment Operators and Type-Casts . . . . . . . . . . . . . . . . . . . . 50 2.5.7 Type Conversion of Strings . . . . . . . . . . . . . . . . . . . . . . . . . . 51 2.5.8 Precedence Rules . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 52 i CONTENTS ii 2.6 Programming Environments . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 52 2.6.1 Java Development Kit . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 53 2.6.2 Command Line Environment . . . . . . . . . . . . . . . . . . . . . . . . . 53 2.6.3 IDEs and Eclipse . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 56 2.6.4 The Problem of Packages . . . . . . . . . . . . . . . . . . . . . . . . . . . 58 Exercises for Chapter 2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 60 Quiz on Chapter 2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 62 3 Control 63 3.1 Blocks, Loops, and Branches . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 63 3.1.1 Blocks . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 63 3.1.2 The Basic While Loop . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 64 3.1.3 The Basic If Statement . . . . . . . . . . . . . . . . . . . . . . . . . . . . 66 3.2 Algorithm Development . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 68 3.2.1 Pseudocode and Stepwise Refinement . . . . . . . . . . . . . . . . . . . . 68 3.2.2 The 3N+1 Problem . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 71 3.2.3 Coding, Testing, Debugging . . . . . . . . . . . . . . . . . . . . . . . . . . 74 3.3 while and do..while . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 76 3.3.1 The while Statement . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 76 3.3.2 The do..while Statement . . . . . . . . . . . . . . . . . . . . . . . . . . . . 78 3.3.3 break and continue . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 80 3.4 The for Statement . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 82 3.4.1 For Loops . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 82 3.4.2 Example: Counting Divisors . . . . . . . . . . . . . . . . . . . . . . . . . . 85 3.4.3 Nested for Loops . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 87 3.4.4 Enums and for-each Loops . . . . . . . . . . . . . . . . . . . . . . . . . . . 90 3.5 The if Statement . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 91 3.5.1 The Dangling else Problem . . . . . . . . . . . . . . . . . . . . . . . . . . 91 3.5.2 The if...else if Construction . . . . . . . . . . . . . . . . . . . . . . . . . . 92 3.5.3 If Statement Examples . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 93 3.5.4 The Empty Statement . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 97 3.6 The switch Statement . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 98 3.6.1 The Basic switch Statement . . . . . . . . . . . . . . . . . . . . . . . . . . 98 3.6.2 Menus and switch Statements . . . . . . . . . . . . . . . . . . . . . . . . . 100 3.6.3 Enums in switch Statements . . . . . . . . . . . . . . . . . . . . . . . . . 101 3.6.4 Definite Assignment . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 102 3.7 Exceptions and try..catch . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 103 3.7.1 Exceptions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 103 3.7.2 try..catch . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 104 3.7.3 Exceptions in TextIO . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 106 3.8 GUI Programming . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 107 Exercises for Chapter 3 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 114 Quiz on Chapter 3 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 117 CONTENTS iii 4 Subroutines 119 4.1 Black Boxes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 119 4.2 Static Subroutines and Variables . . . . . . . . . . . . . . . . . . . . . . . . . . . 121 4.2.1 Subroutine Definitions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 121 4.2.2 Calling Subroutines . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 123 4.2.3 Subroutines in Programs . . . . . . . . . . . . . . . . . . . . . . . . . . . . 124 4.2.4 Member Variables . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 127 4.3 Parameters . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 129 4.3.1 Using Parameters . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 129 4.3.2 Formal and Actual Parameters . . . . . . . . . . . . . . . . . . . . . . . . 130 4.3.3 Overloading . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 132 4.3.4 Subroutine Examples . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 133 4.3.5 Throwing Exceptions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 135 4.3.6 Global and Local Variables . . . . . . . . . . . . . . . . . . . . . . . . . . 135 4.4 Return Values . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 136 4.4.1 The return statement . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 136 4.4.2 Function Examples . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 137 4.4.3 3N+1 Revisited . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 140 4.5 APIs, Packages, and Javadoc . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 142 4.5.1 Toolboxes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 142 4.5.2 Java’s Standard Packages . . . . . . . . . . . . . . . . . . . . . . . . . . . 143 4.5.3 Using Classes from Packages . . . . . . . . . . . . . . . . . . . . . . . . . 144 4.5.4 Javadoc . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 146 4.6 More on Program Design . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 148 4.6.1 Preconditions and Postconditions . . . . . . . . . . . . . . . . . . . . . . . 149 4.6.2 A Design Example . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 149 4.6.3 The Program . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 154 4.7 The Truth About Declarations . . . . . . . . . . . . . . . . . . . . . . . . . . . . 156 4.7.1 Initialization in Declarations . . . . . . . . . . . . . . . . . . . . . . . . . 156 4.7.2 Named Constants . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 157 4.7.3 Naming and Scope Rules . . . . . . . . . . . . . . . . . . . . . . . . . . . 160 Exercises for Chapter 4 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 163 Quiz on Chapter 4 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 167 5 Objects and Classes 168 5.1 Objects and Instance Methods . . . . . . . . . . . . . . . . . . . . . . . . . . . . 168 5.1.1 Objects, Classes, and Instances . . . . . . . . . . . . . . . . . . . . . . . . 169 5.1.2 Fundamentals of Objects . . . . . . . . . . . . . . . . . . . . . . . . . . . 170 5.1.3 Getters and Setters . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 175 5.2 Constructors and Object Initialization . . . . . . . . . . . . . . . . . . . . . . . . 176 5.2.1 Initializing Instance Variables . . . . . . . . . . . . . . . . . . . . . . . . . 176 5.2.2 Constructors . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 177 5.2.3 Garbage Collection . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 182 5.3 Programming with Objects . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 183 5.3.1 Some Built-in Classes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 183 5.3.2 Wrapper Classes and Autoboxing . . . . . . . . . . . . . . . . . . . . . . . 184 5.3.3 The class “Object” . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 186 CONTENTS iv 5.3.4 Object-oriented Analysis and Design . . . . . . . . . . . . . . . . . . . . . 187 5.4 Programming Example: Card, Hand, Deck . . . . . . . . . . . . . . . . . . . . . . 188 5.4.1 Designing the classes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 188 5.4.2 The Card Class . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 191 5.4.3 Example: A Simple Card Game . . . . . . . . . . . . . . . . . . . . . . . . 195 5.5 Inheritance and Polymorphism . . . . . . . . . . . . . . . . . . . . . . . . . . . . 198 5.5.1 Extending Existing Classes . . . . . . . . . . . . . . . . . . . . . . . . . . 198 5.5.2 Inheritance and Class Hierarchy . . . . . . . . . . . . . . . . . . . . . . . 200 5.5.3 Example: Vehicles . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 201 5.5.4 Polymorphism . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 203 5.5.5 Abstract Classes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 206 5.6 this and super . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 209 5.6.1 The Special Variable this . . . . . . . . . . . . . . . . . . . . . . . . . . . 209 5.6.2 The Special Variable super . . . . . . . . . . . . . . . . . . . . . . . . . . 211 5.6.3 Constructors in Subclasses . . . . . . . . . . . . . . . . . . . . . . . . . . 213 5.7 Interfaces, Nested Classes, and Other Details . . . . . . . . . . . . . . . . . . . . 214 5.7.1 Interfaces . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 214 5.7.2 Nested Classes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 216 5.7.3 Anonymous Inner Classes . . . . . . . . . . . . . . . . . . . . . . . . . . . 218 5.7.4 Mixing Static and Non-static . . . . . . . . . . . . . . . . . . . . . . . . . 219 5.7.5 Static Import . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 221 5.7.6 Enums as Classes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 221 Exercises for Chapter 5 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 224 Quiz on Chapter 5 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 227 6 Introduction to GUI Programming 229 6.1 The Basic GUI Application . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 229 6.1.1 JFrame and JPanel . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 231 6.1.2 Components and Layout . . . . . . . . . . . . . . . . . . . . . . . . . . . . 233 6.1.3 Events and Listeners . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 234 6.2 Applets and HTML . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 235 6.2.1 JApplet . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 235 6.2.2 Reusing Your JPanels . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 237 6.2.3 Basic HTML . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 239 6.2.4 Applets on Web Pages . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 242 6.3 Graphics and Painting . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 244 6.3.1 Coordinates . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 246 6.3.2 Colors . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 247 6.3.3 Fonts . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 248 6.3.4 Shapes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 249 6.3.5 Graphics2D . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 251 6.3.6 An Example . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 251 6.4 Mouse Events . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 255 6.4.1 Event Handling . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 256 6.4.2 MouseEvent and MouseListener . . . . . . . . . . . . . . . . . . . . . . . . 257 6.4.3 Mouse Coordinates . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 260 6.4.4 MouseMotionListeners and Dragging . . . . . . . . . . . . . . . . . . . . . 262 CONTENTS v 6.4.5 Anonymous Event Handlers . . . . . . . . . . . . . . . . . . . . . . . . . . 266 6.5 Timers, KeyEvents, and State Machines . . . . . . . . . . . . . . . . . . . . . . . 268 6.5.1 Timers and Animation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 268 6.5.2 Keyboard Events . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 270 6.5.3 Focus Events . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 274 6.5.4 State Machines . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 275 6.6 Basic Components . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 278 6.6.1 JButton . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 279 6.6.2 JLabel . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 280 6.6.3 JCheckBox . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 281 6.6.4 JTextField and JTextArea . . . . . . . . . . . . . . . . . . . . . . . . . . . 282 6.6.5 JComboBox . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 284 6.6.6 JSlider . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 284 6.7 Basic Layout . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 286 6.7.1 Basic Layout Managers . . . . . . . . . . . . . . . . . . . . . . . . . . . . 287 6.7.2 Borders . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 290 6.7.3 SliderAndComboBoxDemo . . . . . . . . . . . . . . . . . . . . . . . . . . 291 6.7.4 A Simple Calculator . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 293 6.7.5 Using a null Layout . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 295 6.7.6 A Little Card Game . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 297 6.8 Menus and Dialogs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 300 6.8.1 Menus and Menubars . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 302 6.8.2 Dialogs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 304 6.8.3 Fine Points of Frames . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 306 6.8.4 Creating Jar Files . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 308 Exercises for Chapter 6 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 310 Quiz on Chapter 6 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 315 7 Arrays 317 7.1 Creating and Using Arrays . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 317 7.1.1 Arrays . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 318 7.1.2 Using Arrays . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 318 7.1.3 Array Initialization . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 320 7.2 Programming With Arrays . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 322 7.2.1 Arrays and for Loops . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 322 7.2.2 Arrays and for-each Loops . . . . . . . . . . . . . . . . . . . . . . . . . . . 324 7.2.3 Array Types in Subroutines . . . . . . . . . . . . . . . . . . . . . . . . . . 325 7.2.4 Random Access . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 327 7.2.5 Arrays of Objects . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 328 7.2.6 Variable Arity Methods . . . . . . . . . . . . . . . . . . . . . . . . . . . . 332 7.3 Dynamic Arrays and ArrayLists . . . . . . . . . . . . . . . . . . . . . . . . . . . . 333 7.3.1 Partially Full Arrays . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 333 7.3.2 Dynamic Arrays . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 336 7.3.3 ArrrayLists . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 339 7.3.4 Parameterized Types . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 343 7.3.5 Vectors . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 346 7.4 Searching and Sorting . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 347 CONTENTS vi 7.4.1 Searching . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 348 7.4.2 Association Lists . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 350 7.4.3 Insertion Sort . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 352 7.4.4 Selection Sort . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 354 7.4.5 Unsorting . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 356 7.5 Multi-dimensional Arrays . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 356 7.5.1 Creating Two-dimensional Arrays . . . . . . . . . . . . . . . . . . . . . . 357 7.5.2 Using Two-dimensional Arrays . . . . . . . . . . . . . . . . . . . . . . . . 358 7.5.3 Example: Checkers . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 361 Exercises for Chapter 7 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 368 Quiz on Chapter 7 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 374 8 Correctness, Robustness, Efficiency 376 8.1 Introduction to Correctness and Robustness . . . . . . . . . . . . . . . . . . . . . 376 8.1.1 Horror Stories . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 377 8.1.2 Java to the Rescue . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 378 8.1.3 Problems Remain in Java . . . . . . . . . . . . . . . . . . . . . . . . . . . 380 8.2 Writing Correct Programs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 381 8.2.1 Provably Correct Programs . . . . . . . . . . . . . . . . . . . . . . . . . . 381 8.2.2 Robust Handling of Input . . . . . . . . . . . . . . . . . . . . . . . . . . . 384 8.3 Exceptions and try..catch . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 388 8.3.1 Exceptions and Exception Classes . . . . . . . . . . . . . . . . . . . . . . 389 8.3.2 The try Statement . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 391 8.3.3 Throwing Exceptions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 394 8.3.4 Mandatory Exception Handling . . . . . . . . . . . . . . . . . . . . . . . . 395 8.3.5 Programming with Exceptions . . . . . . . . . . . . . . . . . . . . . . . . 396 8.4 Assertions and Annotations . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 400 8.4.1 Assertions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 400 8.4.2 Annotations . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 403 8.5 Analysis of Algorithms . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 405 Exercises for Chapter 8 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 411 Quiz on Chapter 8 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 415 9 Linked Data Structures and Recursion 416 9.1 Recursion . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 416 9.1.1 Recursive Binary Search . . . . . . . . . . . . . . . . . . . . . . . . . . . . 417 9.1.2 Towers of Hanoi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 419 9.1.3 A Recursive Sorting Algorithm . . . . . . . . . . . . . . . . . . . . . . . . 422 9.1.4 Blob Counting . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 424 9.2 Linked Data Structures . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 428 9.2.1 Recursive Linking . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 428 9.2.2 Linked Lists . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 430 9.2.3 Basic Linked List Processing . . . . . . . . . . . . . . . . . . . . . . . . . 430 9.2.4 Inserting into a Linked List . . . . . . . . . . . . . . . . . . . . . . . . . . 434 9.2.5 Deleting from a Linked List . . . . . . . . . . . . . . . . . . . . . . . . . . 436 9.3 Stacks, Queues, and ADTs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 437 9.3.1 Stacks . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 437 9.3.2 Queues . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 441 CONTENTS vii 9.3.3 Postfix Expressions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 445 9.4 Binary Trees . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 448 9.4.1 Tree Traversal . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 449 9.4.2 Binary Sort Trees . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 451 9.4.3 Expression Trees . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 456 9.5 A Simple Recursive Descent Parser . . . . . . . . . . . . . . . . . . . . . . . . . . 459 9.5.1 Backus-Naur Form . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 459 9.5.2 Recursive Descent Parsing . . . . . . . . . . . . . . . . . . . . . . . . . . . 461 9.5.3 Building an Expression Tree . . . . . . . . . . . . . . . . . . . . . . . . . . 465 Exercises for Chapter 9 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 468 Quiz on Chapter 9 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 471 10 Generic Programming and Collection Classes 473 10.1 Generic Programming . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 473 10.1.1 Generic Programming in Smalltalk . . . . . . . . . . . . . . . . . . . . . . 474 10.1.2 Generic Programming in C++ . . . . . . . . . . . . . . . . . . . . . . . . 475 10.1.3 Generic Programming in Java . . . . . . . . . . . . . . . . . . . . . . . . . 476 10.1.4 The Java Collection Framework . . . . . . . . . . . . . . . . . . . . . . . . 477 10.1.5 Iterators and for-each Loops . . . . . . . . . . . . . . . . . . . . . . . . . . 479 10.1.6 Equality and Comparison . . . . . . . . . . . . . . . . . . . . . . . . . . . 480 10.1.7 Generics and Wrapper Classes . . . . . . . . . . . . . . . . . . . . . . . . 483 10.2 Lists and Sets . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 484 10.2.1 ArrayList and LinkedList . . . . . . . . . . . . . . . . . . . . . . . . . . . 484 10.2.2 Sorting . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 487 10.2.3 TreeSet and HashSet . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 488 10.2.4 EnumSet . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 491 10.3 Maps . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 492 10.3.1 The Map Interface . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 493 10.3.2 Views, SubSets, and SubMaps . . . . . . . . . . . . . . . . . . . . . . . . 494 10.3.3 Hash Tables and Hash Codes . . . . . . . . . . . . . . . . . . . . . . . . . 497 10.4 Programming with the Java Collection Framework . . . . . . . . . . . . . . . . . 499 10.4.1 Symbol Tables . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 499 10.4.2 Sets Inside a Map . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 501 10.4.3 Using a Comparator . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 504 10.4.4 Word Counting . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 505 10.5 Writing Generic Classes and Methods . . . . . . . . . . . . . . . . . . . . . . . . 508 10.5.1 Simple Generic Classes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 508 10.5.2 Simple Generic Methods . . . . . . . . . . . . . . . . . . . . . . . . . . . . 510 10.5.3 Type Wildcards . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 512 10.5.4 Bounded Types . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 515 Exercises for Chapter 10 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 519 Quiz on Chapter 10 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 523 11 Streams, Files, and Networking 524 11.1 Streams, Readers, and Writers . . . . . . . . . . . . . . . . . . . . . . . . . . . . 524 11.1.1 Character and Byte Streams . . . . . . . . . . . . . . . . . . . . . . . . . 525 11.1.2 PrintWriter . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 526 11.1.3 Data Streams . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 527 CONTENTS viii 11.1.4 Reading Text . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 529 11.1.5 The Scanner Class . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 531 11.1.6 Serialized Object I/O . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 532 11.2 Files . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 533 11.2.1 Reading and Writing Files . . . . . . . . . . . . . . . . . . . . . . . . . . . 534 11.2.2 Files and Directories . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 537 11.2.3 File Dialog Boxes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 540 11.3 Programming With Files . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 542 11.3.1 Copying a File . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 543 11.3.2 Persistent Data . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 546 11.3.3 Files in GUI Programs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 547 11.3.4 Storing Objects in Files . . . . . . . . . . . . . . . . . . . . . . . . . . . . 549 11.4 Networking . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 556 11.4.1 URLs and URLConnections . . . . . . . . . . . . . . . . . . . . . . . . . . 557 11.4.2 TCP/IP and Client/Server . . . . . . . . . . . . . . . . . . . . . . . . . . 559 11.4.3 Sockets in Java . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 560 11.4.4 A Trivial Client/Server . . . . . . . . . . . . . . . . . . . . . . . . . . . . 562 11.4.5 A Simple Network Chat . . . . . . . . . . . . . . . . . . . . . . . . . . . . 566 11.5 A Brief Introduction to XML . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 570 11.5.1 Basic XML Syntax . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 570 11.5.2 XMLEncoder and XMLDecoder . . . . . . . . . . . . . . . . . . . . . . . 572 11.5.3 Working With the DOM . . . . . . . . . . . . . . . . . . . . . . . . . . . . 574 Exercises for Chapter 11 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 580 Quiz on Chapter 11 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 583 12 Threads and Multiprocessing 584 12.1 Introduction to Threads . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 584 12.1.1 Creating and Running Threads . . . . . . . . . . . . . . . . . . . . . . . . 585 12.1.2 Operations on Threads . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 590 12.1.3 Mutual Exclusion with “synchronized” . . . . . . . . . . . . . . . . . . . . 592 12.1.4 Volatile Variables . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 596 12.2 Programming with Threads . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 597 12.2.1 Threads Versus Timers . . . . . . . . . . . . . . . . . . . . . . . . . . . . 597 12.2.2 Recursion in a Thread . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 599 12.2.3 Threads for Background Computation . . . . . . . . . . . . . . . . . . . . 601 12.2.4 Threads for Multiprocessing . . . . . . . . . . . . . . . . . . . . . . . . . . 603 12.3 Threads and Parallel Processing . . . . . . . . . . . . . . . . . . . . . . . . . . . 605 12.3.1 Problem Decomposition . . . . . . . . . . . . . . . . . . . . . . . . . . . . 605 12.3.2 Thread Pools and Task Queues . . . . . . . . . . . . . . . . . . . . . . . . 606 12.3.3 Producer/Consumer and Blocking Queues . . . . . . . . . . . . . . . . . . 609 12.3.4 Wait and Notify . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 613 12.4 Threads and Networking . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 618 12.4.1 The Blocking I/O Problem . . . . . . . . . . . . . . . . . . . . . . . . . . 619 12.4.2 An Asynchronous Network Chat Program . . . . . . . . . . . . . . . . . . 620 12.4.3 A Threaded Network Server . . . . . . . . . . . . . . . . . . . . . . . . . . 624 12.4.4 Using a Thread Pool . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 625 12.4.5 Distributed Computing . . . . . . . . . . . . . . . . . . . . . . . . . . . . 627 CONTENTS ix 12.5 Network Programming Example . . . . . . . . . . . . . . . . . . . . . . . . . . . 634 12.5.1 The Netgame Framework . . . . . . . . . . . . . . . . . . . . . . . . . . . 634 12.5.2 A Simple Chat Room . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 638 12.5.3 A Networked TicTacToe Game . . . . . . . . . . . . . . . . . . . . . . . . 640 12.5.4 A Networked Poker Game . . . . . . . . . . . . . . . . . . . . . . . . . . . 643 Exercises for Chapter 12 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 645 Quiz on Chapter 12 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 649 13 Advanced GUI Programming 650 13.1 Images and Resources . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 650 13.1.1 Images and BufferedImages . . . . . . . . . . . . . . . . . . . . . . . . . . 650 13.1.2 Working With Pixels . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 656 13.1.3 Resources . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 659 13.1.4 Cursors and Icons . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 660 13.1.5 Image File I/O . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 662 13.2 Fancier Graphics . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 663 13.2.1 Measuring Text . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 664 13.2.2 Transparency . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 666 13.2.3 Antialiasing . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 668 13.2.4 Strokes and Paints . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 669 13.2.5 Transforms . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 672 13.3 Actions and Buttons . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 675 13.3.1 Action and AbstractAction . . . . . . . . . . . . . . . . . . . . . . . . . . 675 13.3.2 Icons on Buttons . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 677 13.3.3 Radio Buttons . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 678 13.3.4 Toolbars . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 682 13.3.5 Keyboard Accelerators . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 683 13.3.6 HTML on Buttons . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 684 13.4 Complex Components and MVC . . . . . . . . . . . . . . . . . . . . . . . . . . . 685 13.4.1 Model-View-Controller . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 686 13.4.2 Lists and ListModels . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 686 13.4.3 Tables and TableModels . . . . . . . . . . . . . . . . . . . . . . . . . . . . 689 13.4.4 Documents and Editors . . . . . . . . . . . . . . . . . . . . . . . . . . . . 694 13.4.5 Custom Components . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 695 13.5 Finishing Touches . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 699 13.5.1 The Mandelbrot Set . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 700 13.5.2 Design of the Program . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 702 13.5.3 Internationalization . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 704 13.5.4 Events, Events, Events . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 706 13.5.5 Custom Dialogs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 708 13.5.6 Preferences . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 709 Exercises for Chapter 13 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 711 Quiz on Chapter 13 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 714 Appendix: Source Files 715 Glossary 726 Preface I ntroduction to Programming Using Java is a free introductory computer programming textbook that uses Java as the language of instruction. 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 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 Sixth Edition of the book covers “Java 5.0”, along with a few features that were introduced in Java 6 and Java 7. While Java 5.0 introduced major new features that need to be covered in an introductory programming course, Java 6 and Java 7 did not. Whenever the text covers a feature that was not present in Java 5.0, that fact is explicitly noted. Note that Java applets appear throughout the pages of the on-line version of this book. Most of the applets require Java 5.0 or higher. The home web site for this book is http://math.hws.edu/javanotes/ The page at that address contains links for downloading a copy of the web site and for downloading PDF versions of the 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. You’ll find programming exercises at the end of each chapter, except for Chapter 1. For each exercise, there is a web page that gives a detailed solution for that exercise, with the sort of discussion that I would give if I presented the solution in class. (Solutions to the exercises can be found only in the web version of the textbook.) I strongly advise that you read the exercise solutions if you want to get the most out of this book. 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. Some people believe that object oriented programming should also be emphasized from the very beginning. This is 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 x Preface xi related topic