Introduction to Programming Using Java Version 6.0, June 2011 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–2011, David J. Eck David J. Eck (eck@hw s.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 purp ose s. Modified ver sions can be made and distr ibuted for non-commercia l purposes provided they are distributed under the same license as the original. More sp e c ifically: This work is licensed under the Creative Commons Attribution- NonCommercial-ShareAlike 3.0 License. To view a copy of this license, visit http://cr e ativecommons.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/javano tes Contents Preface x 1 The Mental Landscape 1 1.1 Machine Language . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1 1.2 Asynchr on ous 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 Inter face . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 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 Ou tp ut . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 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 Bo olean 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 Environ ments . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 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 sw itch 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 J avadoc . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 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 Keyboar d 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 Subr outines . . . . . . . . . . . . . . . . . . . . . . . . . . 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 St ructures 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 Str uctures . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 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 Exp ressions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 445 9.4 Binary Tr ees . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 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 Inter face . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 493 10.3.2 Views, Sub Sets, and SubMaps . . . . . . . . . . . . . . . . . . . . . . . . 494 10.3.3 Hash Tables and Hash Codes . . . . . . . . . . . . . . . . . . . . . . . . . 497 10.4 Programming w ith the Java Collection Framework . . . . . . . . . . . . . . . . . 499 10.4.1 Symbol Tables . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 499 10.4.2 Sets Insid e 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 Obj ects 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 Runnin g 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 w ith 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 Decompostion . . . . . . . . . . . . . . . . . . . . . . . . . . . . 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 [...]... this first-stage understanding of the computer: 3 CHAPTER 1 THE MENTAL LANDSCAPE Memory CPU Program counter: 10 111 000 01 1.2 0 010 111 0 11 010 011 Data to memory 010 10 011 00 010 000 10 111 111 Data from memory 10 10 011 0 11 1 010 01 0000 011 1 10 10 011 0 Address for 00 010 0 01 reading/writing data 0 011 111 0 (Location 0) (Location 1) (Location 2) (Location 3) (Location 10 ) Asynchronous Events: Polling Loops and Interrupts The... CONTENTS 12 .5 Network Programming Example 12 .5 .1 The Netgame Framework 12 .5.2 A Simple Chat Room 12 .5.3 A Networked TicTacToe Game 12 .5.4 A Networked Poker Game Exercises for Chapter 12 Quiz on Chapter 12 13 Advanced GUI Programming 13 .1 Images and Resources 13 .1. 1 Images and BufferedImages 13 .1. 2 Working With Pixels 13 .1. 3 Resources 13 .1. 4 Cursors... Icons 13 .1. 5 Image File I/O 13 .2 Fancier Graphics 13 .2 .1 Measuring Text 13 .2.2 Transparency 13 .2.3 Antialiasing 13 .2.4 Strokes and Paints 13 .2.5 Transforms 13 .3 Actions and Buttons 13 .3 .1 Action and AbstractAction 13 .3.2 Icons on Buttons 13 .3.3 Radio Buttons 13 .3.4 Toolbars 13 .3.5 Keyboard Accelerators 13 .3.6... HTML on Buttons 13 .4 Complex Components and MVC 13 .4 .1 Model-View-Controller 13 .4.2 Lists and ListModels 13 .4.3 Tables and TableModels 13 .4.4 Documents and Editors 13 .4.5 Custom Components 13 .5 Finishing Touches 13 .5 .1 The Mandelbrot Set 13 .5.2 Design of the Program 13 .5.3 Internationalization 13 .5.4 Events, Events, Events 13 .5.5 Custom Dialogs 13 .5.6... http://math.hws.edu/javanotes/ The first version of the book was written in 19 96, and there have been several editions since then All editions are archived at the following Web addresses: • First edition: http://math.hws.edu/eck/cs124/javanotes1/ (Covers Java 1. 0.) • Second edition: http://math.hws.edu/eck/cs124/javanotes2/ (Covers Java 1. 1.) • Third edition: http://math.hws.edu/eck/cs124/javanotes3/ (Covers Java 1. 1.)... Java 1. 1.) • Fourth edition: http://math.hws.edu/eck/cs124/javanotes4/ (Covers Java 1. 4.) • Fifth edition: http://math.hws.edu/eck/cs124/javanotes5/ (Covers Java 5.0.) • Sixth edition: http://math.hws.edu/eck/cs124/javanotes6/ (Covers Java 5.0 and later.) Introduction to Programming using Java is free, but it is not in the public domain As of Version 6.0, it is published under the terms of the Creative... 684 685 686 686 689 694 695 699 700 702 704 706 708 709 711 714 Appendix: Source Files 715 Glossary 726 Preface Introduction 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... fact, in Java terminology, the whole applet is itself considered to be a “component.” (online) 14 CHAPTER 1 THE MENTAL LANDSCAPE Now, Java actually has two complete sets of GUI components One of these, the AWT or Abstract Windowing Toolkit, was available in the original version of Java The other, which is known as Swing , is included in Java version 1. 2 or later, and is used in preference to the AWT... about writing robust, correct, and efficient programs Chapters 9 and 10 cover recursion and data structures, including the Java Collection Framework Chapter 11 is about files and networking Chapter 12 covers threads and parallel processing Finally, Chapter 13 returns to the topic of graphical user interface programming to cover some of Java s more advanced capabilities ∗ ∗ ∗ Major changes were made for... is to proceed For two computers to communicate at all, they must both be using the same protocols The most basic protocols on the Internet are the Internet Protocol (IP), which specifies how data is to be physically transmitted from one computer to another, and the Transmission Control Protocol (TCP), which ensures that data sent using IP is received in its entirety and without error These two protocols, . 0) (Location 1) (Location 2) (Location 3) (Location 10 ) 00 10 1 1 10 1 1 01 0 01 1 01 0 10 0 11 00 0 10 0 00 10 1 11 111 10 1 0 01 10 11 10 1 0 01 00 000 11 1 10 1 0 01 10 000 10 0 01 00 11 11 10 1. 2 Asynchronous Events: Polling Loops and Interrupts The. .edu/eck/cs124/javanotes1/ (Covers Java 1 .0. ) • Second edition: http://math.hws .edu/eck/cs124/javanotes2/ (Covers Java 1. 1.) • Third edition: http://math.hw s.edu/eck/cs124/javanotes3/ (Covers Java 1. 1.) •. the computer: CHAPTER 1. THE MENTAL LANDSCAPE 3 Data to memory Data from memory Address for reading/writing data 10 1 1 100 0 01 Program counter: CPU Memory (Location 0) (Location 1) (Location 2) (Location