Java for Dummies 5th Edition


Barry Burd, PhD Author of Beginning Programming with Java For Dummies Learn to: • Combine several smaller programs to create a bigger program • Work with new libraries, closure, parallel frameworks, and other new features • Create basic Java objects and reuse code • Handle exceptions and events Java® 5th EditionMaking Everything Easier! ™ Visit the companion website at www.dummies.com/go/ javafordummies5e for lots of code samples that you can use in your Java programs Open the book and find: • Definitions of the many terms you’ll encounter • The grammar of Java • How to save time by reusing code • All about if, for, switch, and while statements • An overview of object-oriented programming • Hints about handling exceptions • How to write Java applets • Ten ways to avoid mistakes Barry Burd, PhD, is a professor of mathematics and computer science at Drew University. He frequently contributes to various online technology resources, including JavaBoutique.com, and is the author of Ruby On Rails For Dummies and the previous edition of this book. $29.99 US / $35.99 CN / £21.99 UK ISBN 978-0-470-37173-2 Programming Languages/Java Go to Dummies.com® for videos, step-by-step examples, how-to articles, or to shop! Jumpin’ Java! The bestselling Java beginner’s book is now fully updated for Java 7! Java, the object-oriented programming language that works on almost any computer, is what powers many of those cool multimedia applications. Thousands have learned Java programming from previous editions of this book — now it’s your turn! Whether you’re new to programming or already know a little Visual Basic or C++, you’ll be doing Java in a jiffy. • The Java scoop — get an overview of Java, the enhancements in Java 7, and the software tools you need • Building blocks — learn to work with Java classes and methods and add comments • Get loopy — understand the value of variables and learn to control program flow with loops or decision-making statements • Class it up — explore classes and objects, constructors, and subclasses, and see how to reuse your code • A click ahead — experiment with variables and methods, use arrays and collections to juggle values, and create programs that respond to mouse clicks Java ® Burd 5th Edition www.it-ebooks.info Start with FREE Cheat Sheets Cheat Sheets include • Checklists • Charts • Common Instructions • And Other Good Stuff! Get Smart at Dummies.com Dummies.com makes your life easier with 1,000s of answers on everything from removing wallpaper to using the latest version of Windows. Check out our • Videos • Illustrated Articles • Step-by-Step Instructions Plus, each month you can win valuable prizes by entering our Dummies.com sweepstakes. * Want a weekly dose of Dummies? Sign up for Newsletters on • Digital Photography • Microsoft Windows & Office • Personal Finance & Investing • Health & Wellness • Computing, iPods & Cell Phones • eBay • Internet • Food, Home & Garden Find out “HOW” at Dummies.com *Sweepstakes not currently available in all countries; visit Dummies.com for official rules. Get More and Do More at Dummies.com® To access the Cheat Sheet created specifically for this book, go to www.dummies.com/cheatsheet/java Mobile Apps There’s a Dummies App for This and That With more than 200 million books in print and over 1,600 unique titles, Dummies is a global leader in how-to information. Now you can get the same great Dummies information in an App. With topics such as Wine, Spanish, Digital Photography, Certification, and more, you’ll have instant access to the topics you need to know in a format you can trust. To get information on all our Dummies apps, visit the following: www.Dummies.com/go/mobile from your computer. www.Dummies.com/go/iphone/apps from your phone. www.it-ebooks.info Java® FOR DUMmIES‰ 5TH EDITION 01_9780470371732-ffirs.indd i01_9780470371732-ffirs.indd i 7/6/11 6:57 PM7/6/11 6:57 PM www.it-ebooks.info 01_9780470371732-ffirs.indd ii01_9780470371732-ffirs.indd ii 7/6/11 6:57 PM7/6/11 6:57 PM www.it-ebooks.info by Barry Burd Java® FOR DUMmIES‰ 5TH EDITION 01_9780470371732-ffirs.indd iii01_9780470371732-ffirs.indd iii 7/6/11 6:57 PM7/6/11 6:57 PM www.it-ebooks.info Java® For Dummies®, 5th Edition Published by Wiley Publishing, Inc. 111 River Street Hoboken, NJ 07030-5774 www.wiley.com Copyright © 2011 by Wiley Publishing, Inc., Indianapolis, Indiana Published by Wiley Publishing, Inc., Indianapolis, Indiana Published simultaneously in Canada No part of this publication may be reproduced, stored in a retrieval system or transmitted in any form or by any means, electronic, mechanical, photocopying, recording, scanning or otherwise, except as permit- ted under Sections 107 or 108 of the 1976 United States Copyright Act, without either the prior written permission of the Publisher, or authorization through payment of the appropriate per-copy fee to the Copyright Clearance Center, 222 Rosewood Drive, Danvers, MA 01923, (978) 750-8400, fax (978) 646-8600. Requests to the Publisher for permission should be addressed to the Permissions Department, John Wiley & Sons, Inc., 111 River Street, Hoboken, NJ 07030, (201) 748-6011, fax (201) 748-6008, or online at http:// www.wiley.com/go/permissions. Trademarks: Wiley, the Wiley Publishing logo, For Dummies, the Dummies Man logo, A Reference for the Rest of Us!, The Dummies Way, Dummies Daily, The Fun and Easy Way, Dummies.com, Making Everything Easier, and related trade dress are trademarks or registered trademarks of John Wiley & Sons, Inc. and/or its aff liates in the United States and other countries, and may not be used without written permission. Java is a registered trademark of Oracle America, Inc. All other trademarks are the property of their respective owners. Wiley Publishing, Inc., is not associated with any product or vendor mentioned in this book. LIMIT OF LIABILITY/DISCLAIMER OF WARRANTY: THE PUBLISHER AND THE AUTHOR MAKE NO REPRESENTATIONS OR WARRANTIES WITH RESPECT TO THE ACCURACY OR COMPLETENESS OF THE CONTENTS OF THIS WORK AND SPECIFICALLY DISCLAIM ALL WARRANTIES, INCLUDING WITH- OUT LIMITATION WARRANTIES OF FITNESS FOR A PARTICULAR PURPOSE. NO WARRANTY MAY BE CREATED OR EXTENDED BY SALES OR PROMOTIONAL MATERIALS. THE ADVICE AND STRATEGIES CONTAINED HEREIN MAY NOT BE SUITABLE FOR EVERY SITUATION. THIS WORK IS SOLD WITH THE UNDERSTANDING THAT THE PUBLISHER IS NOT ENGAGED IN RENDERING LEGAL, ACCOUNTING, OR OTHER PROFESSIONAL SERVICES. IF PROFESSIONAL ASSISTANCE IS REQUIRED, THE SERVICES OF A COMPETENT PROFESSIONAL PERSON SHOULD BE SOUGHT. NEITHER THE PUBLISHER NOR THE AUTHOR SHALL BE LIABLE FOR DAMAGES ARISING HEREFROM. THE FACT THAT AN ORGANIZATION OR WEBSITE IS REFERRED TO IN THIS WORK AS A CITATION AND/OR A POTENTIAL SOURCE OF FUR- THER INFORMATION DOES NOT MEAN THAT THE AUTHOR OR THE PUBLISHER ENDORSES THE INFOR- MATION THE ORGANIZATION OR WEBSITE MAY PROVIDE OR RECOMMENDATIONS IT MAY MAKE. FURTHER, READERS SHOULD BE AWARE THAT INTERNET WEBSITES LISTED IN THIS WORK MAY HAVE CHANGED OR DISAPPEARED BETWEEN WHEN THIS WORK WAS WRITTEN AND WHEN IT IS READ. For general information on our other products and services, please contact our Customer Care Department within the U.S. at 877-762-2974, outside the U.S. at 317-572-3993, or fax 317-572-4002. For technical support, please visit www.wiley.com/techsupport. Wiley also publishes its books in a variety of electronic formats and by print-on-demand. Not all content that is available in standard print versions of this book may appear or be packaged in all book formats. If you have purchased a version of this book that did not include media that is referenced by or accom- panies a standard print version, you may request this media by visiting http://booksupport.wiley. com. For more information about Wiley products, visit us www.wiley.com. Library of Congress Control Number: 2011932274 ISBN: 978-0-470-37173-2 (pbk); ISBN: 978-1-118-12830-5 (ebk); ISBN: 978-1-118-12831-2 (ebk); ISBN: 978-1-118-12832-9 (ebk) Manufactured in the United States of America 10 9 8 7 6 5 4 3 2 1 01_9780470371732-ffirs.indd iv01_9780470371732-ffirs.indd iv 7/6/11 6:57 PM7/6/11 6:57 PM www.it-ebooks.info About the Author Barry Burd received an M.S. degree in Computer Science at Rutgers University and a Ph.D. in Mathematics at the University of Illinois. As a teaching assistant in Champaign-Urbana, Illinois, he was elected f ve times to the university-wide List of Teachers Ranked as Excellent by their Students. Since 1980, Dr. Burd has been a professor in the Department of Mathematics and Computer Science at Drew University in Madison, New Jersey. When he’s not lecturing at Drew University, Dr. Burd leads training courses for profes- sional programmers in business and industry. He has lectured at conferences in the United States, Europe, Australia, and Asia. He is the author of several articles and books, including Android Application Development All-in-One For Dummies and Beginning Programming with Java For Dummies, both from Wiley Publishing, Inc. Dr. Burd lives in Madison, New Jersey, with his wife and two children. In his spare time, he enjoys being a workaholic. 01_9780470371732-ffirs.indd v01_9780470371732-ffirs.indd v 7/6/11 6:57 PM7/6/11 6:57 PM www.it-ebooks.info 01_9780470371732-ffirs.indd vi01_9780470371732-ffirs.indd vi 7/6/11 6:57 PM7/6/11 6:57 PM www.it-ebooks.info Dedication for Jennie, Sam, and Harriet, Jennie and Benjamin, Katie and Abram, and Basheva 01_9780470371732-ffirs.indd vii01_9780470371732-ffirs.indd vii 7/6/11 6:57 PM7/6/11 6:57 PM www.it-ebooks.info 01_9780470371732-ffirs.indd viii01_9780470371732-ffirs.indd viii 7/6/11 6:57 PM7/6/11 6:57 PM www.it-ebooks.info Author’s Acknowledgments When asked to list his talents, Siddhartha replied “I can think. I can wait. I can fast.” Waiting is one of the three most important virtues. With this in mind, I thank Mary Bednarek, Andy Cummings, Katie Feltman, Paul Levesque, Virginia Sanders, and Brian Walls for their boundless patience during the creation of this 5th edition. 01_9780470371732-ffirs.indd ix01_9780470371732-ffirs.indd ix 7/6/11 6:57 PM7/6/11 6:57 PM www.it-ebooks.info Publisher’s Acknowledgments We’re proud of this book; please send us your comments at http://dummies.custhelp.com. For other comments, please contact our Customer Care Department within the U.S. at 877-762-2974, out- side the U.S. at 317-572-3993, or fax 317-572-4002. Some of the people who helped bring this book to market include the following: Acquisitions, Editorial, and Media Development Senior Project Editor: Paul Levesque Acquisitions Editor: Katie Feltman Copy Editors: Brian Walls and Virginia Sanders Technical Editor: John Mueller Editorial Manager: Leah Cameron Media Development Project Manager: Laura Moss-Hollister Media Development Assistant Project Manager: Jenny Swisher Media Development Associate Producers: Josh Frank, Marilyn Hummel, Douglas Kuhn, and Shawn Patrick Editorial Assistant: Amanda Graham Sr. Editorial Assistant: Cherie Case Cartoons: Rich Tennant (www.the5thwave.com) Composition Services Project Coordinator: Sheree Montgomery Layout and Graphics: Stephanie Jumper, Corrie Socolovitch, Laura Westhuis Proofreader: Toni Settle Indexer: Potomac Indexing, LLC Publishing and Editorial for Technology Dummies Richard Swadley, Vice President and Executive Group Publisher Andy Cummings, Vice President and Publisher Mary Bednarek, Executive Acquisitions Director Mary C. Corder, Editorial Director Publishing for Consumer Dummies Kathy Nebenhaus, Vice President and Executive Publisher Composition Services Debbie Stailey, Director of Composition Services 01_9780470371732-ffirs.indd x01_9780470371732-ffirs.indd x 7/6/11 6:57 PM7/6/11 6:57 PM www.it-ebooks.info Contents at a Glance Introduction ................................................................ 1 Part I: Getting Started ................................................. 9 Chapter 1: All about Java ................................................................................................11 Chapter 2: All about Software ........................................................................................23 Chapter 3: Using the Basic Building Blocks ..................................................................39 Part II: Writing Your Own Java Programs .................... 61 Chapter 4: Making the Most of Variables and Their Values .......................................63 Chapter 5: Controlling Program Flow with Decision-Making Statements .................93 Chapter 6: Controlling Program Flow with Loops .....................................................123 Part III: Working with the Big Picture: Object-Oriented Programming ...................................137 Chapter 7: Thinking in Terms of Classes and Objects ..............................................139 Chapter 8: Saving Time and Money: Reusing Existing Code ....................................167 Chapter 9: Constructing New Objects .........................................................................195 Part IV: Savvy Java Techniques ................................ 217 Chapter 10: Putting Variables and Methods Where They Belong ...........................219 Chapter 11: Using Arrays and Collections to Juggle Values .....................................249 Chapter 12: Looking Good When Things Take Unexpected Turns..........................281 Chapter 13: Sharing Names among the Parts of a Java Program .............................311 Chapter 14: Responding to Keystrokes and Mouse Clicks .......................................333 Chapter 15: Writing Java Applets ................................................................................351 Chapter 16: Using Java Database Connectivity ..........................................................363 Part V: The Part of Tens ........................................... 373 Chapter 17: Ten Ways to Avoid Mistakes ...................................................................375 Chapter 18: Ten Websites for Java ..............................................................................381 Index ...................................................................... 383 02_9780470371732-ftoc.indd xi02_9780470371732-ftoc.indd xi 7/6/11 6:57 PM7/6/11 6:57 PM www.it-ebooks.info 02_9780470371732-ftoc.indd xii02_9780470371732-ftoc.indd xii 7/6/11 6:57 PM7/6/11 6:57 PM www.it-ebooks.info Table of Contents Introduction ................................................................. 1 How to Use This Book .....................................................................................1 Conventions Used in This Book .....................................................................2 What You Don’t Have to Read ........................................................................2 Foolish Assumptions .......................................................................................3 How This Book Is Organized ..........................................................................4 Part I: Getting Started ............................................................................4 Part II: Writing Your Own Java Programs ...........................................4 Part III: Working with the Big Picture: Object-Oriented Programming ......................................................................................5 Part IV: Savvy Java Techniques ...........................................................5 Part V: The Part of Tens ........................................................................5 Icons Used in This Book .................................................................................6 Where to Go from Here ...................................................................................7 Part I: Getting Started ..................................................9 Chapter 1: All about Java . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .11 What You Can Do with Java .........................................................................12 Why You Should Use Java ............................................................................13 Getting Perspective: Where Java Fits In .....................................................14 Object-Oriented Programming (OOP) .........................................................16 Object-oriented languages ..................................................................16 Objects and their classes ....................................................................18 What’s so good about an object-oriented language? ........................... 18 Ref ning your understanding of classes and objects.......................21 What’s Next? ...................................................................................................22 Chapter 2: All about Software . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .23 Quick-Start Instructions ................................................................................23 What You Install on Your Computer ...........................................................25 What is a compiler? .............................................................................26 What is a Java virtual machine? .........................................................28 Developing Software ............................................................................33 What is an Integrated Development Environment? .........................35 02_9780470371732-ftoc.indd xiii02_9780470371732-ftoc.indd xiii 7/6/11 6:57 PM7/6/11 6:57 PM www.it-ebooks.info Java For Dummies, 5th Edition xiv Chapter 3: Using the Basic Building Blocks . . . . . . . . . . . . . . . . . . . . . .39 Speaking the Java Language .........................................................................39 The grammar and the common names .............................................40 The words in a Java program .............................................................41 Checking Out Java Code for the First Time ................................................43 Understanding a Simple Java Program .......................................................44 The Java class ......................................................................................44 The Java method ..................................................................................45 The main method in a program .........................................................47 How you f nally tell the computer to do something ........................49 Curly braces .........................................................................................51 And Now, a Few Comments ..........................................................................53 Adding comments to your code .........................................................54 What’s Barry’s excuse? .......................................................................58 Using comments to experiment with your code ..............................58 Part II: Writing Your Own Java Programs ..................... 61 Chapter 4: Making the Most of Variables and Their Values . . . . . . . .63 Varying a Variable .........................................................................................63 Assignment Statements ................................................................................65 Understanding the Types of Values That Variables May Have ...............67 Displaying Text ..............................................................................................70 Numbers without Decimal Points ................................................................70 Combining Declarations and Initializing Variables ............................................72 The Atoms: Java’s Primitive Types .............................................................73 The char type .......................................................................................74 The boolean type .................................................................................76 The Molecules and Compounds: Reference Types ...................................77 An Import Declaration ..................................................................................81 Creating New Values by Applying Operators ............................................83 Initialize once, assign often ................................................................85 The increment and decrement operators ........................................86 Assignment operators .........................................................................91 Chapter 5: Controlling Program Flow with Decision-Making Statements . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .93 Making Decisions (Java if Statements) .......................................................94 Guess the number ................................................................................94 She controlled keystrokes from the keyboard .................................95 Creating randomness ..........................................................................97 The if statement ...................................................................................98 The double equal sign .........................................................................99 Brace yourself ......................................................................................99 Indenting if statements in your code...............................................100 Elseless in Ifrica..................................................................................101 02_9780470371732-ftoc.indd xiv02_9780470371732-ftoc.indd xiv 7/6/11 6:57 PM7/6/11 6:57 PM www.it-ebooks.info xv Table of Contents Forming Conditions with Comparisons and Logical Operators ............102 Comparing numbers; comparing characters .................................102 Comparing objects .............................................................................103 Importing everything in one fell swoop ..........................................106 Java’s logical operators ....................................................................106 Vive les nuls! .......................................................................................109 (Conditions in parentheses) .............................................................111 Building a Nest .............................................................................................112 Choosing among Many Alternatives (Java switch Statements) .............114 Your basic switch statement ............................................................115 To break or not to break ...................................................................118 Along comes Java 7............................................................................120 Chapter 6: Controlling Program Flow with Loops . . . . . . . . . . . . . . . .123 Repeating Instructions Over and Over Again (Java while Statements) ..........................................................................124 Repeating a Certain Number of Times (Java for Statements) ................127 The anatomy of a for statement .......................................................128 The world premiere of “Al’s All Wet” ..............................................129 Repeating Until You Get What You Want (Java do Statements) ...............131 Reading a single character ...............................................................134 File handling in Java ..........................................................................135 Variable declarations and blocks ....................................................136 Part III: Working with the Big Picture: Object-Oriented Programming ................................... 137 Chapter 7: Thinking in Terms of Classes and Objects. . . . . . . . . . . . .139 Def ning a Class (What It Means to Be an Account) ................................140 A public class .....................................................................................142 Declaring variables and creating objects .......................................142 Initializing a variable .........................................................................145 Using an object’s f elds .....................................................................145 One program; several classes ..........................................................146 Def ning a Method within a Class (Displaying an Account) ...................146 An account that displays itself .........................................................147 The display method’s header ...........................................................148 Sending Values to and from Methods (Calculating Interest) .................149 Passing a value to a method .............................................................152 Returning a value from the getInterest method .............................155 Making Numbers Look Good ......................................................................156 Hiding Details with Accessor Methods (Why You Shouldn’t Micromanage a Bank Teller)...................................................................160 Good programming ............................................................................160 Public lives and private dreams: Making a f eld inaccessible ......163 Enforcing rules with accessor methods..........................................165 02_9780470371732-ftoc.indd xv02_9780470371732-ftoc.indd xv 7/6/11 6:57 PM7/6/11 6:57 PM www.it-ebooks.info Java For Dummies, 5th Edition xvi Chapter 8: Saving Time and Money: Reusing Existing Code . . . . . . .167 Def ning a Class (What It Means to Be an Employee) .............................168 The last word on employees ............................................................168 Putting your class to good use .........................................................170 Cutting a check ...................................................................................171 Working with Disk Files (A Brief Detour) .................................................172 Storing data in a f le ...........................................................................173 Copying and pasting code ................................................................173 Reading from a f le .............................................................................174 Who moved my f le? ..........................................................................177 Adding directory names to your f lenames ....................................177 Reading a line at a time .....................................................................178 Def ning Subclasses (What It Means to Be a Full-Time or Part-Time Employee) ...............................................................................180 Creating a subclass ............................................................................182 Creating subclasses is habit-forming ..............................................184 Using Subclasses .........................................................................................185 Making types match ..........................................................................187 The second half of the story.............................................................188 Overriding Existing Methods (Changing the Payments for Some of Your Employees) .......................................................................189 A Java annotation ..............................................................................191 Using methods from classes and subclasses .................................192 Chapter 9: Constructing New Objects . . . . . . . . . . . . . . . . . . . . . . . . . .195 Def ning Constructors (What It Means to Be a Temperature) ...............196 What is a temperature? .....................................................................196 What is a temperature scale? (Java’s enum type) .........................197 Okay, so then what is a temperature? .............................................197 What you can do with a temperature ..............................................199 Calling new Temperature(32.0): A case study ...............................201 Some things never change ................................................................205 More Subclasses (Doing Something about the Weather) .......................206 Building better temperatures ...........................................................206 Constructors for subclasses .............................................................208 Using all this stuff ..............................................................................209 The default constructor ....................................................................210 A Constructor That Does More ..................................................................211 Classes and methods from the Java API .........................................214 The SuppressWarnings annotation .................................................215 02_9780470371732-ftoc.indd xvi02_9780470371732-ftoc.indd xvi 7/6/11 6:57 PM7/6/11 6:57 PM www.it-ebooks.info xvii Table of Contents Part IV: Savvy Java Techniques ................................. 217 Chapter 10: Putting Variables and Methods Where They Belong. . . . .219 Def ning a Class (What It Means to Be a Baseball Player) ......................219 Another way to beautify your numbers ..........................................220 Using the Player class .......................................................................221 Nine, count ’em, nine .........................................................................223 Don’t get all GUI on me ......................................................................224 Tossing an exception from method to method..............................225 Making Static (Finding the Team Average) ..............................................226 Why is there so much static? ...........................................................228 Meet the static initializer ..................................................................229 Displaying the overall team average ...............................................230 Static is old hat ...................................................................................232 Could cause static; handle with care ..............................................233 Experiments with Variables .......................................................................234 Putting a variable in its place ...........................................................235 Telling a variable where to go ..........................................................237 Passing Parameters .....................................................................................240 Pass by value ......................................................................................240 Returning a result ..............................................................................242 Pass by reference ...............................................................................243 Returning an object from a method ................................................245 Epilogue...............................................................................................247 Chapter 11: Using Arrays and Collections to Juggle Values . . . . . . .249 Getting Your Ducks All in a Row ................................................................249 Creating an array in two easy steps ................................................251 Storing values .....................................................................................252 Tab stops and other special things .................................................255 Using an array initializer ...................................................................255 Stepping through an array with the enhanced for loop ...............256 Searching ............................................................................................258 Arrays of Objects .........................................................................................261 Using the Room class ........................................................................263 Yet another way to beautify your numbers ...................................266 The conditional operator ..................................................................267 Command Line Arguments .........................................................................267 Using command line arguments in a Java program ......................269 Checking for the right number of command line arguments .......271 02_9780470371732-ftoc.indd xvii02_9780470371732-ftoc.indd xvii 7/6/11 6:57 PM7/6/11 6:57 PM www.it-ebooks.info Java For Dummies, 5th Edition xviii Using Java Collections ................................................................................272 Collection classes to the rescue ......................................................273 Using an ArrayList .............................................................................274 Using generics (hot stuff!).................................................................277 Testing for the presence of more data ............................................278 Chapter 12: Looking Good When Things Take Unexpected Turns . . . .281 Handling Exceptions ...................................................................................282 The parameter in a catch clause......................................................286 Exception types ..................................................................................287 Who’s going to catch the exception? ..............................................289 Java 7 and the multi-catch clause ....................................................295 Throwing caution to the wind ..........................................................296 Doing useful things ............................................................................297 Our friends, the good exceptions ....................................................298 Handle an Exception or Pass the Buck .....................................................299 Finishing the Job with a f nally Clause ......................................................304 Close Those Files! ........................................................................................306 How to close a f le ..............................................................................307 A try statement with resources .......................................................307 Chapter 13: Sharing Names among the Parts of a Java Program . . . .311 Access Modif ers ..........................................................................................312 Classes, Access, and Multipart Programs ................................................313 Members versus classes ...................................................................313 Access modif ers for members.........................................................314 Putting a drawing on a frame ...........................................................316 Directory structure ............................................................................319 Making a frame ...................................................................................320 Sneaking Away from the Original Code ....................................................321 Default access.....................................................................................323 Crawling back into the package .......................................................326 Protected Access .........................................................................................326 Putting non-subclasses in the same package .................................328 Access Modif ers for Java Classes .............................................................330 Public classes .....................................................................................330 Nonpublic classes ..............................................................................331 Chapter 14: Responding to Keystrokes and Mouse Clicks . . . . . . . . .333 Go On . . . Click That Button .......................................................................333 Events and event handling ...............................................................336 The Java interface ..............................................................................336 Threads of execution .........................................................................338 The keyword this ...............................................................................339 Inside the actionPerformed method ...............................................340 The serialVersionUID ........................................................................341 Responding to Things Other Than Button Clicks ....................................341 Creating Inner Classes ................................................................................347 02_9780470371732-ftoc.indd xviii02_9780470371732-ftoc.indd xviii 7/6/11 6:57 PM7/6/11 6:57 PM www.it-ebooks.info xix Table of Contents Chapter 15: Writing Java Applets . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .351 Applets 101 ...................................................................................................351 Waiting to be called ...........................................................................353 A public class .....................................................................................353 The Java API (again) ..........................................................................354 Making Things Move ...................................................................................354 The methods in an applet .................................................................357 What to put into all these methods .................................................358 Responding to Events in an Applet ...........................................................359 Chapter 16: Using Java Database Connectivity . . . . . . . . . . . . . . . . . .363 JDBC and Java DB ........................................................................................363 Creating Data ................................................................................................364 Using SQL commands ........................................................................366 Connecting and disconnecting .........................................................367 Retrieving Data ............................................................................................369 Part V: The Part of Tens ............................................ 373 Chapter 17: Ten Ways to Avoid Mistakes . . . . . . . . . . . . . . . . . . . . . . .375 Putting Capital Letters Where They Belong .............................................375 Breaking Out of a switch Statement ..........................................................376 Comparing Values with a Double Equal Sign ...........................................376 Adding Components to a GUI .....................................................................377 Adding Listeners to Handle Events ...........................................................377 Def ning the Required Constructors .........................................................377 Fixing Non-Static References ......................................................................378 Staying within Bounds in an Array ............................................................378 Anticipating Null Pointers ..........................................................................378 Helping Java Find Its Files ..........................................................................379 Chapter 18: Ten Websites for Java . . . . . . . . . . . . . . . . . . . . . . . . . . . . .381 This Book’s Website ....................................................................................381 The Horse’s Mouth ......................................................................................381 Finding News, Reviews, and Sample Code ...............................................382 Looking for Java Jobs ..................................................................................382 Everyone’s Favorite Sites ...........................................................................382 Index ....................................................................... 383 02_9780470371732-ftoc.indd xix02_9780470371732-ftoc.indd xix 7/6/11 6:57 PM7/6/11 6:57 PM www.it-ebooks.info Java For Dummies, 5th Edition xx 02_9780470371732-ftoc.indd xx02_9780470371732-ftoc.indd xx 7/6/11 6:57 PM7/6/11 6:57 PM www.it-ebooks.info Introduction Java is good stuff. I’ve been using it for years. I like Java because it’s very orderly. Almost everything follows simple rules. The rules can seem intimidating at times, but this book is here to help you figure them out. So, if you want to use Java and want an alternative to the traditional techie, soft- cover book, sit down, relax, and start reading Java For Dummies, 5th Edition. How to Use This Book I wish I could say, “Open to a random page of this book and start writing Java code. Just fill in the blanks and don’t look back.” In a sense, this is true. You can’t break anything by writing Java code, so you’re always free to experiment. But let me be honest. If you don’t understand the bigger picture, writing a program is difficult. That’s true with any computer programming language — not just Java. If you’re typing code without knowing what it’s about, and the code doesn’t do exactly what you want it to do, you’re just plain stuck. So, in this book, I divide Java programming into manageable chunks. Each chunk is (more or less) a chapter. You can jump in anywhere you want — Chapter 5, Chapter 10, or wherever. You can even start by poking around in the middle of a chapter. I’ve tried to make the examples interesting without making one chapter depend on another. When I use an important idea from another chapter, I include a note to help you find your way around. In general, my advice is as follows: ✓ If you already know something, don’t bother reading about it. ✓ If you’re curious, don’t be afraid to skip ahead. You can always sneak a peek at an earlier chapter if you really need to do so. 03_9780470371732-intro.indd 103_9780470371732-intro.indd 1 7/6/11 6:57 PM7/6/11 6:57 PM www.it-ebooks.info 2 Java For Dummies, 5th Edition Conventions Used in This Book Almost every technical book starts with a little typeface legend, and Java For Dummies, 5th Edition, is no exception. What follows is a brief explanation of the typefaces used in this book: ✓ New terms are set in italics. ✓ If you need to type something that’s mixed in with the regular text, the characters you type appear in bold. For example: “Type MyNewProject in the text field.” ✓ You also see this computerese font. I use computerese for Java code, filenames, web page addresses (URLs), on-screen messages, and other such things. Also, if something you need to type is really long, it appears in computerese font on its own line (or lines). ✓ You need to change certain things when you type them on your own computer keyboard. For instance, I may ask you to type public class Anyname which means that you type public class and then some name that you make up on your own. Words that you need to replace with your own words are set in italicized computerese. What You Don’t Have to Read Pick the first chapter or section that has material you don’t already know and start reading there. Of course, you may hate making decisions as much as I do. If so, here are some guidelines that you can follow: ✓ If you already know what kind of an animal Java is and know that you want to use Java, skip Chapter 1 and go straight to Chapter 2. Believe me, I won’t mind. ✓ If you already know how to get a Java program running, and you don’t care what happens behind the scenes when a Java program runs, then skip Chapter 2 and start with Chapter 3. ✓ If you write programs for a living but use any language other than C or C++, start with Chapter 2 or 3. When you reach Chapters 5 and 6, you’ll probably find them to be easy reading. When you get to Chapter 7, it’ll be time to dive in. 03_9780470371732-intro.indd 203_9780470371732-intro.indd 2 7/6/11 6:57 PM7/6/11 6:57 PM www.it-ebooks.info 3 Introduction ✓ If you write C (not C++) programs for a living, start with Chapters 2, 3, and 4 but just skim Chapters 5 and 6. ✓ If you write C++ programs for a living, glance at Chapters 2 and 3, skim Chapters 4 through 6, and start reading seriously in Chapter 7. (Java is a bit different from C++ in the way it handles classes and objects.) ✓ If you write Java programs for a living, come to my house and help me write Java For Dummies, 6th Edition. If you want to skip the sidebars and the Technical Stuff icons, please do. In fact, if you want to skip anything at all, feel free. Foolish Assumptions In this book, I make a few assumptions about you, the reader. If one of these assumptions is incorrect, you’re probably okay. If all these assumptions are incorrect . . . well, buy the book anyway. ✓ I assume that you have access to a computer. Here’s the good news: You can run the code in this book on almost any computer. The only computers that you can’t use to run this code are ancient things that are more than 10 years old (give or take a few years). ✓ I assume that you can navigate through your computer’s common menus and dialog boxes. You don’t have to be a Windows, UNIX, or Macintosh power user, but you should be able to start a program, find a file, put a file into a certain directory . . . that sort of thing. Most of the time, when you practice the stuff in this book, you’re typing code on your keyboard, not pointing and clicking your mouse. On those rare occasions when you need to drag and drop, cut and paste, or plug and play, I guide you carefully through the steps. But your com- puter may be configured in any of several billion ways, and my instructions may not quite fit your special situation. So, when you reach one of these platform-specific tasks, try following the steps in this book. If the steps don’t quite fit, consult a book with instructions tailored to your system. ✓ I assume that you can think logically. That’s all there is to program- ming in Java — thinking logically. If you can think logically, you’ve got it made. If you don’t believe that you can think logically, read on. You may be pleasantly surprised. 03_9780470371732-intro.indd 303_9780470371732-intro.indd 3 7/6/11 6:57 PM7/6/11 6:57 PM www.it-ebooks.info 4 Java For Dummies, 5th Edition ✓ I make very few assumptions about your computer programming experience (or your lack of such experience). In writing this book, I’ve tried to do the impossible. I’ve tried to make the book interesting for experienced programmers, yet accessible to people with little or no programming experience. This means that I don’t assume any particular programming background on your part. If you’ve never created a loop or indexed an array, that’s okay. On the other hand, if you’ve done these things (maybe in Visual Basic, COBOL, or C++), you’ll discover some interesting plot twists in Java. The developers of Java took the best ideas in object-oriented programming, streamlined them, reworked them, and reorganized them into a sleek, powerful way of thinking about problems. You’ll find many new, thought- provoking features in Java. As you find out about these features, many of them will seem very natural to you. One way or another, you’ll feel good about using Java. How This Book Is Organized This book is divided into subsections, which are grouped into sections, which come together to make chapters, which are lumped finally into five parts. (When you write a book, you get to know your book’s structure pretty well. After months of writing, you find yourself dreaming in sections and chapters when you go to bed at night.) The parts of the book are listed here. Part I: Getting Started This part is your complete, executive briefing on Java. It includes some “What is Java?” material and a jump-start chapter — Chapter 3. In Chapter 3, you visit the major technical ideas and dissect a simple program. Part II: Writing Your Own Java Programs Chapters 4 through 6 cover the fundamentals. These chapters describe the things that you need to know so you can get your computer humming along. 03_9780470371732-intro.indd 403_9780470371732-intro.indd 4 7/6/11 6:57 PM7/6/11 6:57 PM www.it-ebooks.info 5 Introduction If you’ve written programs in Visual Basic, C++, or any another language, some of the material in Part II may be familiar to you. If so, you can skip some sections or read this stuff quickly. But don’t read too quickly. Java is a little different from some other programming languages, especially in the things that I describe in Chapter 4. Part III: Working with the Big Picture: Object-Oriented Programming Part III has some of my favorite chapters. This part covers the all-important topic of object-oriented programming. In these chapters, you find out how to map solutions to big problems. (Sure, the examples in these chapters aren’t big, but the examples involve big ideas.) In bite-worthy increments, you dis- cover how to design classes, reuse existing classes, and construct objects. Have you read any of those books that explain object-oriented programming in vague, general terms? I’m very proud to say that Java For Dummies, 5th Edition, isn’t like that. In this book, I illustrate each concept with a simple- yet-concrete program example. Part IV: Savvy Java Techniques If you’ve tasted some Java and want more, you can find what you need in this part of the book. This part’s chapters are devoted to details — the things that you don’t see when you first glance at the material. So, after you read the earlier parts and write some programs on your own, you can dive in a little deeper by reading Part IV. Part V: The Part of Tens The Part of Tens is a little Java candy store. In the Part of Tens, you can find lists — lists of tips for avoiding mistakes, for finding resources, and for all kinds of interesting goodies. 03_9780470371732-intro.indd 503_9780470371732-intro.indd 5 7/6/11 6:57 PM7/6/11 6:57 PM www.it-ebooks.info 6 Java For Dummies, 5th Edition Icons Used in This Book If you could watch me write this book, you’d see me sitting at my computer, talking to myself. I say each sentence in my head. Most of the sentences I mutter several times. When I have an extra thought, a side comment, or something that doesn’t belong in the regular stream, I twist my head a little bit. That way, whoever’s listening to me (usually nobody) knows that I’m off on a momentary tangent. Of course, in print, you can’t see me twisting my head. I need some other way of setting a side thought in a corner by itself. I do it with icons. When you see a Tip icon or a Remember icon, you know that I’m taking a quick detour. Here’s a list of icons that I use in this book. A tip is an extra piece of information — something helpful that the other books may forget to tell you. Everyone makes mistakes. Heaven knows that I’ve made a few in my time. Anyway, when I think people are especially prone to make a mistake, I mark it with a Warning icon. Question: What’s stronger than a Tip, but not as strong as a Warning? Answer: A Remember icon. “If you don’t remember what such-and-such means, see blah-blah-blah,” or “For more information, read blahbity-blah-blah.” This icon calls attention to useful material that you can find online. (You don’t have to wait long to see one of these icons. I use one at the end of this introduction!) Occasionally, I run across a technical tidbit. The tidbit may help you under- stand what the people behind the scenes (the people who developed Java) were thinking. You don’t have to read it, but you may find it useful. You may also find the tidbit helpful if you plan to read other (more geeky) books about Java. 03_9780470371732-intro.indd 603_9780470371732-intro.indd 6 7/6/11 6:57 PM7/6/11 6:57 PM www.it-ebooks.info 7 Introduction Where to Go from Here If you’ve gotten this far, you’re ready to start reading about Java. Think of me (the author) as your guide, your host, your personal assistant. I do everything I can to keep things interesting and, most importantly, help you understand. If you like what you read, send me a note. My e-mail address, which I created just for comments and questions about this book, is JavaForDummies@allmy code.com. And don’t forget — for the latest updates, visit this book’s website. The sites’ main address is www.allmycode.com/JavaForDummies, but you can also get there by visiting www.dummies.com/go/javafordummies5e. 03_9780470371732-intro.indd 703_9780470371732-intro.indd 7 7/6/11 6:57 PM7/6/11 6:57 PM www.it-ebooks.info 8 Java For Dummies, 5th Edition 03_9780470371732-intro.indd 803_9780470371732-intro.indd 8 7/6/11 6:57 PM7/6/11 6:57 PM www.it-ebooks.info Part I Getting Started 04_9780470371732-pp01.indd 904_9780470371732-pp01.indd 9 7/6/11 6:57 PM7/6/11 6:57 PM www.it-ebooks.info In this part . . . Become acquainted with Java. Find out what Java is all about and whether you do (or don’t) want to use Java. If you’ve heard things about Java and aren’t sure what they mean, the material in this part can help you. If you’re staring at your computer, wondering how you’re going to get a Java program running, this part has the information that you need. Maybe you’ve told people that you’re a Java expert, and now you need to do some seri- ous bluffing. If so, this part of the book is your crash course in Java. (Of course, if the word bluffing describes you accurately, you may also want to pick up a copy of Ethics For Dummies.) 04_9780470371732-pp01.indd 1004_9780470371732-pp01.indd 10 7/6/11 6:57 PM7/6/11 6:57 PM www.it-ebooks.info Chapter 1 All about Java In This Chapter ▶ What Java is ▶ Where Java came from ▶ Why Java is so cool ▶ How to orient yourself to object-oriented programming Say what you want about computers. As far as I’m concerned, computers are good for just two simple reasons: ✓ When computers do work, they feel no resistance, no stress, no bore- dom, and no fatigue. Computers are our electronic slaves. I have my computer working 24/7 doing calculations for SETI@home — the search for extraterrestrial intelligence. Do I feel sorry for my computer because it’s working so hard? Does the computer complain? Will the computer report me to the National Labor Relations Board? No. I can make demands, give the computer its orders, and crack the whip. Do I (or should I) feel the least bit guilty? Not at all. ✓ Computers move ideas, not paper. Not long ago, when you wanted to send a message to someone, you hired a messenger. The messenger got on his or her horse and delivered your message personally. The message was on paper, parchment, a clay tablet, or whatever physical medium was available at the time. This whole process seems wasteful now, but that’s only because you and I are sitting comfortably in the electronic age. Messages are ideas, and physical things like ink, paper, and horses have little or nothing to do with real ideas; they’re just temporary carriers for ideas (even though people used them to carry ideas for several centuries). Nevertheless, the ideas themselves are paperless, horseless, and messengerless. The neat thing about computers is that they carry ideas efficiently. They carry nothing but the ideas, a couple of photons, and a little electrical power. They do this with no muss, no fuss, and no extra physical baggage. 05_9780470371732-ch01.indd 1105_9780470371732-ch01.indd 11 7/6/11 6:57 PM7/6/11 6:57 PM www.it-ebooks.info 12 Part I: Getting Started When you start dealing efficiently with ideas, something very nice happens. Suddenly, all the overhead is gone. Instead of pushing paper and trees, you’re pushing numbers and concepts. Without the overhead, you can do things much faster, and do things that are far more complex than ever before. What You Can Do with Java It would be so nice if all this complexity was free, but unfortunately, it isn’t. Someone has to think hard and decide exactly what to ask the computer to do. After that thinking, someone has to write a set of instructions for the computer to follow. Given the current state of affairs, you can’t write these instructions in English or any other language that people speak. Science fiction is filled with stories about people who say simple things to robots and get back disastrous, unex- pected results. English and other such languages are unsuitable for communi- cation with computers for several reasons: ✓ An English sentence can be misinterpreted. “Chew one tablet three times a day until finished.” ✓ It’s difficult to weave a very complicated command in English. “Join flange A to protuberance B, making sure to connect only the outermost lip of flange A to the larger end of the protuberance B, while joining the middle and inner lips of flange A to grommet C.” ✓ An English sentence has lots of extra baggage. “Sentence has unneeded words.” ✓ English is difficult to interpret. “As part of this Publishing Agreement between John Wiley & Sons, Inc. (‘Wiley’) and the Author (‘Barry Burd’), Wiley shall pay the sum of one-thousand-two-hundred-fifty-seven dollars and sixty-three cents ($1,257.63) to the Author for partial submittal of Java For Dummies, 5th Edition (‘the Work’).” To tell a computer what to do, you have to speak a special language and write terse, unambiguous instructions in that language. A special language of this kind is called a computer programming language. A set of instructions written in such a language is called a program. When looked at as a big blob, these instructions are called software or code. Here’s what code looks like when it’s written in Java: 05_9780470371732-ch01.indd 1205_9780470371732-ch01.indd 12 7/6/11 6:57 PM7/6/11 6:57 PM www.it-ebooks.info 13 Chapter 1: All about Java class PayBarry { public static void main(String args[]) { double checkAmount = 1257.63; System.out.print(“Pay to the order of “); System.out.print(“Dr. Barry Burd “); System.out.print(“$”); System.out.println(checkAmount); } } Why You Should Use Java It’s time to celebrate! You’ve just picked up a copy of Java For Dummies, 5th Edition, and you’re reading Chapter 1. At this rate, you’ll be an expert Java programmer in no time at all, so rejoice in your eventual success by throwing a big party. To prepare for the party, I’ll bake a cake. I’m lazy, so I’ll use a ready-to-bake cake mix. Let me see . . . add water to the mix, and then add butter and eggs . . . Hey, wait! I just looked at the list of ingredients. What’s MSG? And what about propylene glycol? That’s used in antifreeze, isn’t it? I’ll change plans and make the cake from scratch. Sure, it’s a little harder. But that way, I get exactly what I want. Computer programs work the same way. You can use somebody else’s program or write your own. If you use somebody else’s program, you use whatever you get. When you write your own program, you can tailor the program especially for your needs. Writing computer code is a big, worldwide industry. Companies do it, freelance professionals do it, hobbyists do it; all kinds of people do it. A typical big com- pany has teams, departments, and divisions that write programs for the com- pany. But you can write programs for yourself or someone else, for a living or for fun. In a recent estimate, the number of lines of code written each day by pro- grammers in the United States alone exceeds the number of methane molecules on the planet Jupiter.* Take almost anything that can be done with a computer. With the right amount of time, you can write your own program to do it. (Of course, the “right amount of time” may be very long, but that’s not the point. Many interesting and useful programs can be written in hours or even minutes.) * I made up this fact all by myself. 05_9780470371732-ch01.indd 1305_9780470371732-ch01.indd 13 7/6/11 6:57 PM7/6/11 6:57 PM www.it-ebooks.info 14 Part I: Getting Started Getting Perspective: Where Java Fits In Here’s a brief history of modern computer programming: ✓ 1954–1957: FORTRAN is developed. FORTRAN was the first modern computer programming language. For scientific programming, FORTRAN is a real racehorse. Year after year, FORTRAN is a leading language among computer programmers through- out the world. ✓ 1959: COBOL is created. The letter B in COBOL stands for Business, and business is just what COBOL is all about. The language’s primary feature is the processing of one record after another, one customer after another, or one employee after another. Within a few years after its initial development, COBOL became the most widely used language for business data processing. Even today, COBOL represents a large part of the computer programming industry. ✓ 1972: Dennis Ritchie at AT&T Bell Labs develops the C programming language. The “look and feel” that you see in this book’s examples comes from the C programming language. Code written in C uses curly braces, if statements, for statements, and so on. In terms of power, you can use C to solve the same problems that you can solve by using FORTRAN, Java, or any other modern programming language. (You can write a scientific calculator program in COBOL, but doing that sort of thing would feel really strange.) The difference between one programming language and another isn’t power. The difference is ease and appropriateness of use. That’s where the Java language excels. ✓ 1986: Bjarne Stroustrup (again at AT&T Bell Labs) develops C++. Unlike its C language ancestor, the language C++ supports object- oriented programming. This represents a huge step forward. (See the next section in this chapter.) ✓ May 23, 1995: Sun Microsystems releases its first official version of the Java programming language. Java improves upon the concepts in C++. Java’s “Write Once, Run Anywhere” philosophy makes the language ideal for distributing code across the Internet. 05_9780470371732-ch01.indd 1405_9780470371732-ch01.indd 14 7/6/11 6:57 PM7/6/11 6:57 PM www.it-ebooks.info 15 Chapter 1: All about Java Additionally, Java is a great general-purpose programming language. With Java, you can write windowed applications, build and explore databases, control handheld devices, and more. Within five short years, the Java programming language had 2.5 million developers worldwide. (I know. I have a commemorative T-shirt to prove it.) ✓ November 2000: The College Board announces that, starting in the year 2003, the Computer Science Advanced Placement exams will be based on Java. Wanna know what that snot-nosed kid living down the street is learning in high school? You guessed it — Java. ✓ 2002: Microsoft introduces a new language named C#. Many of the C# language features come directly from features in Java. ✓ June 2004: Sys-Con Media* reports that the demand for Java program- mers tops the demand for C++ programmers by 50 percent. And there’s more! The demand for Java programmers beats the com- bined demand for C++ and C# programmers by 8 percent. Java program- mers are more employable than VB (Visual Basic) programmers by a whopping 190 percent. ✓ January 2010: Oracle Corporation purchases Sun Microsystems, bringing Java technology into the Oracle family of products. ✓ June 2010: eWeek ranks Java first among its “Top 10 Programming Languages to Keep You Employed.”** ✓ May 2011: Java runs on more than 1.1 billion desktop computers.*** Java runs on 3 billion mobile phones.**** Java technology provides interactive capabilities to all Blu-ray devices. Java is the most popu- lar programming language in the TIOBE Programming Community Index*****. Well, I’m impressed. * Source: java.sys-con.com/node/48507 ** Source: www.eweek.com/c/a/Application-Development/Top-10-Programming- Languages-to-Keep-You-Employed-719257/ *** Source: java.com/en/about/ **** Source: java.com/en/about/ ***** Source: www.tiobe.com/index.php/content/paperinfo/tpci/ 05_9780470371732-ch01.indd 1505_9780470371732-ch01.indd 15 7/6/11 6:57 PM7/6/11 6:57 PM www.it-ebooks.info 16 Part I: Getting Started Object-Oriented Programming (OOP) It’s three in the morning. I’m dreaming about the history course that I failed in high school. The teacher is yelling at me, “You have two days to study for the final exam, but you won’t remember to study. You’ll forget and feel guilty, guilty, guilty.” Suddenly, the phone rings. I’m awakened abruptly from my deep sleep. (Sure, I disliked dreaming about the history course, but I like being awakened even less.) At first, I drop the telephone on the floor. After fumbling to pick it up, I issue a grumpy, “Hello, who’s this?” A voice answers, “I’m a reporter from The New York Times. I’m writing an article about Java and I need to know all about the programming language in five words or less. Can you explain it?” My mind is too hazy. I can’t think. So I say anything that comes to my mind and then go back to sleep. Come morning, I hardly remember the conversation with the reporter. In fact, I don’t remember how I answered the question. Did I tell the reporter where he could put his article about Java? I put on my robe and rush to the front of my house’s driveway. As I pick up the morning paper, I glance at the front page and see the two-inch headline: Burd calls Java “A Great Object-Oriented Language” Object-oriented languages Java is object-oriented. What does that mean? Unlike languages, such as FORTRAN, which focus on giving the computer imperative “Do this/Do that” commands, object-oriented languages focus on data. Of course, object- oriented programs still tell the computer what to do. They start, however, by organizing the data, and the commands come later. Object-oriented languages are better than “Do this/Do that” languages because they organize data in a way that helps people do all kinds of things with it. To modify the data, you can build on what you already have, rather than scrap everything you’ve done and start over each time you need to do something new. Although computer programmers are generally smart people, they took awhile to figure this out. For the full history lesson, see the sidebar “The winding road from FORTRAN to Java” (but I won’t make you feel guilty if you don’t read it). 05_9780470371732-ch01.indd 1605_9780470371732-ch01.indd 16 7/6/11 6:57 PM7/6/11 6:57 PM www.it-ebooks.info 17 Chapter 1: All about Java The winding road from FORTRAN to Java In the mid-1950s, a team of people created a programming language named FORTRAN. It was a good language, but it was based on the idea that you should issue direct, imperative commands to the computer. “Do this, computer. Then do that, computer.” (Of course, the com- mands in a real FORTRAN program were much more precise than “Do this” or “Do that.”) In the years that followed, teams developed many new computer languages, and many of the languages copied the FORTRAN “Do this/Do that” model. One of the more popular “Do this/Do that” languages went by the one-letter name C. Of course, the “Do this/Do that” camp had some renegades. In languages named SIMULA and Smalltalk, programmers moved the imperative “Do this” commands into the background and concentrated on descriptions of data. In these languages, you didn’t come right out and say, “Print a list of delinquent accounts.” Instead, you began by saying, “This is what it means to be an account. An account has a name and a balance.” Then you said, “This is how you ask an account whether it’s delinquent.” Suddenly, the data became king. An account was a thing that had a name, a balance, and a way of telling you whether it was delinquent. Languages that focus first on the data are called object-oriented programming languages. These object-oriented languages make excel- lent programming tools. Here’s why: ✓ Thinking first about the data makes you a good computer programmer. ✓ You can extend and reuse the descriptions of data over and over again. When you try to teach old FORTRAN programs new tricks, however, the old programs show how brittle they are. They break. In the 1970s, object-oriented languages, such as SIMULA and Smalltalk, were buried in the computer hobbyist magazine articles. In the meantime, languages based on the old FORTRAN model were multiplying like rabbits. So in 1986, a fellow named Bjarne Stroustrup cre- ated a language named C++. The C++ language became very popular because it mixed the old C language terminology with the improved object- oriented structure. Many companies turned their backs on the old FORTRAN/C programming style and adopted C++ as their standard. But C++ had a flaw. Using C++, you could bypass all the object-oriented features and write a pro- gram by using the old FORTRAN/C programming style. When you started writing a C++ accounting program, you could take either fork in the road: ✓ You could start by issuing direct “Do this” commands to the computer, saying the mathematical equivalent of “Print a list of delinquent accounts, and make it snappy.” ✓ You could take the object-oriented approach and begin by describing what it means to be an account. Some people said that C++ offered the best of both worlds, but others argued that the first world (the world of FORTRAN and C) shouldn’t be part of modern programming. If you gave a programmer an opportunity to write code either way, the programmer would too often choose to write code the wrong way. So in 1995, James Gosling of Sun Microsystems created the language named Java. In creating Java, Gosling borrowed the look and feel of C++. But Gosling took most of the old “Do this/ Do that” features of C++ and threw them in the trash. Then he added features that made the development of objects smoother and easier. All in all, Gosling created a language whose object- oriented philosophy is pure and clean. When you program in Java, you have no choice but to work with objects. That’s the way it should be. 05_9780470371732-ch01.indd 1705_9780470371732-ch01.indd 17 7/6/11 6:57 PM7/6/11 6:57 PM www.it-ebooks.info 18 Part I: Getting Started Objects and their classes In an object-oriented language, you use objects and classes to organize your data. Imagine that you’re writing a computer program to keep track of the houses in a new condominium development (still under construction). The houses differ only slightly from one another. Each house has a distinctive siding color, an indoor paint color, a kitchen cabinet style, and so on. In your object-oriented computer program, each house is an object. But objects aren’t the whole story. Although the houses differ slightly from one another, all the houses share the same list of characteristics. For instance, each house has a characteristic known as siding color. Each house has another characteristic known as kitchen cabinet style. In your object-oriented program, you need a master list containing all the characteristics that a house object can possess. This master list of characteristics is called a class. So there you have it. Object-oriented programming is misnamed. It should really be called “programming with classes and objects.” Now notice that I put the word classes first. How dare I do this! Well, maybe I’m not so crazy. Think again about a housing development that’s under con- struction. Somewhere on the lot, in a rickety trailer parked on bare dirt, is a master list of characteristics known as a blueprint. An architect’s blueprint is like an object-oriented programmer’s class. A blueprint is a list of charac- teristics that each house will have. The blueprint says, “siding.” The actual house object has gray siding. The blueprint says, “kitchen cabinet.” The actual house object has Louis XIV kitchen cabinets. The analogy doesn’t end with lists of characteristics. Another important parallel exists between blueprints and classes. A year after you create the blueprint, you use it to build ten houses. It’s the same with classes and objects. First, the programmer writes code to describe a class. Then when the program runs, the computer creates objects from the (blueprint) class. So that’s the real relationship between classes and objects. The programmer defines a class, and from the class definition, the computer makes individual objects. What’s so good about an object-oriented language? Based on the previous section’s story about home building, imagine that you’ve already written a computer program to keep track of the building 05_9780470371732-ch01.indd 1805_9780470371732-ch01.indd 18 7/6/11 6:57 PM7/6/11 6:57 PM www.it-ebooks.info 19 Chapter 1: All about Java instructions for houses in a new development. Then, the big boss decides on a modified plan — a plan in which half the houses have three bedrooms, and the other half have four. If you use the old FORTRAN/C style of computer programming, your instruc- tions look like this: Dig a ditch for the basement. Lay concrete around the sides of the ditch. Put two-by-fours along the sides for the basement’s frame. ... This would be like an architect creating a long list of instructions instead of a blueprint. To modify the plan, you have to sort through the list to find the instructions for building bedrooms. To make things worse, the instructions could be scattered among pages 234, 394–410, 739, 10, and 2. If the builder had to decipher other peoples’ complicated instructions, the task would be ten times harder. Starting with a class, however, is like starting with a blueprint. If you decide to have both three- and four-bedroom houses, you can start with a blueprint called the house blueprint that has a ground floor and a second floor, but has no indoor walls drawn on the second floor. Then, you make two more second-floor blueprints — one for the three-bedroom house and another for the four-bedroom house. (You name these new blueprints the three-bedroom house blueprint and the four-bedroom house blueprint.) Your builder colleagues are amazed with your sense of logic and organiza- tion, but they have concerns. They pose a question. “You called one of the blueprints the ‘three-bedroom house’ blueprint. How can you do this if it’s a blueprint for a second floor and not for a whole house?” You smile knowingly and answer, “The three-bedroom house blueprint can say, ‘For info about the lower floors, see the original house blueprint.’ That way, the three-bedroom house blueprint describes a whole house. The four- bedroom house blueprint can say the same thing. With this setup, we can take advantage of all the work we already did to create the original house blueprint and save lots of money.” In the language of object-oriented programming, the three- and four-bedroom house classes are inheriting the features of the original house class. You can also say that the three- and four-bedroom house classes are extending the original house class. (See Figure 1-1.) The original house class is called the superclass of the three- and four-bedroom house classes. In that vein, the three- and four-bedroom house classes are subclasses of the original house class. Put another way, the original house class is called the parent class of three- and four-bedroom house classes. The 05_9780470371732-ch01.indd 1905_9780470371732-ch01.indd 19 7/6/11 6:57 PM7/6/11 6:57 PM www.it-ebooks.info 20 Part I: Getting Started three- and four-bedroom house classes are child classes of the original house class. (See Figure 1-1.) Needless to say, your homebuilder colleagues are jealous. A crowd of home- builders is mobbing around you to hear about your great ideas. So, at that moment, you drop one more bombshell: “By creating a class with subclasses, we can reuse the blueprint in the future. If someone comes along and wants a five-bedroom house, we can extend our original house blueprint by making a five-bedroom house blueprint. We’ll never have to spend money for an original house blueprint again.” “But,” says a colleague in the back row, “what happens if someone wants a different first-floor design? Do we trash the original house blueprint or start scribbling all over the original blueprint? That’ll cost big bucks, won’t it?” In a confident tone, you reply, “We don’t have to mess with the original house blueprint. If someone wants a Jacuzzi in his living room, we can make a new, small blueprint describing only the new living room and call this the Jacuzzi- in-living-room house blueprint. Then, this new blueprint can refer to the origi- nal house blueprint for info on the rest of the house (the part that’s not in the living room).” In the language of object-oriented programming, the Jacuzzi- in-living-room house blueprint still extends the original house blueprint. The Jacuzzi blueprint is still a subclass of the original house blueprint. In fact, all the terminology about superclass, parent class, and child class still applies. The only thing that’s new is that the Jacuzzi blueprint overrides the living room features in the original house blueprint. Figure 1-1: Terminology in object- oriented programming. house class The three-bedroom house class extends the house class, inherits the features of the house class, is a subclass of the house class, is a child class of the house class. The four-bedroom house class extends the house class, inherits the features of the house class, is a subclass of the house class, is a child class of the house class. The house class is the superclass of the three-bedroom house class, the parent class of the three-bedroom house class, the superclass of the four-bedroom house class, the parent class of the four-bedroom house class. Superclass Parent three-bedroom house class four-bedroom house class Subclass ChildSubclass ChildSubclass ChildSubclass Child 05_9780470371732-ch01.indd 2005_9780470371732-ch01.indd 20 7/6/11 6:57 PM7/6/11 6:57 PM www.it-ebooks.info 21 Chapter 1: All about Java In the days before object-oriented languages, the programming world experi- enced a crisis in software development. Programmers wrote code, then discov- ered new needs, and then had to trash their code and start from scratch. This happened over and over again because the code that the programmers were writing couldn’t be reused. Object-oriented programming changed all this for the better (and, as Burd said, Java is “A Great Object-Oriented Language”). Refining your understanding of classes and objects When you program in Java, you work constantly with classes and objects. These two ideas are really important. That’s why, in this chapter, I hit you over the head with one analogy after another about classes and objects. Close your eyes for a minute and think about what it means for something to be a chair. . . . A chair has a seat, a back, and legs. Each seat has a shape, a color, a degree of softness, and so on. These are the properties that a chair possesses. What I describe is chairness — the notion of something being a chair. In object- oriented terminology, I’m describing the Chair class. Now peek over the edge of this book’s margin and take a minute to look around your room. (If you’re not sitting in a room right now, fake it.) Several chairs are in the room, and each chair is an object. Each of these objects is an example of that ethereal thing called the Chair class. So that’s how it works — the class is the idea of chairness, and each individual chair is an object. A class isn’t quite a collection of things. Instead, a class is the idea behind a certain kind of thing. When I talk about the class of chairs in your room, I’m talking about the fact that each chair has legs, a seat, a color, and so on. The colors may be different for different chairs in the room, but that doesn’t matter. When you talk about a class of things, you’re focusing on the proper- ties that each of the things possesses. It makes sense to think of an object as being a concrete instance of a class. In fact, the official terminology is consistent with this thinking. If you write a Java program in which you define a Chair class, each actual chair (the chair that you’re sitting on, the empty chair right next to you, and so on) is called an instance of the Chair class. 05_9780470371732-ch01.indd 2105_9780470371732-ch01.indd 21 7/6/11 6:57 PM7/6/11 6:57 PM www.it-ebooks.info 22 Part I: Getting Started Here’s another way to think about a class. Imagine a table displaying all three of your bank accounts. (See Table 1-1.) Table 1-1 A Table of Accounts Account Number Type Balance 16-13154-22864-7 Checking 174.87 1011 1234 2122 0000 Credit -471.03 16-17238-13344-7 Savings 247.38 Think of the table’s column headings as a class, and think of each row of the table as an object. The table’s column headings describe the Account class. According to the table’s column headings, each account has an account number, a type, and a balance. Rephrased in the terminology of object- oriented programming, each object in the Account class (that is, each instance of the Account class) has an account number, a type, and a bal- ance. So, the bottom row of the table is an object with account number 16-17238-13344-7. This same object has type Savings and a balance of 247.38. If you opened a new account, you would have another object, and the table would grow an additional row. The new object would be an instance of the same Account class. What’s Next? This chapter is filled with general descriptions of things. A general descrip- tion is good when you’re just getting started, but you don’t really understand things until you get to know some specifics. That’s why the next several chapters deal with specifics. So please, turn the page. The next chapter can’t wait for you to read it. 05_9780470371732-ch01.indd 2205_9780470371732-ch01.indd 22 7/6/11 6:57 PM7/6/11 6:57 PM www.it-ebooks.info Chapter 2 All about Software In This Chapter ▶ Understanding the roles of the software development tools ▶ Selecting the version of Java that’s right for you ▶ Preparing to write and run Java programs The best way to get to know Java is to do Java. When you’re doing Java, you’re writing, testing, and running your own Java programs. This chapter gets you ready to do Java by describing the general software setup — the software that you must have on your computer whether you run Windows, Mac, Linux, or Joe’s Private Operating System. This chapter doesn’t describe the specific setup instructions for Windows, for a Mac, or for any other system. For setup instructions that are specific to your system, visit this book’s website. Quick-Start Instructions If you’re a seasoned veteran of computers and computing (whatever that means), and if you’re too jumpy to get detailed instructions from this book’s website, you can try installing the required software by following this sec- tion’s general instructions. The instructions work for many computers, but not for all computers. And this section provides no detailed steps, no if-this- then-do-that alternatives, and no this-works-but-you’re-better-off-doing- something-else tips. To prepare your computer for writing Java programs, follow these steps: 06_9780470371732-ch02.indd 2306_9780470371732-ch02.indd 23 7/6/11 6:57 PM7/6/11 6:57 PM www.it-ebooks.info 24 Part I: Getting Started ✓ Visit Java.com. Follow the instructions at http://java.com/en to download and install Java. ✓ Optionally, visit java.sun.com/javase/downloads/. Follow the instructions at that website to download and install the Java SE documentation (also known as the Javadoc pages or the Java SE API Docs). ✓ Visit Eclipse.org. Follow the instructions at http://eclipse.org/downloads/ to download and install Eclipse. Eclipse’s download page offers several different packages, including Eclipse Classic, Eclipse for Java EE, Eclipse for JavaScript, and others. To run this book’s examples, you need a relatively small Eclipse package — the Eclipse IDE for Java Developers. ✓ Test your installed software. • Launch Eclipse. • In Eclipse, create a new Java project. • Within the Java project, create a new Java class named Displayer. • Edit the new Displayer.java file by typing the code from Listing 3-1 (the first code listing in Chapter 3). Type the code in Eclipse’s editor pane. • Run Displayer.java and check to make sure that the run’s output reads You’ll love Java!. That’s it! But remember, not everyone (computer geek or not) can follow these skeletal instructions flawlessly. So you have several alternatives: ✓ Visit this book’s website. Do not pass “go.” Do not try this section’s quick-start instructions. Follow the more detailed instructions that you find at www.allmycode.com/ JavaForDummies. ✓ Try this section’s quick-start instructions. You can’t hurt anything by trying. If you accidentally install the wrong software, you can probably leave the wrong software on your com- puter. (You don’t have to uninstall it.) If you’re not sure whether you’ve installed the software correctly, you can always fall back on my web- site’s detailed instructions. ✓ E-mail your questions to me at JavaForDummies@allmycode.com. I like getting e-mail from readers. 06_9780470371732-ch02.indd 2406_9780470371732-ch02.indd 24 7/6/11 6:57 PM7/6/11 6:57 PM www.it-ebooks.info 25 Chapter 2: All about Software What You Install on Your Computer I once met a tool and die maker. He used tools to make tools (and dies). I was happy to meet him because I knew that, one day, I’d make an analogy between computer programmers and tool and die makers. A computer programmer uses existing programs as tools to create new pro- grams. The existing programs and new programs might perform very differ- ent kinds of tasks. For example, a Java program (a program that you create) might keep track of a business’s customers. To create that customer-tracking program, you might use an existing program that looks for errors in your Java code. This general-purpose error-finding program can find errors in any kind of Java code — customer-tracking code, weather-predicting code, gaming code, or the code for an app on your mobile phone. So how many tools do you need for creating Java programs? As a novice, you need three tools. ✓ You need a compiler. A compiler takes the Java code that you write and turns that code into something that can run on your computer. ✓ You need a Java virtual machine (JVM). A Java virtual machine runs your code (and other peoples’ Java code) on your computer. ✓ You need an integrated development environment (IDE). An integrated development environment helps you manage your Java code and provides convenient ways for you to write, compile, and run your code. The World Wide Web has free, downloadable versions of each of these tools. For example, the quick-start instructions near the beginning of this chapter advise you to visit Java.com and Eclipse.org. By clicking a button on a Java. com page, you install a Java virtual machine on your computer. At Eclipse. org, you download the Eclipse integrated development environment, which comes with its own built-in Java compiler. (You get two of the three tools in one download. Not bad!) The rest of this chapter describes compilers, JVMs, and IDEs. The rest of this chapter provides background information about software you need on your computer. But the chapter contains absolutely no detailed instructions to help you install the software. For detailed instructions, visit this book’s website. 06_9780470371732-ch02.indd 2506_9780470371732-ch02.indd 25 7/6/11 6:57 PM7/6/11 6:57 PM www.it-ebooks.info 26 Part I: Getting Started What is a compiler? “A compiler takes the Java code that you write, and turns that code into something that can run on your computer.” –Barry Burd, Java For Dummies, 5th Edition You’re a human being. (Sure, every rule has exceptions. But if you’re reading this book, you’re probably human.) Anyway, humans can write and compre- hend the code in Listing 2-1. Listing 2-1: Looking for a Vacant Room // This is part of a Java program // (not a complete Java program). roomNum = 1; while (roomNum < 100) { if (guests[roomNum] == 0) { out.println(“Room “ + roomNum + “ is available.”); exit(0); } else { roomNum++; } } out.println(“No vacancy”); The Java code in Listing 2-1 checks for vacancies in a small hotel (a hotel with room numbers 1 to 99). You can’t run the code in Listing 2-1 without adding several additional lines. But here in Chapter 2, those additional lines aren’t important. What’s important is that, by staring at the code, squinting a bit, and looking past all the code’s strange punctuation, you can see what the code is trying to do: Set the room number to 1. As long as the room number is less than 100, Check the number of guests in the room. If the number of guests in the room is 0, then report that the room is available, and stop. Otherwise, prepare to check the next room by adding 1 to the room number. If you get to the non-existent room number 100, then report that there are no vacancies. If you don’t see the similarities between Listing 2-1 and its English equivalent, don’t worry. You’re reading Java For Dummies, 5th Edition, and like most 06_9780470371732-ch02.indd 2606_9780470371732-ch02.indd 26 7/6/11 6:57 PM7/6/11 6:57 PM www.it-ebooks.info 27 Chapter 2: All about Software human beings, you can learn to read and write the code in Listing 2-1. The code in Listing 2-1 is called Java source code. So here’s the catch: Computers aren’t human beings. Computers don’t nor- mally follow instructions like the instructions in Listing 2-1. That is, comput- ers don’t follow Java source code instructions. Instead, computers follow cryptic instructions like the ones in Listing 2-2: Listing 2-2: The Instructions of Listing 2-1 Translated into Java Bytecode aload_0 iconst_1 putfield Hotel/roomNum I goto 32 aload_0 getfield Hotel/guests [I aload_0 getfield Hotel/roomNum I iaload ifne 26 getstatic java/lang/System/out Ljava/io/PrintStream; new java/lang/StringBuilder dup ldc “Room “ invokespecial java/lang/StringBuilder/(Ljava/lang/String;)V aload_0 getfield Hotel/roomNum I invokevirtual java/lang/StringBuilder/append(I)Ljava/lang/StringBuilder; ldc ” is available.” invokevirtual java/lang/StringBuilder/append(Ljava/lang/String;)Ljava/lang/StringBuilder; invokevirtual java/lang/StringBuilder/toString()Ljava/lang/String; invokevirtual java/io/PrintStream/println(Ljava/lang/String;)V iconst_0 invokestatic java/lang/System/exit(I)V goto 32 aload_0 dup getfield Hotel/roomNum I iconst_1 iadd putfield Hotel/roomNum I aload_0 getfield Hotel/roomNum I bipush 100 if_icmplt 5 getstatic java/lang/System/out Ljava/io/PrintStream; ldc ”No vacancy” invokevirtual java/io/PrintStream/println(Ljava/lang/String;)V return 06_9780470371732-ch02.indd 2706_9780470371732-ch02.indd 27 7/6/11 6:57 PM7/6/11 6:57 PM www.it-ebooks.info 28 Part I: Getting Started The instructions in Listing 2-2 aren’t Java source code instructions. They’re Java bytecode instructions. When you write a Java program, you write source code instructions (like the instructions in Listing 2-1). After writing the source code, you run a program (that is, you apply a tool) to your source code. The program is a compiler. The compiler translates your source code instructions into Java bytecode instructions. In other words, the compiler takes code that you can write and understand (like the code in Listing 2-1) and translates your code into code that a computer can execute (like the code in Listing 2-2). You might put your source code in a file named Hotel.java. If so, the com- piler probably puts the Java bytecode in another file named Hotel.class. Normally, you don’t bother looking at the bytecode in the Hotel.class file. In fact, the compiler doesn’t encode the Hotel.class file as ordinary text, so you can’t examine the bytecode with an ordinary editor. If you try to open Hotel.class with Notepad, TextEdit, KWrite, or even Microsoft Word, you’ll see nothing but dots, squiggles, and other gobbledygook. To create Listing 2-2, I had to apply yet another tool to my Hotel.class file. That tool displays a text-like version of a Java bytecode file. I used Ando Saabas’s Java Bytecode Editor (www.cs.ioc.ee/~ando/jbe). No one (except for a few crazy developers in some isolated labs in faraway places) writes Java bytecode. You run software (a compiler) to create Java bytecode. The only reason to look at Listing 2-2 is to understand what a hard worker your computer is. What is a Java virtual machine? “A Java virtual machine runs your code (and other peoples’ Java code) on your computer.” –Barry Burd, Java For Dummies, 5th Edition In the earlier “What is a compiler?” section, I make a big fuss about comput- ers following instructions like the ones in Listing 2-2. As fusses go, it’s a very nice fuss. But if you don’t read every fussy word, you may be misguided. The exact wording is “. . . computers follow cryptic instructions like the ones in Listing 2-2.” The instructions in Listing 2-2 are a lot like instructions that a computer can execute, but generally, computers don’t execute Java bytecode instructions. Instead, each kind of computer processor has its own set of executable instructions, and each computer operating system uses the processor’s instructions in a slightly different way. 06_9780470371732-ch02.indd 2806_9780470371732-ch02.indd 28 7/6/11 6:57 PM7/6/11 6:57 PM www.it-ebooks.info 29 Chapter 2: All about Software Here’s a hypothetical situation: Imagine that you run the Linux operating system on a computer that has an old Pentium processor. Your friend runs Linux on a computer with a different kind of processor — a PowerPC proces- sor. (In the 1990s, Intel Corporation made Pentium processors, and IBM made PowerPC processors.) Listing 2-3 contains a set of instructions to display Hello world! on the computer screen.* The instructions work on a Pentium processor running the Linux operating system. Listing 2-3: A Simple Program for a Pentium Processor .data msg: .ascii “Hello, world!\n” len = . - msg .text .global _start _start: movl $len,%edx movl $msg,%ecx movl $1,%ebx movl $4,%eax int $0x80 movl $0,%ebx movl $1,%eax int $0x80 Listing 2-4 contains another set of instructions to display Hello world! on the screen.** The instructions in Listing 2-4 work on a PowerPC processor running Linux. * I paraphrase these Intel instructions from Konstantin Boldyshev’s Linux Assembly HOWTO (tldp.org/HOWTO/Assembly-HOWTO/hello.html). ** I paraphrase the PowerPC code from Hollis Blanchard’s PowerPC Assembly page (www.ibm.com/developerworks/library/l-ppc). Hollis also reviewed and critiqued this “What is a Java virtual machine?” section for me. Thank you, Hollis. 06_9780470371732-ch02.indd 2906_9780470371732-ch02.indd 29 7/6/11 6:57 PM7/6/11 6:57 PM www.it-ebooks.info 30 Part I: Getting Started Listing 2-4: A Simple Program for a PowerPC Processor .data msg: .string “Hello, world!\n” len = . - msg .text .global _start _start: li 0,4 li 3,1 lis 4,msg@ha addi 4,4,msg@l li 5,len sc li 0,1 li 3,1 sc The instructions in Listing 2-3 run smoothly on a Pentium processor. But these instructions mean nothing to a PowerPC processor. Likewise, the instruc- tions in Listing 2-4 run nicely on a PowerPC, but these same instructions are complete gibberish to a computer with a Pentium processor. So your friend’s PowerPC software might not be available on your computer. And your Intel computer’s software might not run at all on your friend’s computer. Now go to your cousin’s house. Your cousin’s computer has a Pentium pro- cessor (just like yours), but your cousin’s computer runs Windows instead of Linux. What does your cousin’s computer do when you feed it the Pentium code in Listing 2-3? It screams, “Not a valid Win32 application” or “Windows can’t open this file.” What a mess! Java bytecode creates order from all this chaos. Java bytecode is something like the code in Listings 2-3 and 2-4, but Java bytecode isn’t specific to one kind of processor or to one operating system. Instead, a set of Java bytecode instructions runs on any computer. If you write a Java program, and compile that Java program into bytecode, then your computer can run the bytecode, your friend’s computer can run the bytecode, your grandmother’s supercom- puter can run the bytecode, and with any luck, your tiny, little cellphone can run the bytecode. 06_9780470371732-ch02.indd 3006_9780470371732-ch02.indd 30 7/6/11 6:57 PM7/6/11 6:57 PM www.it-ebooks.info 31 Chapter 2: All about Software For a look at some Java bytecode, see Listing 2-2. But remember, you never have to write or decipher Java bytecode. Writing bytecode is the compiler’s job. Deciphering bytecode is the Java virtual machine’s job. With Java, you can take a bytecode file that you created with a Windows com- puter, copy the bytecode to who-knows-what kind of computer, and then run the bytecode with no trouble at all. That’s one of the many reasons why Java has become popular so quickly. This outstanding feature, which gives you the ability to run code on many different kinds of computers, is called portability. What makes Java bytecode so versatile? This fantastic universality enjoyed by Java bytecode programs comes from the Java virtual machine. The Java virtual machine is one of those three tools that you must have on your computer. Imagine that you’re the Windows representative to the United Nations Security Council. (See Figure 2-1.) The Macintosh representative is seated to your right, and the Linux representative is on your left. (Naturally, you don’t get along with either of these people. You’re always cordial to one another, but you’re never sincere. What do you expect? It’s politics!) The distinguished representative from Java is at the podium. The Java represen- tative is speaking in bytecode, and neither you nor your fellow ambassadors (Mac and Linux) understand a word of Java bytecode. Figure 2-1: An imaginary meeting of the UN Security Council. compiler Java virtual machines Mac code Windows code Linux code bytecode Java source code 06_9780470371732-ch02.indd 3106_9780470371732-ch02.indd 31 7/6/11 6:57 PM7/6/11 6:57 PM www.it-ebooks.info 32 Part I: Getting Started What on earth is Java 2? If you poke around the web looking for Java tools, you find things with all kinds of strange names. You find the Java Development Kit, the Software Development Kit, the Java Runtime Environment, and other confusing names. ✓ The names Java Development Kit (JDK) and Software Development Kit (SDK) stand for different versions of the same toolset — a toolset whose key component is a Java compiler. ✓ The name Java Runtime Environment (JRE) stands for a toolset whose key component is a Java virtual machine. It’s not bad to have the JRE on your com- puter, but to write new Java programs, you need something more powerful than the JRE. You need the JDK. The numbering of Java versions is also confus- ing. Instead of “Java 1,” “Java 2,” and “Java 3,” the numbering of Java versions winds through an obstacle course. Here’s how it works: ✓ Java JDK 1.0 (1996) ✓ Java JDK 1.1 (1997) ✓ Java 2 SDK, 1.2 (1998) In 1998, Sun Microsystems adds an additional “2” and changes “JDK” (Java Development Kit) to “SDK” (Software Development Kit) ✓ Java 2 SDK, 1.3 (2000) ✓ Java 2 SDK, 1.4 (2002) ✓ Java 2 JDK, 5.0 (2004) In 2004, Sun reverts to ”JDK” and partially gives up on the silly 1.x numbering scheme. I say ”partially” because, in addition to being ”Java 2”, the JDK has two version numbers. The product version number is 5.0, and the developer version number is 1.5.0. So when you refer to the JDK, you can call it “ver- sion 5.0” or “version 1.5.0” depending on the kinds of people you want to impress. ✓ Java 6 JDK (2006) In 2006, Sun drops the unnecessary “2” and gets rid of the “.0,” too. Of course, the old developer version numbering never dies. In addition to being “Java 6.” this release also has the name “Java 1.6.0.” ✓ Java 6 Update 1 (2007) Sun continues with updates 2, 3, 4, and so on. Early in 2010, Oracle Corporation pur- chases Sun Microsystems. Oracle releases updates 19, 20, 21 (and so on) until . . . ✓ Java 7 (2011) Undoubtedly, updates 1, 2, 3, and others follow the initial Java 7 release. Most of the programs in this book run only with Java 5.0, or later. They do not run with any ver- sion earlier than Java 5.0. Particularly, they don’t run with Java 1.4 or Java 1.4.2. A few of this book’s examples don’t run with Java 6 or lower. But don’t worry too much about Java version numbers. Java 5.0 or 6 is better than no Java at all. You can learn a lot about Java with- out having the latest Java version. But each of you has an interpreter. Your interpreter translates from byte- code to Windows while the Java representative speaks. Another interpreter translates from bytecode to Macintosh-ese. And a third interpreter translates bytecode into Linux-speak. 06_9780470371732-ch02.indd 3206_9780470371732-ch02.indd 32 7/6/11 6:57 PM7/6/11 6:57 PM www.it-ebooks.info 33 Chapter 2: All about Software Think of your interpreter as a virtual ambassador. The interpreter doesn’t really represent your country, but the interpreter performs one of the impor- tant tasks that a real ambassador performs. The interpreter listens to byte- code on your behalf. The interpreter does what you would do if your native language was Java bytecode. The interpreter pretends to be the Windows ambassador, and sits through the boring bytecode speech, taking in every word, and processing each word in some way or other. You have an interpreter — a virtual ambassador. In the same way, a Windows computer runs its own bytecode interpreting software. That software is the Java virtual machine. A Java virtual machine is a proxy, an errand boy, a go-between. The JVM serves as an interpreter between Java’s run-anywhere bytecode and your computer’s own system. While it runs, the JVM walks your computer through the execution of bytecode instructions. The JVM examines your bytecode, bit by bit, and carries out the instructions described in the bytecode. The JVM interprets bytecode for your Windows system, your Mac, or your Linux box, or for whatever kind of computer you’re using. That’s a good thing. It’s what makes Java programs more portable than programs in any other language. Developing Software “All this has happened before, and all this will happen again.” –Battlestar Galactica, 2003-2009, NBC Universal When you create a Java program, you repeat the same steps over and over again. Figure 2-2 illustrates the cycle. Figure 2-2: Developing a Java program. You write code You compile the code You modify the code You run the code 06_9780470371732-ch02.indd 3306_9780470371732-ch02.indd 33 7/6/11 6:57 PM7/6/11 6:57 PM www.it-ebooks.info 34 Part I: Getting Started First, you write a program. After writing the first draft, you repeatedly com- pile, run, and modify the program. With a little experience, the compile and run steps become very easy. In many cases, one mouse click starts the compilation or the run. However, writing the first draft and modifying the code are not one-click tasks. Developing code requires time and concentration. Never be discouraged when the first draft of your code doesn’t work. For that matter, never be discouraged when the twenty-fifth draft of your code doesn’t work. Rewriting code is one of the most important things you can do (aside from ensuring world peace). For detailed instructions on compiling and running Java programs, visit this book’s website. When people talk about writing programs, they use the wording in Figure 2-2. They say, “You compile the code” and “You run the code.” But the “you” isn’t always accurate, and the “code” differs slightly from one part of the cycle to the next. Figure 2-3 describes the cycle from Figure 2-2 in a bit more detail. For most people’s needs, Figure 2-3 contains too much information. If I click a Run icon, I don’t have to remember that the computer runs code on my behalf. And for all I care, the computer can run my original Java code or some bytecode knock-off of my original Java code. The details in Figure 2-3 aren’t important. The only use for Figure 2-3 is to help you if the loose wording in Figure 2-2 confuses you. If Figure 2-2 doesn’t confuse you, then ignore Figure 2-3. Figure 2-3: Who does what with which code? You write Java source code Upon your command, the computer compiles the source code (creating bytecode) You modify the Java source code Upon your command, the computer runs the bytecode 06_9780470371732-ch02.indd 3406_9780470371732-ch02.indd 34 7/6/11 6:57 PM7/6/11 6:57 PM www.it-ebooks.info 35 Chapter 2: All about Software What is an Integrated Development Environment? “An integrated development environment helps you manage your Java code and provides convenient ways for you to write, compile, and run your code.” –Barry Burd, Java For Dummies, 5th Edition In the olden days, writing and running a Java program involved opening several windows — a window for typing the program, another window for running the program, and maybe a third window to keep track of all the code that you’ve written. (See Figure 2-4.) An integrated development environment seamlessly combines all this func- tionality into one well-organized application. (See Figure 2-5.) Java has its share of integrated development environments. Some of the more popular products include Eclipse, IntelliJ IDEA, and NetBeans. Some fancy environments even have drag-and-drop components so that you can design your graphical interface visually. (See Figure 2-6.) Figure 2-4: Developing code without an integrated development environment. 06_9780470371732-ch02.indd 3506_9780470371732-ch02.indd 35 7/6/11 6:57 PM7/6/11 6:57 PM www.it-ebooks.info 36 Part I: Getting Started Figure 2-5: Developing code with the Eclipse integrated development environment. Figure 2-6: Using the drag-and- drop Swing GUI Builder in the NetBeans IDE. 06_9780470371732-ch02.indd 3606_9780470371732-ch02.indd 36 7/6/11 6:57 PM7/6/11 6:57 PM www.it-ebooks.info 37 Chapter 2: All about Software To run a program, you might click a toolbar button or choose Run from a menu. To compile a program, you might not have to do anything at all. (You might not even have to issue a command. Some IDEs compile your code automatically while you type it.) For help with installing and using an integrated development environment, see this book’s website. 06_9780470371732-ch02.indd 3706_9780470371732-ch02.indd 37 7/6/11 6:57 PM7/6/11 6:57 PM www.it-ebooks.info 38 Part I: Getting Started 06_9780470371732-ch02.indd 3806_9780470371732-ch02.indd 38 7/6/11 6:57 PM7/6/11 6:57 PM www.it-ebooks.info Chapter 3 Using the Basic Building Blocks In This Chapter ▶ Speaking the Java language: the API and the Language Specification ▶ Understanding the parts of a simple program ▶ Documenting your code “ , . (All great ideas are simple.)” –Leo Tolstoy The quotation applies to all kinds of things — things like life, love, and computer programming. That’s why this chapter takes a multilayered approach. In this chapter, you get your first details about Java programming. And in discovering details, you’ll see the simplicities. Speaking the Java Language If you try to picture in your mind the entire English language, what do you see? Maybe you see words, words, words. (That’s what Hamlet saw.) Looking at the language under a microscope, you see one word after another. The bunch-of-words image is fine, but if you step back a bit, you may see two other things: ✓ The language’s grammar ✓ Thousands of expressions, sayings, idioms, and historical names The first category (the grammar) includes rules like, “The verb agrees with the noun in number and person.” The second category (expressions, say- ings, and stuff) includes knowledge like, “Julius Caesar was a famous Roman emperor, so don’t name your son Julius Caesar, unless you want him to get beat up every day after school.” 07_9780470371732-ch03.indd 3907_9780470371732-ch03.indd 39 7/6/11 6:55 PM7/6/11 6:55 PM www.it-ebooks.info 40 Part I: Getting Started The Java programming language has all the aspects of a spoken language like English. Java has words, grammar, commonly used names, stylistic idioms, and other such things. The grammar and the common names The people at Sun Microsystems who created Java thought of Java as having two parts. Just as English has its grammar and commonly used names, the Java programming language has its specification (its grammar) and its Application Programming Interface (its commonly used names). Whenever I write Java programs, I keep two important pieces of documentation — one for each part of the language — on my desk: ✓ The Java Language Specification: This includes rules like, “Always put an open parenthesis after the word for” and “Use an asterisk to multiply two numbers.” ✓ The Application Programming Interface: Java’s Application Programming Interface (API) contains thousands of tools that were added to Java after the language’s grammar was defined. These tools range from the com- monplace to the exotic. For instance, the tools include a routine named pow that can raise 5 to the 10th power for you. A more razzle-dazzle tool (named JFrame) displays a window on your computer’s screen. Other tools listen for the user’s button clicks, query databases, and do all kinds of useful things. You can download the Language Specification, the API documents, and all the other Java documentation (or view the documents online) by poking around at java.sun.com/javase/reference/api.jsp. But watch out! This web page is a moving target. By the time you read this book, the links in this paragraph will probably be out of date. The safest thing to do is to start at Java.Sun.com, and then look for links to things like “Java SE” (short for “Java Standard Edition”) and “reference” or “documentation.” The first part of Java, the Language Specification, is relatively small. That doesn’t mean you won’t take plenty of time finding out how to use the rules in the Language Specification. Other programming languages, however, have double, triple, or ten times the number of rules. The second part of Java — the API — can be intimidating because it’s so large. The API contains nearly 4,000 tools and keeps growing with each new Java language release. Pretty scary, eh? Well, the good news is that you don’t have to memorize anything in the API. Nothing. None of it. You can look up the stuff you need to use in the documentation and ignore the stuff you don’t need. What you use often, you’ll remember. What you don’t use often, you’ll forget (like any other programmer). 07_9780470371732-ch03.indd 4007_9780470371732-ch03.indd 40 7/6/11 6:55 PM7/6/11 6:55 PM www.it-ebooks.info 41 Chapter 3: Using the Basic Building Blocks No one knows all there is to know about the Java API. If you’re a Java program- mer who frequently writes programs that open new windows, you know how to use the API JFrame class. If you seldom write programs that open win- dows, the first few times you need to create a window, you can look up the JFrame class in the API documentation. My guess is that if you took a typical Java programmer and kept that programmer from looking up anything in the API documentation, the programmer would be able to use less than 2 percent of all the tools in the Java API. You may love the For Dummies style, but unfortunately, Java’s official API documentation isn’t written that way. The API documentation is both concise and precise. For some help deciphering the API documentation’s language and style, see this book’s website. In a way, nothing about the Java API is special. Whenever you write a Java program — even the smallest, simplest Java program — you create a class that’s on par with any of the classes defined in the official Java API. The API is just a set of classes and other tools that were created by ordinary programmers who happen to participate in the official Java Community Process (JCP) and in the OpenJDK Project. Unlike the tools that you create, the tools in the API are distributed with every version of Java. (I’m assuming that you, the reader, are not a participant in the Java Community Process or the OpenJDK Project. But, with a fine book like Java For Dummies, 5th Edition, one never knows.) If you’re interested in the JCP’s activities, visit www.jcp.org. If you’re inter- ested in the OpenJDK Project, visit openjdk.java.net. The folks at the JCP don’t keep the Java programs in the official Java API a secret. If you want, you can look at all these programs. When you install Java on your computer, the installation puts a file named src.zip on your hard drive. You can open src.zip with your favorite unzipping program. There, before your eyes, is all the Java API code. The words in a Java program A hard-core Javateer will say that the Java programming language has two different kinds of words: keywords and identifiers. This is true. But the bare truth, without any other explanation, is sometimes misleading. So I recom- mend dressing up the truth a bit and thinking in terms of three kinds of words: keywords, identifiers that ordinary programmers like you and I create, and identifiers from the API. The differences among these three kinds of words are similar to the dif- ferences among words in the English language. In the sentence “Sam is a person,” the word person is like a Java keyword. No matter who uses the word person, the word always means roughly the same thing. (Sure, you can think of bizarre exceptions in English usage, but please don’t.) 07_9780470371732-ch03.indd 4107_9780470371732-ch03.indd 41 7/6/11 6:55 PM7/6/11 6:55 PM www.it-ebooks.info 42 Part I: Getting Started The word Sam is like a Java identifier because Sam is a name for a particu- lar person. Words like Sam, Dinswald, and McGillimaroo aren’t prepacked with meaning in the English language. These words apply to different people depending on the context and become names when parents pick one for their newborn kid. Now consider the sentence “Julius Caesar is a person.” If you utter this sen- tence, you’re probably talking about the fellow who ruled Rome until the Ides of March. Although the name Julius Caesar isn’t hard-wired into the English language, almost everyone uses the name to refer to the same person. If English were a programming language, the name Julius Caesar would be an API identifier. So here’s how I, in my mind, divide the words in a Java program into categories: ✓ Keywords: A keyword is a word that has its own special meaning in the Java programming language, and that meaning doesn’t change from one program to another. Examples of keywords in Java include if, else, and do. The JCP committee members, who have the final say on what consti- tutes a Java program, have chosen all the Java keywords. If you think about the two parts of Java, which I discuss earlier in the “The grammar and the common names” section, the Java keywords belong solidly to the Language Specification. ✓ Identifiers: An identifier is a name for something. The identifier’s mean- ing can change from one program to another, but some identifiers’ meanings tend to change more. • Identifiers created by you and me: As a Java programmer (yes, even as a novice Java programmer), you create new names for classes and other things that you describe in your programs. Of course, you may name something Prime, and the guy writing code two cubicles down the hall can name something else Prime. That’s okay because Java doesn’t have a predetermined meaning for Prime. In your program, you can make Prime stand for the Federal Reserve’s prime rate. And the guy down the hall can make Prime stand for the “bread, roll, preserves, and prime rib.” A con- flict doesn’t arise, because you and your co-worker are writing two different Java programs. • Identifiers from the API: The JCP members have created names for many things and thrown almost 40,000 of these names into the Java API. The API comes with each version of Java, so these names are available to anyone who writes a Java program. Examples of such names are String, Integer, JWindow, JButton, JTextField, and File. 07_9780470371732-ch03.indd 4207_9780470371732-ch03.indd 42 7/6/11 6:55 PM7/6/11 6:55 PM www.it-ebooks.info 43 Chapter 3: Using the Basic Building Blocks Strictly speaking, the meanings of the identifiers in the Java API aren’t cast in stone. Although you can make up your own meanings for JButton or JWindow, this isn’t a good idea. If you did, you would confuse the dickens out of other programmers, who are used to the standard API meanings for these familiar identifier names. But even worse, when your code assigns a new meaning to an identifier like JButton, you lose any computational power that was created for the identifier in the API code. The programmers of Sun Microsystems, the Java Community Process, and the OpenJDK Project did all the work writing Java code to handle buttons. If you assign your own meaning to JButton, you’re turning your back on all the progress made in creating the API. To see the list of Java keywords, visit this book’s website. Checking Out Java Code for the First Time The first time you look at somebody else’s Java program, you tend to feel a bit queasy. The realization that you don’t understand something (or many things) in the code can make you nervous. I’ve written hundreds (maybe thousands) of Java programs, but I still feel insecure when I start reading someone else’s code. The truth is that finding out about a Java program is a bootstrapping experi- ence. First, you gawk in awe of the program. Then you run the program to see what it does. Then you stare at the program for a while or read someone’s explanation of the program and its parts. Then you gawk a little more and run the program again. Eventually, you come to terms with the program. (Don’t believe the wise guys who say they never go through these steps. Even the experienced programmers approach a new project slowly and carefully.) In Listing 3-1, you get a blast of Java code. (Like all novice programmers, you’re expected to gawk humbly at the code.) Hidden in the code, I’ve placed some important ideas, which I explain in detail in the next section. These ideas include the use of classes, methods, and Java statements. Listing 3-1: The Simplest Java Program class Displayer { public static void main(String args[]) { System.out.println(“You’ll love Java!”); } } 07_9780470371732-ch03.indd 4307_9780470371732-ch03.indd 43 7/6/11 6:55 PM7/6/11 6:55 PM www.it-ebooks.info 44 Part I: Getting Started When you run the program from Listing 3-1, the computer displays You’ll love Java! (Figure 3-1 shows the output of the Displayer program when you use the Eclipse IDE.) Now, I admit that writing and running a Java pro- gram is a lot of work just to get You’ll love Java! to appear on some- body’s computer screen, but every endeavor has to start somewhere. Figure 3-1: I use Eclipse to run the program in Listing 3-1. To learn how to run the code in Listing 3-1, visit this book’s website. In the following section, you do more than just admire the program’s output. After you read the following section, you actually understand what makes the program in Listing 3-1 work. Understanding a Simple Java Program This section presents, explains, analyzes, dissects, and otherwise demystifies the Java program shown previously in Listing 3-1. The Java class Because Java is an object-oriented programming language, your primary goal is to describe classes and objects. (If you’re not convinced about this, read the sections on object-oriented programming in Chapter 1.) On those special days when I’m feeling sentimental, I tell people that Java is more pure in its object-orientation than most other so-called object-oriented languages. I say this because, in Java, you can’t do anything until you create a class of some kind. It’s like being on Jeopardy! hearing Alex Trebek say, “Let’s go to a commercial” and then interrupting him by saying, “I’m sorry, Alex. You can’t issue an instruction without putting your instruction inside a class.” In Java, the entire program is a class. I wrote the program, so I get to make up a name for my new class. I chose the name Displayer because the program displays a line of text on the computer screen. That’s why the code in Listing 3-1 starts with class Displayer. (See Figure 3-2.) 07_9780470371732-ch03.indd 4407_9780470371732-ch03.indd 44 7/6/11 6:55 PM7/6/11 6:55 PM www.it-ebooks.info 45 Chapter 3: Using the Basic Building Blocks Figure 3-2: A Java program is a class. The entire program The class Displayer class Displayer { public static void main(String args[]) { System.out.println("You'll love Java!"); } } The first word in Listing 3-1, class, is a Java keyword. (See the section “The words in a Java program,” earlier in this chapter.) No matter who writes a Java program, class is always used the same way. On the other hand, Displayer in Listing 3-1 is an identifier. I made up the word Displayer while I was writing this chapter. Displayer is the name of a particular class — the class that I’m creating by writing this program. tHE jAVA PROGRAMMING LANGUAGE IS cASe-sEnsITiVE. iF YOU CHANGE A lowercase LETTER IN A WORD TO AN UPPERCASE LETTER, YOU CHANGE THE WORD’S MEANING. cHANGING CASE CAN MAKE THE ENTIRE WORD GO FROM BEING MEANINGFUL TO BEING MEANINGLESS. iN THE FIRST LINE OF lISTING 3-1, YOU CAN’T REPLACE class WITH Class. iF YOU DO, THE WHOLE PROGRAM STOPS WORKING. The same holds true, to some extent, for the name of a file containing a particular class. For example, the name of the class in Listing 3-1 is Displayer, starting with an uppercase letter D. So it’s a good idea to save the code of Listing 3-1 in a file named Displayer.java, starting with an uppercase letter D. Normally, if you define a class named DogAndPony, the class’s Java code goes in a file named DogAndPony.java, spelled and capitalized exactly the same way as the class name is spelled and capitalized. In fact, this file-naming con- vention is mandatory for many examples in this book, starting with some of the examples in Chapter 7. The Java method You’re working as an auto mechanic in an upscale garage. Your boss, who’s always in a hurry and has a habit of running words together, says, “fixThe- Alternator on that junkyOldFord.” Mentally, you run through a list of tasks. 07_9780470371732-ch03.indd 4507_9780470371732-ch03.indd 45 7/6/11 6:55 PM7/6/11 6:55 PM www.it-ebooks.info 46 Part I: Getting Started “Drive the car into the bay, lift the hood, get a wrench, loosen the alternator belt,” and so on. Three things are going on here: ✓ You have a name for the thing you’re supposed to do. The name is fixTheAlternator. ✓ In your mind, you have a list of tasks associated with the name fixTheAlternator. The list includes “Drive the car into the bay, lift the hood, get a wrench, loosen the alternator belt,” and so on. ✓ You have a grumpy boss who’s telling you to do all this work. Your boss gets you working by saying, “fixTheAlternator.” In other words, your boss gets you working by saying the name of the thing you’re supposed to do. In this scenario, using the word method wouldn’t be a big stretch. You have a method for doing something with an alternator. Your boss calls that method into action, and you respond by doing all the things in the list of instructions that you associate with the method. If you believe all that (and I hope you do), then you’re ready to read about Java methods. In Java, a method is a list of things to do. Every method has a name, and you tell the computer to do the things in the list by using the method’s name in your program. I’ve never written a program to get a robot to fix an alternator. But, if I did, the program might include a fixTheAlternator method. The list of instruc- tions in my fixTheAlternator method would look something like the text in Listing 3-2. Don’t scrutinize Listings 3-2 and 3-3 too carefully. All the code in Listings 3-2 and 3-3 is fake! I made up this code so that it looks a lot like real Java code, but it’s not real. What’s more important, the code in Listings 3-2 and 3-3 isn’t meant to illustrate all the rules about Java. So, if you have a grain of salt handy, take it with Listings 3-2 and 3-3. Listing 3-2: A Method Declaration void fixTheAlternator() { driveInto(car, bay); lift(hood); get(wrench); loosen(alternatorBelt); ... } 07_9780470371732-ch03.indd 4607_9780470371732-ch03.indd 46 7/6/11 6:55 PM7/6/11 6:55 PM www.it-ebooks.info 47 Chapter 3: Using the Basic Building Blocks Somewhere else in my Java code (somewhere outside of Listing 3-2), I need an instruction to call my fixTheAlternator method into action. The instruction to call the fixTheAlternator method into action may look like the line in Listing 3-3. Listing 3-3: A Method Call fixTheAlternator(junkyOldFord); Now that you have a basic understanding of what a method is and how it works, you can dig a little deeper into some useful terminology: ✓ If I’m being lazy, I refer to the code in Listing 3-2 as a method. If I’m not being lazy, I refer to this code as a method declaration. ✓ The method declaration in Listing 3-2 has two parts. The first line (the part with fixTheAlternator in it, up to but not including the open curly brace) is a method header. The rest of Listing 3-2 (the part sur- rounded by curly braces) is a method body. ✓ The term method declaration distinguishes the list of instructions in Listing 3-2 from the instruction in Listing 3-3, which is known as a method call. A method’s declaration tells the computer what happens if you call the method into action. A method call (a separate piece of code) tells the computer to actually call the method into action. A method’s declaration and the method’s call tend to be in different parts of the Java program. The main method in a program Figure 3-3 has a copy of the code from Listing 3-1. The bulk of the code con- tains the declaration of a method named main. (Just look for the word main in the code’s method header.) For now, don’t worry about the other words in the method header — public, static, void, String, and args. I explain these words in the next several chapters. 07_9780470371732-ch03.indd 4707_9780470371732-ch03.indd 47 7/6/11 6:55 PM7/6/11 6:55 PM www.it-ebooks.info 48 Part I: Getting Started Figure 3-3: The main method. The main method's header The main method (also known as the main method's declaration) public static void main(String args[]) { System.out.println("You'll love Java!"); } class Displayer { } The main method's body Like any Java method, the main method is a recipe. How to make biscuits: Heat the oven. Roll the dough. Bake the rolled dough. or How to follow the main instructions for a Displayer: Print “You’ll love Java!” on the screen. The word main plays a special role in Java. In particular, you never write code that explicitly calls a main method into action. The word main is the name of the method that is called into action automatically when the pro- gram begins running. So look back at Figure 3-1. When the Displayer program runs, the computer automatically finds the program’s main method and executes any instructions inside the method’s body. In the Displayer program, the main method’s body has only one instruction. That instruction tells the computer to print You’ll love Java! on the screen. So in Figure 3-1, You’ll love Java! appears on the computer screen. None of the instructions in a method is executed until the method is called into action. But, if you give a method the name main, that method is called into action automatically. 07_9780470371732-ch03.indd 4807_9780470371732-ch03.indd 48 7/6/11 6:55 PM7/6/11 6:55 PM www.it-ebooks.info 49 Chapter 3: Using the Basic Building Blocks Almost every computer programming language has something akin to Java’s methods. If you’ve worked with other languages, you may remember things like subprograms, procedures, functions, subroutines, subprocedures, or PERFORM statements. Whatever you call it in your favorite programming lan- guage, a method is a bunch of instructions collected and given a new name. How you finally tell the computer to do something Buried deep in the heart of Listing 3-1 is the single line that actually issues a direct instruction to the computer. The line, which is highlighted in Figure 3-4, tells the computer to display You’ll love Java! This line is a statement. In Java, a statement is a direct instruction that tells the computer to do some- thing (for example, display this text, put 7 in that memory location, make a window appear). Figure 3-4: A Java statement. class Displayer { public static void main(String args[]) { System.out.println("You'll love Java!"); } } A statement (a call to the System.out.println method) Of course, Java has different kinds of statements. A method call, which I introduce in the earlier “The Java method” section, is one of the many kinds of Java statements. Listing 3-3 shows you what a method call looks like, and Figure 3-4 also contains a method call that looks like this: System.out.println(“You’ll love Java!”); When the computer executes this statement, the computer calls a method named System.out.println into action. (Yes, in Java, a name can have dots in it. The dots mean something.) To learn the meaning behind the dots in Java names, see Chapter 9. 07_9780470371732-ch03.indd 4907_9780470371732-ch03.indd 49 7/6/11 6:55 PM7/6/11 6:55 PM www.it-ebooks.info 50 Part I: Getting Started Figure 3-5 illustrates the System.out.println situation. Actually, two methods play active roles in the running of the Displayer program. Here’s how they work: ✓ There’s a declaration for a main method. I wrote the main method myself. This main method is called automatically whenever I run the Displayer program. ✓ There’s a call to the System.out.println method. The method call for the System.out.println method is the only statement in the body of the main method. In other words, calling the System.out.println method is the only thing on the main method’s to-do list. The declaration for the System.out.println method is buried inside the official Java API. For a refresher on the Java API, see the sections, “The grammar and the common names” and “The words in a Java program,” earlier in this chapter. Figure 3-5: Calling the System. out. println method. class Displayer { public static void main(String args[]) { System.out.println("You'll love Java!"); } } public void println(String s) { ensureOpen(); textOut.write(s); textOut.flushBuffer(); ... } The computer calls your main method automatically, then... ...a statement in your main method calls the System.out.println method. 101010000111000... Somewhere inside the JavaAPI... 07_9780470371732-ch03.indd 5007_9780470371732-ch03.indd 50 7/6/11 6:55 PM7/6/11 6:55 PM www.it-ebooks.info 51 Chapter 3: Using the Basic Building Blocks When I say things like, “System.out.println is buried inside the API,” I’m not doing justice to the API. True, you can ignore all the nitty-gritty Java code inside the API. All you need to remember is that System.out.println is defined somewhere inside that code. But I’m not being fair when I make the API code sound like something magical. The API is just another bunch of Java code. The statements in the API that tell the computer what it means to carry out a call to System.out.println look a lot like the Java code in Listing 3-1. In Java, each statement (like the boxed line in Figure 3-4) ends with a semi- colon. Other lines in Figure 3-4 don’t end with semicolons, because the other lines in Figure 3-4 aren’t statements. For instance, the method header (the line with the word main in it) doesn’t directly tell the computer to do anything. The method header announces, “Just in case you ever want to do main, the next few lines of code tell you how to do it.” Every complete Java statement ends with a semicolon. Curly braces Long ago, or maybe not so long ago, your schoolteachers told you how useful outlines are. With an outline, you can organize thoughts and ideas, help people see forests instead of trees, and generally show that you’re a member of the Tidy Persons Club. Well, a Java program is like an outline. The program in Listing 3-1 starts with a big header line that says, “Here comes a class named Displayer.” After that first big header, a subheader announces, “Here comes a method named main.” Now, if a Java program is like an outline, why doesn’t a program look like an outline? What takes the place of the Roman numerals, capital letters, and other things? The answer is twofold: ✓ In a Java program, curly braces enclose meaningful units of code. ✓ You, the programmer, can (and should) indent lines so that other programmers can see the outline form of your code at a glance. In an outline, everything is subordinate to the item in Roman numeral I. In a Java program, everything is subordinate to the top line — the line with class in it. To indicate that everything else in the code is subordinate to this class line, you use curly braces. Everything else in the code goes inside these curly braces. (See Listing 3-4.) 07_9780470371732-ch03.indd 5107_9780470371732-ch03.indd 51 7/6/11 6:55 PM7/6/11 6:55 PM www.it-ebooks.info 52 Part I: Getting Started Listing 3-4: Curly Braces for a Java Class class Displayer { public static void main(String args[]) { System.out.println(“You’ll love Java!”); } } In an outline, some stuff is subordinate to a capital letter A item. In a Java program, some lines are subordinate to the method header. To indicate that something is subordinate to a method header, you use curly braces. (See Listing 3-5.) Listing 3-5: Curly Braces for a Java Method class Displayer { public static void main(String args[]) { System.out.println(“You’ll love Java!”); } } In an outline, some items are at the bottom of the food chain. In the Displayer class, the corresponding line is the line that begins with System.out.println. Accordingly, this System.out.println line goes inside all the other curly braces and is indented more than any other line. Never lose sight of the fact that a Java program is, first and foremost, an outline. If you put curly braces in the wrong places or omit curly braces where the braces should be, your program probably won’t work at all. If your program works, it’ll probably work incorrectly. If you don’t indent lines of code in an informative manner, your program will still work correctly, but neither you nor any other programmer will be able to figure out what you were thinking when you wrote the code. If you’re a visual thinker, you can picture outlines of Java programs in your head. One friend of mine visualizes an actual numbered outline morphing into a Java program. (See Figure 3-6.) Another person, who shall remain nameless, uses more bizarre imagery. (See Figure 3-7.) I appreciate a good excuse as much as the next guy, but failing to indent your Java code is inexcusable. In fact, many Java IDEs have tools to indent your code automatically. Visit this book’s website for more information. 07_9780470371732-ch03.indd 5207_9780470371732-ch03.indd 52 7/6/11 6:55 PM7/6/11 6:55 PM www.it-ebooks.info 53 Chapter 3: Using the Basic Building Blocks Figure 3-6: An outline turns into a Java program. class Displayer { public static void main(String args[]) { System.out.println("You'll love Java!"); } } I. class Displayer A. public static void main(String args[]) 1. System.out.println("You'll love Java!"); I. The Dispayer class A. The main method 1. Print "You'll love Java!" Figure 3-7: A class is bigger than a method; a method is bigger than a statement. Class Displayer{ } System.out.println (“You'll love Java!”); public static void main (String args[]) { } public static void main (String args[]){ } And Now, a Few Comments People gather around campfires to hear the old legend about a programmer whose laziness got her into trouble. To maintain this programmer’s anonymity, 07_9780470371732-ch03.indd 5307_9780470371732-ch03.indd 53 7/6/11 6:55 PM7/6/11 6:55 PM www.it-ebooks.info 54 Part I: Getting Started I call her Jane Pro. Jane worked many months to create the holy grail of comput- ing — a program that thinks on its own. If completed, this program could work independently, learning new things without human intervention. Day after day, night after night, she labored to give the program that spark of creative, indepen- dent thought. One day, when she was almost finished with the project, she received a dis- turbing piece of paper mail from her health insurance company. No, the mail wasn’t about a serious illness. It was about a routine office visit. The insur- ance company’s claim form had a place for her date of birth, as if her date of birth had changed since the last time she sent in a claim. She had absent- mindedly scribbled 2009 as her year of birth, so the insurance company refused to pay the bill. Jane dialed the insurance company’s phone number. Within 20 minutes, she was talking to a live person. “I’m sorry,” said the live person. “To resolve this issue you must dial a different number.” Well, you can guess what happened next. “I’m sorry. The other operator gave you the wrong number.” And then, “I’m sorry. You must call back the original phone number.” Five months later, Jane’s ear ached, but after 800 hours on the phone, she had finally gotten a tentative promise that the insurance company would eventually reprocess the claim. Elated as she was, she was anxious to get back to her programming project. Could she remember what all those lines of code were supposed to be doing? No, she couldn’t. She stared and stared at her own work and, like a dream that doesn’t make sense the next morning, the code was now completely meaningless to her. She had written a million lines of code and not one line was accompanied by an informative explanatory comment. She had left no clues to help her understand what she’d been thinking, so in frustration, she abandoned the whole project. Adding comments to your code Listing 3-6 has an enhanced version of this chapter’s sample program. In addition to all the keywords, identifiers, and punctuation, Listing 3-6 has text that’s meant for human beings to read. 07_9780470371732-ch03.indd 5407_9780470371732-ch03.indd 54 7/6/11 6:55 PM7/6/11 6:55 PM www.it-ebooks.info 55 Chapter 3: Using the Basic Building Blocks Listing 3-6: Three Kinds of Comments /* * Listing 3-6 in “Java For Dummies, 5th Edition” * * Copyright 2009 Wiley Publishing, Inc. * All rights reserved. */ /** * The Displayer class displays text * on the computer screen. * * @author Barry Burd * @version 1.0 10/24/09 * @see java.lang.System */ class Displayer { /** * The main method is where * execution of the code begins. * * @param args (See Chapter 11.) */ public static void main(String args[]) { System.out.println(“I love Java!”); //I? You? } } A comment is a special section of text inside a program whose purpose is to help people understand the program. A comment is part of a good program’s documentation. The Java programming language has three kinds of comments: ✓ Traditional comments: The first five lines of Listing 3-6 form one traditional comment. The comment begins with /* and ends with */. Everything between the opening /* and the closing */ is for human eyes only. No information about “Java For Dummies, 5th Edition” or Wiley Publishing, Inc. is translated by the compiler. To read about compilers, see Chapter 2. 07_9780470371732-ch03.indd 5507_9780470371732-ch03.indd 55 7/6/11 6:55 PM7/6/11 6:55 PM www.it-ebooks.info 56 Part I: Getting Started The second, third, fourth, and fifth lines in Listing 3-6 have extra aster- isks (*). I call them extra because these asterisks aren’t required when you create a comment. They just make the comment look pretty. I include them in Listing 3-6 because, for some reason that I don’t entirely understand, most Java programmers add these extra asterisks. ✓ End-of-line comments: The text //I? You? in Listing 3-6 is an end-of- line comment. An end-of-line comment starts with two slashes, and goes to the end of a line of type. Once again, the compiler doesn’t translate the text inside the end-of-line comment. ✓ Javadoc comments: A javadoc comment begins with a slash and two asterisks (/**). Listing 3-6 has two javadoc comments — one with the text The Displayer class . . . and another with the text The main method is where. . . . A javadoc comment is a special kind of traditional comment. A javadoc comment is meant to be read by people who never even look at the Java code. But that doesn’t make sense. How can you see the javadoc com- ments in Listing 3-6 if you never look at Listing 3-6? Well, a certain program called javadoc (what else?) can find all the javadoc comments in Listing 3-6 and turn these comments into a nice-looking web page. Figure 3-8 shows the page. Javadoc comments are great. Here are several great things about them: ✓ The only person who has to look at a piece of Java code is the program- mer who writes the code. Other people who use the code can find out what the code does by viewing the automatically generated web page. ✓ Because other people don’t look at the Java code, other people don’t make changes to the Java code. (In other words, other people don’t introduce errors into the existing Java code.) ✓ Because other people don’t look at the Java code, other people don’t have to decipher the inner workings of the Java code. All these people need to know about the code is what they read on the code’s web page. ✓ The programmer doesn’t create two separate things — some Java code over here and some documentation about the code over there. Instead, the programmer creates one piece of Java code and embeds the docu- mentation (in the form of javadoc comments) right inside the code. ✓ Best of all, the generation of web pages from javadoc comments is auto- matic. So everyone’s documentation has the same format. No matter whose Java code you use, you find out about that code by reading a page like the one in Figure 3-8. That’s good because the format in Figure 3-8 is familiar to anyone who uses Java. 07_9780470371732-ch03.indd 5607_9780470371732-ch03.indd 56 7/6/11 6:55 PM7/6/11 6:55 PM www.it-ebooks.info 57 Chapter 3: Using the Basic Building Blocks You can generate your own web pages from the javadoc comments that you put in your code. To discover how, visit this book’s website. Figure 3-8: The javadoc page generated from the code in Listing 3-6. 07_9780470371732-ch03.indd 5707_9780470371732-ch03.indd 57 7/6/11 6:55 PM7/6/11 6:55 PM www.it-ebooks.info 58 Part I: Getting Started What’s Barry’s excuse? For years, I’ve been telling my students to put comments in their code, and for years, I’ve been creating sample code (like the code in Listing 3-1) with no comments in it. Why? Three little words: “Know your audience.” When you write complicated, real- life code, your audience is other programmers, information technology man- agers, and people who need help deciphering what you’ve done. When I write simple samples of code for this book, my audience is you — the novice Java programmer. Instead of reading my comments, your best strategy is to stare at my Java statements — the statements that Java’s compiler deciphers. That’s why I put so few comments in this book’s listings. Besides, I’m a little lazy. Using comments to experiment with your code You may hear programmers talk about commenting out certain parts of their code. When you’re writing a program and something’s not working correctly, it often helps to try removing some of the code. If nothing else, you find out what happens when that suspicious code is removed. Of course, you may not like what happens when the code is removed, so you don’t want to delete the code completely. Instead, you turn your ordinary Java statements into com- ments. For instance, you turn the statement System.out.println(“I love Java!”); into the comment // System.out.println(“I love Java!”); This keeps the Java compiler from seeing the code while you try to figure out what’s wrong with your program. Traditional comments aren’t very useful for commenting out code. The big problem is that you can’t put one traditional comment inside of another. For instance, suppose you want to comment out the following statements: 07_9780470371732-ch03.indd 5807_9780470371732-ch03.indd 58 7/6/11 6:55 PM7/6/11 6:55 PM www.it-ebooks.info 59 Chapter 3: Using the Basic Building Blocks System.out.println(“Parents,”); System.out.println(“pick your”); /* * Intentionally displays on four separate lines */ System.out.println(“battles”); System.out.println(“carefully!”); If you try to turn this code into one traditional comment, you get the following mess: /* System.out.println(“Parents,”); System.out.println(“pick your”); /* * Intentionally displays on four separate lines */ System.out.println(“battles”); System.out.println(“carefully!”); */ The first */ (after Intentionally displays) ends the traditional com- ment prematurely. Then the battles and carefully statements aren’t commented out, and the last */ chokes the compiler. You can’t nest tradi- tional comments inside one another. Because of this, I recommend end-of-line comments as tools for experimenting with your code. Most IDEs can out comment out sections of your code for you automatically. For details, visit this book’s website. 07_9780470371732-ch03.indd 5907_9780470371732-ch03.indd 59 7/6/11 6:55 PM7/6/11 6:55 PM www.it-ebooks.info 60 Part I: Getting Started 07_9780470371732-ch03.indd 6007_9780470371732-ch03.indd 60 7/6/11 6:55 PM7/6/11 6:55 PM www.it-ebooks.info Part II Writing Your Own Java Programs 08_9780470371732-pp02.indd 6108_9780470371732-pp02.indd 61 7/6/11 7:00 PM7/6/11 7:00 PM www.it-ebooks.info In this part . . . In this part, you dig in and get dirty by writing some programs and finding out what Java really feels like. Some of the stuff in this part is specific to Java, but lots of the material is just plain-old, generic, computer pro- gramming. Here you concentrate on details — details about data, logic, and program flow. After you’ve read this part and practiced some of the techniques, you can write all kinds of interesting Java programs. 08_9780470371732-pp02.indd 6208_9780470371732-pp02.indd 62 7/6/11 7:00 PM7/6/11 7:00 PM www.it-ebooks.info Chapter 4 Making the Most of Variables and Their Values In This Chapter ▶ Assigning values to things ▶ Making things store certain types of values ▶ Applying operators to get new values The following conversation between Mr. Van Doren and Mr. Barasch never took place: Charles: A sea squirt eats its brain, turning itself from an animal into a plant. Jack: Is that your final answer, Charles? Charles: Yes, it is. Jack: How much money do you have in your account today, Charles? Charles: I have fifty dollars and twenty-two cents in my checking account. Jack: Well, you better call the IRS, because your sea squirt answer is correct. You just won a million dollars to add to your checking account. What do you think of that, Charles? Charles: I owe it all to honesty, diligence, and hard work, Jack. Some aspects of this dialogue can be represented in Java by a few lines of code. Varying a Variable No matter how you acquire your million dollars, you can use a variable to tally your wealth. Listing 4-1 shows the code. 09_9780470371732-ch04.indd 6309_9780470371732-ch04.indd 63 7/6/11 7:00 PM7/6/11 7:00 PM www.it-ebooks.info 64 Part II: Writing Your Own Java Programs Listing 4-1: Using a Variable amountInAccount = 50.22; amountInAccount = amountInAccount + 1000000.00; The code in Listing 4-1 makes use of the amountInAccount variable. A vari- able is a placeholder. You can stick a number like 50.22 into a variable. After you place a number in the variable, you can change your mind and put a dif- ferent number into the variable. (That’s what varies in a variable.) Of course, when you put a new number in a variable, the old number is no longer there. If you didn’t save the old number somewhere else, the old number is gone. Figure 4-1 gives a before-and-after picture of the code in Listing 4-1. After the first statement in Listing 4-1 is executed, the variable amountInAccount has the number 50.22 in it. Then, after the second statement of Listing 4-1 is exe- cuted, the amountInAccount variable suddenly has 1000050.22 in it. When you think about a variable, picture a place in the computer’s memory where wires and transistors store 50.22, 1000050.22, or whatever. In the left side of Figure 4-1, imagine that the box with 50.22 in it is surrounded by millions of other such boxes. Figure 4-1: A variable (before and after). Before executing amountInAccount = amountInAccount + 1000000.00; amountInAccount 50.22 After executing amountInAccount = amountInAccount + 1000000.00; amountInAccount 50.22 1000050.22 Now you need some terminology. The thing stored in a variable is a value. A variable’s value can change during the run of a program (when Jack gives you a million bucks, for instance). The value that’s stored in a variable isn’t nec- essarily a number. (For instance, you can create a variable that always stores a letter.) The kind of value that’s stored in a variable is a variable’s type. You can read more about types in the section “Understanding the Types of Values That Variables May Have,” later in this chapter. A subtle, almost unnoticeable difference exists between a variable and a vari- able’s name. Even in formal writing, I often use the word variable when I mean variable name. Strictly speaking, amountInAccount is a variable name, and 09_9780470371732-ch04.indd 6409_9780470371732-ch04.indd 64 7/6/11 7:00 PM7/6/11 7:00 PM www.it-ebooks.info 65 Chapter 4: Making the Most of Variables and Their Values all the memory storage associated with amountInAccount (including the type that amountInAccount has and whatever value amountInAccount currently represents) is the variable itself. If you think this distinction between variable and variable name is too subtle for you to worry about, join the club. Every variable name is an identifier — a name that you can make up in your own code. In preparing Listing 4-1, I made up the name amountInAccount. For more information on the kinds of names in a Java program, see Chapter 3. Before the sun sets on Listing 4-1, you need to notice one more part of the listing. The listing has 50.22 and 1000000.00 in it. Anybody in his or her right mind would call these things numbers, but in a Java program it helps to call these things literals. And what’s so literal about 50.22 and 1000000.00? Well, think about the variable amountInAccount in Listing 4-1. The variable amountInAccount stands for 50.22 some of the time, but it stands for 1000050.22 the rest of the time. You could use the word number to talk about amountInAccount. But really, what amountInAccount stands for depends on the fashion of the moment. On the other hand, 50.22 literally stands for the value 5022⁄100. A variable’s value changes; a literal’s value doesn’t. Starting with Java 7, you can add underscores to your numeric literals. Instead of using the plain old 1000000.00 in Listing 4-1, you can write amountInAccount = amountInAccount + 1_000_000.00. Unfortunately, you can’t easily do what you’re most tempted to do. You can’t write 1,000,000.00 (as you would in the United States), nor can you write 1.000.000,00 (as you would in Germany). If you want to write 1,000,000.00 you have to use some fancy for- matting tricks. For more information about formatting, check Chapters 10 and 11. Assignment Statements Statements like the ones in Listing 4-1 are called assignment statements. In an assignment statement, you assign a value to something. In many cases, this something is a variable. I recommend getting into the habit of reading assignment statements from right to left. Figure 4-2 illustrates the action of the first line in Listing 4-1. The second line in Listing 4-1 is just a bit more complicated. Figure 4-3 illustrates the action of the second line in Listing 4-1. 09_9780470371732-ch04.indd 6509_9780470371732-ch04.indd 65 7/6/11 7:00 PM7/6/11 7:00 PM www.it-ebooks.info 66 Part II: Writing Your Own Java Programs Figure 4-2: The action of the first line in Listing 4-1. Figure 4-3: The action of the sec- ond line in Listing 4-1. 09_9780470371732-ch04.indd 6609_9780470371732-ch04.indd 66 7/6/11 7:00 PM7/6/11 7:00 PM www.it-ebooks.info 67 Chapter 4: Making the Most of Variables and Their Values In an assignment statement, the thing being assigned a value is always on the left side of the equal sign. Understanding the Types of Values That Variables May Have Have you seen the TV commercials that make you think you’re flying around among the circuits inside a computer? Pretty cool, eh? These commercials show 0s (zeros) and 1s sailing by because 0s and 1s are the only things that computers can really deal with. When you think a computer is storing the letter J, the computer is really storing 01001010. Everything inside the com- puter is a sequence of 0s and 1s. As every computer geek knows, a 0 or 1 is called a bit. As it turns out, the sequence 01001010, which stands for the letter J, can also stand for the number 74. The same sequence can also stand for 1.0369608636003646 × 10–43. In fact, if the bits are interpreted as screen pixels, the same sequence can be used to represent the dots shown in Figure 4-4. The meaning of 01001010 depends on the way the software interprets this sequence of 0s and 1s. Figure 4-4: An extreme close-up of eight black- and-white screen pixels. So how do you tell the computer what 01001010 stands for? The answer is in the concept of type. The type of a variable is the range of values that the vari- able is permitted to store. I copied the lines from Listing 4-1 and put them into a complete Java pro- gram. The program is in Listing 4-2. When I run the program in Listing 4-2, I get the output shown in Figure 4-5. 09_9780470371732-ch04.indd 6709_9780470371732-ch04.indd 67 7/6/11 7:00 PM7/6/11 7:00 PM www.it-ebooks.info 68 Part II: Writing Your Own Java Programs Listing 4-2: A Program Uses amountInAccount class Millionaire { public static void main(String args[]) { double amountInAccount; amountInAccount = 50.22; amountInAccount = amountInAccount + 1000000.00; System.out.print(“You have $”); System.out.print(amountInAccount); System.out.println(“ in your account.”); } } Figure 4-5: Running the program in Listing 4-2. In Listing 4-2, look at the first line in the body of the main method. double amountInAccount; This line is called a variable declaration. Putting this line in your program is like saying, “I’m declaring my intention to have a variable named amountIn- Account in my program.” This line reserves the name amountInAccount for your use in the program. In this variable declaration, the word double is a Java keyword. This word double tells the computer what kinds of values you intend to store in amount InAccount. In particular, the word double stands for numbers between –1.8 × 10308 and 1.8 × 10308. (These are enormous numbers with 308 zeros before the decimal point. Only the world’s richest people write checks with 308 zeros in them. The second of these numbers is one-point-eight gazazzo-zillion-kaskillion. The number 1.8 × 10308, a constant defined by the International Bureau of Weights and Measures, is the number of eccentric computer programmers between Sunnyvale, California, and the M31 Andromeda Galaxy.) More important than the humongous range of the double keyword’s num- bers is the fact that a double value can have digits beyond the decimal point. After you declare amountInAccount to be of type double, you can store all sorts of numbers in amountInAccount. You can store 50.22, 0.02398479, or –3.0. In Listing 4-2, if I hadn’t declared amountInAccount to be of type double, I may not have been able to store 50.22. Instead, I would have had to store plain old 50, without any digits beyond the decimal point. 09_9780470371732-ch04.indd 6809_9780470371732-ch04.indd 68 7/6/11 7:00 PM7/6/11 7:00 PM www.it-ebooks.info 69 Chapter 4: Making the Most of Variables and Their Values Another type — type float — also allows you to have numbers after the decimal point, but this type isn’t as accurate. (See the sidebar, “Digits beyond the decimal point,” for the full story.) Don’t sweat the choice between float and double. For most programs, just use double. The big million-dollar jackpot in Listing 4-2 is impressive. But Listing 4-2 doesn’t illustrate the best way to deal with dollar amounts. In a Java program, the best way to represent currency is to shun the double and float types and opt instead for a type named BigDecimal. For more information, see this book’s website. Digits beyond the decimal point Java has two different types that have digits beyond the decimal point: type double and type float. So what’s the difference? When you declare a variable to be of type double, you’re telling the computer to keep track of 64 bits when it stores the variable’s values. When you declare a variable to be of type float, the computer keeps track of only 32 bits. You could change Listing 4-2 and declare amountInAccount to be of type float. float amountInAccount; Surely, 32 bits are enough to store a small number like 50.22, right? Well, they are and they aren’t. You could easily store 50.00 with only 32 bits. Heck, you could store 50.00 with only 6 bits. The size of the number doesn’t matter. The accuracy matters. In a 64-bit double vari- able, you’re using most of the bits to store stuff beyond the decimal point. To store the .22 part of 50.22, you need more than the measly 32 bits that you get with type float. Do you really believe what you just read — that it takes more than 32 bits to store .22? To help convince you, I made a few changes to the code in Listing 4-2. I made amountInAccount be of type float, and the output I got was You have $1000050.25 in your account. Compare this with the output in Figure 4-5. When I switch from type double to type float, Charles has an extra three cents in his account. By changing to the 32-bit float type, I’ve clobbered the accuracy in the amount InAccount variable’s hundredths place. That’s bad. Another difficulty with float values is purely cosmetic. Look again at the literals, 50.22 and 1000000.00, in Listing 4-2. The Laws of Java say that literals like these take up 64 bits each. This means that if you declare amountIn Account to be of type float, you’re going to run into trouble. You’ll have trouble stuff- ing those 64-bit literals into your little 32-bit amountInAccount variable. To compen- sate, you can switch from double literals to float literals by adding an F to each double literal, but a number with an extra F at the end looks funny. float amountInAccount; amountInAccount = 50.22F; amountInAccount = amountInAccount + 1000000.00F; To experiment with numbers, visit http:// babbage.cs.qc.edu/IEEE-754/. The page takes any number that you enter and shows you how the number would be repre- sented as 32 bits and as 64 bits. 09_9780470371732-ch04.indd 6909_9780470371732-ch04.indd 69 7/6/11 7:00 PM7/6/11 7:00 PM www.it-ebooks.info 70 Part II: Writing Your Own Java Programs Displaying Text The last three statements in Listing 4-2 use a neat formatting trick. You want to display several different things on a single line on the screen. You put these things in separate statements. All but the last of the statements are calls to System.out.print. (The last statement is a call to System.out. println.) Calls to System.out.print display text on part of a line and then leave the cursor at the end of the current line. After executing System. out.print, the cursor is still at the end of the same line, so the next System.out.whatever can continue printing on that same line. With several calls to print capped off by a single call to println, the result is just one nice-looking line of output. (Refer to Figure 4-5.) A call to System.out.print writes some things and leaves the cursor sitting at the end of the line of output. A call to System.out.println writes things and then finishes the job by moving the cursor to the start of a brand new line of output. Numbers without Decimal Points “In 1995, the average family had 2.3 children.” At this point, a wise guy always remarks that no real family has exactly 2.3 children. Clearly, whole numbers have a role in this world. Therefore, in Java, you can declare a variable to store nothing but whole numbers. Listing 4-3 shows a program that uses whole number variables. Listing 4-3: Using the int Type class ElevatorFitter { public static void main(String args[]) { int weightOfAPerson; int elevatorWeightLimit; int numberOfPeople; weightOfAPerson = 150; elevatorWeightLimit = 1400; numberOfPeople = elevatorWeightLimit / weightOfAPerson; System.out.print(“You can fit “); System.out.print(numberOfPeople); System.out.println(“ people on the elevator.”); } } 09_9780470371732-ch04.indd 7009_9780470371732-ch04.indd 70 7/6/11 7:00 PM7/6/11 7:00 PM www.it-ebooks.info 71 Chapter 4: Making the Most of Variables and Their Values The story behind the program in Listing 4-3 takes some heavy-duty explain- ing. So here goes: You have a hotel elevator whose weight capacity is 1,400 pounds. One week- end, the hotel hosts the Brickenchicker family reunion. A certain branch of the Brickenchicker family has been blessed with identical dectuplets (ten siblings, all with the same physical characteristics). Normally, each of the Brickenchicker dectuplets weighs exactly 145 pounds. But on Saturday, the family has a big catered lunch, and, because lunch included strawberry shortcake, each of the Brickenchicker dectuplets now weighs 150 pounds. Immediately after lunch, all ten of the Brickenchicker dectuplets arrive at the elevator at exactly the same time. (Why not? All ten of them think alike.) So, the question is, how many of the dectuplets can fit on the elevator? Now remember, if you put one ounce more than 1,400 pounds of weight on the elevator, the elevator cable breaks, plunging all dectuplets on the elevator to their sudden (and costly) deaths. The answer to the Brickenchicker riddle (the output of the program of Listing 4-3) is shown in Figure 4-6. Figure 4-6: Save the Bricken- chickers, Save the World. At the core of the Brickenchicker elevator problem, you have whole numbers — numbers with no digits beyond the decimal point. When you divide 1,400 by 150, you get 91⁄3, but you shouldn’t take the 1⁄3 seriously. No matter how hard you try, you can’t squeeze an extra 50 pounds worth of Brickenchicker dectuplet onto the elevator. This fact is reflected nicely in Java. In Listing 4-3, all three variables (weightOfAPerson, elevatorWeightLimit, and number OfPeople) are of type int. An int value is a whole number. When you divide one int value by another (as you do with the slash in Listing 4-3), you get another int. When you divide 1,400 by 150, you get 9 — not 91⁄3. You see this in Figure 4-6. Taken together, the following statements display 9 onscreen: numberOfPeople = elevatorWeightLimit / weightOfAPerson; System.out.print(numberOfPeople); 09_9780470371732-ch04.indd 7109_9780470371732-ch04.indd 71 7/6/11 7:00 PM7/6/11 7:00 PM www.it-ebooks.info 72 Part II: Writing Your Own Java Programs Combining Declarations and Initializing Variables Look back at Listing 4-3. In that listing, you see three variable declarations — one for each of the program’s three int variables. I could have done the same thing with just one declaration: int weightOfAPerson, elevatorWeightLimit, numberOfPeople; If two variables have completely different types, you can’t create both vari- ables in the same declaration. For instance, to create an int variable named weightOfFred and a double variable named amountInFredsAccount, you need two separate variable declarations. You can give variables their starting values in a declaration. In Listing 4-3 for instance, one declaration can replace several lines in the main method (all but the calls to print and println). int weightOfAPerson = 150, elevatorWeightLimit = 1400, numberOfPeople = elevatorWeightLimit/weightOfAPerson; When you do this, you don’t say that you’re assigning values to variables. The pieces of the declarations with equal signs in them aren’t really called assignment statements. Instead, you say that you’re initializing the variables. Believe it or not, keeping this distinction in mind is helpful. Like everything else in life, initializing a variable has advantages and disadvantages: Four ways to store whole numbers Java has four types of whole numbers. The types are byte, short, int, and long. Unlike the complicated story about the accu- racy of types float and double, the only thing that matters when you choose among the whole number types is the size of the number that you’re trying to store. If you want to use numbers larger than 127, don’t use byte. To store numbers larger than 32767, don’t use short. Most of the time, you’ll use int. But if you need to store numbers larger than 2147483647, forsake int in favor of long. (A long number can be as big as 9223372036854775807.) For the whole story, see Table 4-1. 09_9780470371732-ch04.indd 7209_9780470371732-ch04.indd 72 7/6/11 7:00 PM7/6/11 7:00 PM www.it-ebooks.info 73 Chapter 4: Making the Most of Variables and Their Values ✓ When you combine six lines of Listing 4-3 into just one declaration, the code becomes more concise. Sometimes, concise code is easier to read. Sometimes it’s not. As a programmer, it’s your judgment call. ✓ By initializing a variable, you might automatically avoid certain programming errors. For an example, see Chapter 7. ✓ In some situations, you have no choice. The nature of your code forces you either to initialize or not to initialize. For an example that doesn’t lend itself to variable initialization, see the deleting-evidence program in Chapter 6. The Atoms: Java’s Primitive Types The words int and double that I describe in the previous sections are examples of primitive types (also known as simple types) in Java. The Java language has exactly eight primitive types. As a newcomer to Java, you can pretty much ignore all but four of these types. (As programming languages go, Java is nice and compact that way.) Table 4-1 shows the complete list of primitive types. Table 4-1 Java’s Primitive Types Type Name What a Literal Looks Like Range of Values Whole number types byte (byte)42 –128 to 127 short (short)42 –32768 to 32767 int 42 –2147483648 to 2147483647 long 42L –9223372036854775808 to 9223372036854775807 Decimal number types float 42.0F –3.4 × 1038 to 3.4 × 1038 double 42.0 –1.8 × 10308 to 1.8 × 10308 Character type char ‘A’ Thousands of characters, glyphs, and symbols Logical type boolean true true, false 09_9780470371732-ch04.indd 7309_9780470371732-ch04.indd 73 7/6/11 7:00 PM7/6/11 7:00 PM www.it-ebooks.info 74 Part II: Writing Your Own Java Programs The types that you shouldn’t ignore are int, double, char, and boolean. Previous sections in this chapter cover the int and double types. So, this section covers char and boolean types. The char type Not so long ago, people thought computers existed only for doing big number- crunching calculations. Nowadays, with word processors, nobody thinks that way anymore. So, if you haven’t been in a cryogenic freezing chamber for the last 20 years, you know that computers store letters, punctuation symbols, and other characters. The Java type that’s used to store characters is called char. Listing 4-4 has a simple program that uses the char type. Figure 4-7 shows the output of the program in Listing 4-4. Listing 4-4: Using the char Type class CharDemo { public static void main(String args[]) { char myLittleChar = ‘b’; char myBigChar = Character.toUpperCase(myLittleChar); System.out.println(myBigChar); } } Figure 4-7: An exciting run of the program of Listing 4-4 as it appears in the Eclipse Console view. In Listing 4-4, the first initialization stores the letter b in the variable myLittle Char. In the initialization, notice how b is surrounded by single quote marks. In Java, every char literal starts and ends with a single quote mark. 09_9780470371732-ch04.indd 7409_9780470371732-ch04.indd 74 7/6/11 7:00 PM7/6/11 7:00 PM www.it-ebooks.info 75 Chapter 4: Making the Most of Variables and Their Values In a Java program, single quote marks surround the letter in a char literal. If you need help sorting out the terms assignment, declaration, and initializa- tion, see the “Combining Declarations and Initializing Variables” section, earlier in this chapter. In the second initialization of Listing 4-4, the program calls an API method whose name is Character.toUpperCase. The Character.toUpperCase method does just what its name suggests — the method produces the uppercase equivalent of the letter b. This uppercase equivalent (the letter B) is assigned to the myBigChar variable, and the B that’s in myBigChar prints onscreen. For an introduction to the Java Application Programming Interface (API), see Chapter 3. If you’re tempted to write the following statement, char myLittleChars = ‘barry’; //Don’t do this please resist the temptation. You can’t store more than one letter at a time in a char variable, and you can’t put more than one letter between a pair of single quotes. If you’re trying to store words or sentences (not just single letters), you need to use something called a String. For a look at Java’s String type, see the section, “The Molecules and Compounds: Reference Types,” later in this chapter. If you’re used to writing programs in other languages, you may be aware of something called ASCII Character Encoding. Most languages use ASCII; Java uses Unicode. In the old ASCII representation, each character takes up only 8 bits, but in Unicode, each character takes up 8, 16, or 32 bits. Whereas ASCII stores the letters of the familiar Roman (English) alphabet, Unicode has room for characters from most of the world’s commonly spoken languages. The only problem is that some of the Java API methods are geared specially toward 16-bit Unicode. Occasionally, this bites you in the back (or it bytes you in the back, as the case may be). If you’re using a method to write Hello on the screen and H e l l o shows up instead, check the method’s documentation for mention of Unicode characters. It’s worth noticing that the two methods, Character.toUpperCase and System.out.println, are used quite differently in Listing 4-4. The method Character.toUpperCase is called as part of an initialization or an assign- ment statement, but the method System.out.println is called on its own. To find out more about this, see Chapter 7. 09_9780470371732-ch04.indd 7509_9780470371732-ch04.indd 75 7/6/11 7:00 PM7/6/11 7:00 PM www.it-ebooks.info 76 Part II: Writing Your Own Java Programs The boolean type A variable of type boolean stores one of two values — true or false. Listing 4-5 demonstrates the use of a boolean variable. Figure 4-8 shows the output of the program in Listing 4-5. Listing 4-5: Using the boolean Type class ElevatorFitter2 { public static void main(String args[]) { System.out.println(“True or False?”); System.out.println(“You can fit all ten of the”); System.out.println(“Brickenchicker dectuplets”); System.out.println(“on the elevator:”); System.out.println(); int weightOfAPerson = 150; int elevatorWeightLimit = 1400; int numberOfPeople = elevatorWeightLimit / weightOfAPerson; boolean allTenOkay = numberOfPeople >= 10; System.out.println(allTenOkay); } } Figure 4-8: The Bricken- chicker dectuplets strike again. In Listing 4-5, the allTenOkay variable is of type boolean. To find a value for the allTenOkay variable, the program checks to see whether number OfPeople is greater than or equal to ten. (The symbols >= stand for greater than or equal to.) At this point, it pays to be fussy about terminology. Any part of a Java pro- gram that has a value is an expression. If you write weightOfAPerson = 150; 09_9780470371732-ch04.indd 7609_9780470371732-ch04.indd 76 7/6/11 7:00 PM7/6/11 7:00 PM www.it-ebooks.info 77 Chapter 4: Making the Most of Variables and Their Values then 150 is an expression (an expression whose value is the quantity 150). If you write numberOfEggs = 2 + 2; then 2 + 2 is an expression (because 2 + 2 has the value 4). If you write int numberOfPeople = elevatorWeightLimit / weightOfAPerson; then elevatorWeightLimit / weightOfAPerson is an expression. (The value of the expression elevatorWeightLimit / weightOfAPerson depends on whatever values the variables elevatorWeightLimit and weight OfAPerson have when the code containing the expression is executed.) Any part of a Java program that has a value is an expression. In Listing 4-5, the code numberOfPeople >= 10 is an expression. The expres- sion’s value depends on the value stored in the numberOfPeople variable. But, as you know from seeing the strawberry shortcake at the Brickenchicker family’s catered lunch, the value of numberOfPeople isn’t greater than or equal to ten. This makes the value of numberOfPeople >= 10 to be false. So, in the statement in Listing 4-5, in which allTenOkay is assigned a value, the allTenOkay variable is assigned a false value. In Listing 4-5, I call System.out.println() with nothing inside the paren- theses. When I do this, Java adds a line break to the program’s output. In Listing 4-5, System.out.println() tells the program to display a blank line. The Molecules and Compounds: Reference Types By combining simple things, you get more complicated things. That’s the way it always goes. Take some of Java’s primitive types, whip them together to make a primitive type stew, and what do you get? A more complicated type called a reference type. The program in Listing 4-6 uses reference types. Figure 4-9 shows you what happens when you run the program in Listing 4-6. 09_9780470371732-ch04.indd 7709_9780470371732-ch04.indd 77 7/6/11 7:00 PM7/6/11 7:00 PM www.it-ebooks.info 78 Part II: Writing Your Own Java Programs Listing 4-6: Using Reference Types import javax.swing.JFrame; class ShowAFrame { public static void main(String args[]) { JFrame myFrame = new JFrame(); String myTitle = “Blank Frame”; myFrame.setTitle(myTitle); myFrame.setSize(300, 200); myFrame.setDefaultCloseOperation (JFrame.EXIT_ON_CLOSE); myFrame.setVisible(true); } } The program in Listing 4-6 uses two references types. Both types are defined in the Java API. One of the types (the one that you’ll use all the time) is called String. The other type (the one that you can use to create GUIs) is called JFrame. Figure 4-9: An empty frame. A String is a bunch of characters. It’s like having several char values in a row. So, with the myTitle variable declared to be of type String, assigning “Blank Frame” to the myTitle variable makes sense in Listing 4-6. The String class is declared in the Java API. In a Java program, double quote marks surround the letters in a String literal. A Java JFrame is a lot like a window. (The only difference is that you call it a JFrame instead of a window.) To keep Listing 4-6 short and sweet, I decided not to put anything in my frame — no buttons, no fields, nothing. Even with a completely empty frame, Listing 4-6 uses tricks that I don’t describe until later in this book. So don’t try reading and interpreting every word of Listing 4-6. The big thing to get from Listing 4-6 is that the program 09_9780470371732-ch04.indd 7809_9780470371732-ch04.indd 78 7/6/11 7:00 PM7/6/11 7:00 PM www.it-ebooks.info 79 Chapter 4: Making the Most of Variables and Their Values has two variable declarations. In writing the program, I made up two variable names — myTitle and myFrame. According to the declarations, myTitle is of type String, and myFrame is of type JFrame. You can look up String and JFrame in Java’s API documentation. But, even before you do, I can tell you what you’ll find. You’ll find that String and JFrame are the names of Java classes. So, that’s the big news. Every class is the name of a reference type. You can reserve amountInAccount for double values by writing double amountInAccount; or by writing double amountInAccount = 50.22; You can also reserve myFrame for a JFrame value by writing JFrame myFrame; or by writing JFrame myFrame = new JFrame(); To review the notion of a Java class, see the sections on object-oriented pro- gramming (OOP) in Chapter 1. Every Java class is a reference type. If you declare a variable to have some type that’s not a primitive type, the variable’s type is (most of the time) the name of a Java class. Now, when you declare a variable to have type int, you can visualize what that declaration means in a fairly straightforward way. It means that, some- where inside the computer’s memory, a storage location is reserved for that variable’s value. In the storage location is a bunch of bits. The arrangement of the bits assures that a certain whole number is represented. That explanation is fine for primitive types like int or double, but what does it mean when you declare a variable to have a reference type? What does it mean to declare variable myFrame to be of type JFrame? Well, what does it mean to declare i thank You God to be an E. E. Cummings poem? What would it mean to write the following declaration? EECummingsPoem ithankYouGod; 09_9780470371732-ch04.indd 7909_9780470371732-ch04.indd 79 7/6/11 7:00 PM7/6/11 7:00 PM www.it-ebooks.info 80 Part II: Writing Your Own Java Programs It means that a class of things is EECummingsPoem, and ithankYouGod refers to an instance of that class. In other words, ithankYouGod is an object belonging to the EECummingsPoem class. Because JFrame is a class, you can create objects from that class. (See Chapter 1.) Each object (each instance of the JFrame class) is an actual frame — a window that appears on the screen when you run the code in Listing 4-6. By declaring the variable myFrame to be of type JFrame, you’re reserving the use of the name myFrame. This reservation tells the computer that myFrame can refer to an actual JFrame-type object. In other words, myFrame can become a nickname for one of the windows that appears on the computer screen. Figure 4-10 illustrates the situation. When you declare ClassName variableName;, you’re saying that a certain variable can refer to an instance of a particular class. Figure 4-10: The variable myFrame refers to an instance of the JFrame class. myFrame An object (an instance of the JFrame class) Another object (another instance of the JFrame class) The JFrame class In Listing 4-6, the phrase JFrame myFrame reserves the use of the name myFrame. On that same line of code, the phrase new JFrame() creates a new object (an instance of the JFrame class). Finally, that line’s equal sign makes myFrame refer to the new object. Knowing that the two words new JFrame() create an object can be very important. For a more thorough explanation of objects, see Chapter 7. 09_9780470371732-ch04.indd 8009_9780470371732-ch04.indd 80 7/6/11 7:00 PM7/6/11 7:00 PM www.it-ebooks.info 81 Chapter 4: Making the Most of Variables and Their Values An Import Declaration It’s always good to announce your intentions up front. Consider the following classroom lecture: “Today, in our History of Film course, we’ll be discussing the career of actor Lionel Herbert Blythe Barrymore. “Born in Philadelphia, Barrymore appeared in more than 200 films, including It’s a Wonderful Life, Key Largo, and Dr. Kildare’s Wedding Day. In addition, Barrymore was a writer, composer, and director. Barrymore did the voice of Ebenezer Scrooge every year on radio. . . .” Interesting stuff, heh? Now compare the paragraphs above with a lecture in which the instructor doesn’t begin by introducing the subject: “Welcome once again to the History of Film. “Born in Philadelphia, Lionel Barrymore appeared in more than 200 films, including It’s a Wonderful Life, Key Largo, and Dr. Kildare’s Wedding Day. In addition, Barrymore (not Ethel, John, or Drew) was a writer, composer, and director. Lionel Barrymore did the voice of Ebenezer Scrooge every year on radio. . . .” Primitive type stew While I’m on the subject of frames, what’s a frame anyway? A frame is a window that has a certain height and width and a certain location on your computer’s screen. Therefore, deep inside the declaration of the Frame class, you can find variable declarations that look some- thing like this: int width; int height; int x; int y; Here’s another example — Time. An instance of the Time class may have an hour (a number from 1 to 12), a number of minutes (from 0 to 59), and a letter (a for a.m.; p for p.m.). int hour; int minutes; char amOrPm; Notice that this high and mighty thing called a Java API class is neither high nor mighty. A class is just a collection of declarations. Some of those declarations are the declarations of variables. Some of those variable declarations use primitive types, and other variable decla- rations use reference types. These reference types, however, come from other classes, and the declarations of those classes have vari- ables. The chain goes on and on. Ultimately, everything comes, in one way or another, from the primitive types. 09_9780470371732-ch04.indd 8109_9780470371732-ch04.indd 81 7/6/11 7:00 PM7/6/11 7:00 PM www.it-ebooks.info 82 Part II: Writing Your Own Java Programs Without a proper introduction, a speaker may have to remind you constantly that the discussion is about Lionel Barrymore and not about some other Barrymore. The same is true in a Java program. Look again at Listing 4-6: import javax.swing.JFrame; class ShowAFrame { public static void main(String args[]) { JFrame myFrame = new JFrame(); In Listing 4-6, you announce in the introduction (in the import declaration) that you’re using JFrame in your Java class. You clarify what you mean by JFrame with the full name javax.swing.JFrame. (Hey! Didn’t the first lecturer clarify with the full name “Lionel Herbert Blythe Barrymore?”) After announcing your intentions in the import declaration, you can use the abbreviated name JFrame in your Java class code. If you don’t use an import declaration, then you have to repeat the full javax.swing.JFrame name wherever you use the name JFrame in your code. For example, without an import declaration, the code of Listing 4-6 would look like this: class ShowAFrame { public static void main(String args[]) { javax.swing.JFrame myFrame = new javax.swing.JFrame(); String myTitle = “Blank Frame”; myFrame.setTitle(myTitle); myFrame.setSize(3200, 200); myFrame.setDefaultCloseOperation (javax.swing.JFrame.EXIT_ON_CLOSE); myFrame.setVisible(true); } } The details of this import stuff can be pretty nasty. But fortunately, many IDEs have convenient helper features for import declarations. For details, see this book’s website. No single section in this book can present the entire story about import declarations. To begin untangling some of the import declaration’s subtleties, see Chapters 5, 9, and 10. 09_9780470371732-ch04.indd 8209_9780470371732-ch04.indd 82 7/6/11 7:00 PM7/6/11 7:00 PM www.it-ebooks.info 83 Chapter 4: Making the Most of Variables and Their Values Creating New Values by Applying Operators What could be more comforting than your old friend, the plus sign? It was the first thing that you learned about in elementary school math. Almost everybody knows how to add 2 and 2. In fact, in English usage, adding 2 and 2 is a metaphor for something that’s easy to do. Whenever you see a plus sign, a cell in your brain says, “Thank goodness — it could be something much more complicated.” So Java has a plus sign. You can use it for several purposes. You can use the plus sign to add two numbers, like this: int apples, oranges, fruit; apples = 5; oranges = 16; fruit = apples + oranges; You can also use the plus sign to paste String values together: String startOfChapter = “It’s three in the morning. I’m dreaming about the “+ “history course that I failed in high school.”; System.out.println(startOfChapter); This can be handy because in Java, you’re not allowed to make a String straddle from one line to another. In other words, the following code wouldn’t work at all: String thisIsBadCode = “It’s three in the morning. I’m dreaming about the history course that I failed in high school.”; System.out.println(thisIsBadCode); The correct way to say that you’re pasting String values together is to say that you’re concatenating String values. You can even use the plus sign to paste numbers next to String values. int apples, oranges, fruit; apples = 5; oranges = 16; fruit = apples + oranges; System.out.println(“You have “ + fruit + “ pieces of fruit.”); 09_9780470371732-ch04.indd 8309_9780470371732-ch04.indd 83 7/6/11 7:00 PM7/6/11 7:00 PM www.it-ebooks.info 84 Part II: Writing Your Own Java Programs Of course, the old minus sign is available, too (but not for String values). apples = fruit - oranges; Use an asterisk (*) for multiplication and a slash (/) for division. double rate, pay; int hours; rate = 6.25; hours = 35; pay = rate * hours; System.out.println(pay); For an example using division, refer to Listing 4-3. When you divide an int value by another int value, you get an int value. The computer doesn’t round. Instead, the computer chops off any remainder. If you put System.out.println(11 / 4) in your program, the computer prints 2, not 2.75. To get past this, make either (or both) of the numbers you’re dividing double values. If you put System.out.println(11.0 / 4) in your pro- gram, the computer prints 2.75. Another useful arithmetic operator is called the remainder operator. The symbol for the remainder operator is the percent sign (%). When you put System.out. println(11 % 4) in your program, the computer prints 3. It does this because 4 goes into 11 who-cares-how-many times with a remainder of 3. The remainder operator turns out to be fairly useful. Listing 4-7 has an example. Listing 4-7: Making Change import static java.lang.System.out; class MakeChange { public static void main(String args[]) { int total = 248; int quarters = total / 25; int whatsLeft = total % 25; int dimes = whatsLeft / 10; whatsLeft = whatsLeft % 10; int nickels = whatsLeft / 5; whatsLeft = whatsLeft % 5; int cents = whatsLeft; 09_9780470371732-ch04.indd 8409_9780470371732-ch04.indd 84 7/6/11 7:00 PM7/6/11 7:00 PM www.it-ebooks.info 85 Chapter 4: Making the Most of Variables and Their Values out.println(“From “ + total + “ cents you get”); out.println(quarters + “ quarters”); out.println(dimes + “ dimes”); out.println(nickels + “ nickels”); out.println(cents + “ cents”); } } Figure 4-11 shows a run of the code in Listing 4-7. You start with a total of 248 cents. Then quarters = total / 25 divides 248 by 25, giving 9. That means you can make 9 quarters from 248 cents. Next, whatsLeft = total % 25 divides 248 by 25 again, and puts only the remainder, 23, into whatsLeft. Now you’re ready for the next step, which is to take as many dimes as you can out of 23 cents. Figure 4-11: Change for $2.48. Initialize once, assign often Listing 4-7 has three lines that put values into the variable whatsLeft: int whatsLeft = total % 25; whatsLeft = whatsLeft % 10; whatsLeft = whatsLeft % 5; Only one of these lines is a declaration. The other two lines are assignment statements. That’s good because you can’t declare the same variable more than once (not without creating something called a block). If you goof and write 09_9780470371732-ch04.indd 8509_9780470371732-ch04.indd 85 7/6/11 7:00 PM7/6/11 7:00 PM www.it-ebooks.info 86 Part II: Writing Your Own Java Programs int whatsLeft = total % 25; int whatsLeft = whatsLeft % 10; in Listing 4-7, you see an error message (whatsLeft is already defined) when you try to compile your code. To find out what a block is, see Chapter 5. Then, for some honest talk about redeclaring variables, see Chapter 10. The increment and decrement operators Java has some neat little operators that make life easier (for the computer’s processor, for your brain, and for your fingers). Altogether, four such opera- tors exist — two increment operators and two decrement operators. The Import declarations: The ugly truth Notice the import declaration at the top of Listing 4-7: import static java.lang. System.out; Compare this with the import declaration at the top of Listing 4-6: import javax.swing.JFrame; By adding the import static java. lang.System.out; line to Listing 4-7, I can make the rest of the code a bit easier to read, and I can avoid having long Java statements that start on one line and continue on another. But you never have to do that. If you remove the import static java.lang.System. out; line, and pepper the code liberally with System.out.println, then the code works just fine. Here’s a question: Why does one declaration include the word static, while the other dec- laration doesn’t? Well, to be honest, I wish I hadn’t asked! For the real story about static, you have to read part of Chapter 10. And frankly, I don’t recommend skipping ahead to that chapter’s static section if you take medicine for a heart condition, if you’re pregnant or nursing, or if you have no previous experience with object- oriented programming. For now, rest assured that Chapter 10 is easy to read after you’ve made the journey through Part III of this book. And when you have to decide whether to use the word static in an import declaration, remember these hints: ✓ The vast majority of import declarations in Java program do not use the word static. ✓ In this book, I never use import static to import anything except System.out. (Well, almost never . . .) ✓ Most import declarations don’t use the word static because most declarations import classes. Unfortunately, System. out is not the name of a class. 09_9780470371732-ch04.indd 8609_9780470371732-ch04.indd 86 7/6/11 7:00 PM7/6/11 7:00 PM www.it-ebooks.info 87 Chapter 4: Making the Most of Variables and Their Values increment operators add 1, and the decrement operators subtract 1. The increment operators use double plus signs (++), and the decrement opera- tors use double minus signs (--). To see how they work, you need some examples. The first example is in Figure 4-12. Figure 4-13 shows a run of the program in Figure 4-12. In this horribly uneventful run, the count of bunnies prints three times. The double plus signs go by two names, depending on where you put them. When you put the ++ before a variable, the ++ is called the preincrement operator. (The pre stands for before.) Figure 4-12: Using prein- crement. Figure 4-13: A run of the code in Figure 4-12. 09_9780470371732-ch04.indd 8709_9780470371732-ch04.indd 87 7/6/11 7:00 PM7/6/11 7:00 PM www.it-ebooks.info 88 Part II: Writing Your Own Java Programs The word before has two meanings: ✓ You put ++ before the variable. ✓ The computer adds 1 to the variable’s value before the variable is used in any other part of the statement. To understand this, look at the bold line in Figure 4-12. The computer adds 1 to numberOfBunnies (raising the value of numberOfBunnies to 29) and then prints 29 onscreen. With out.println(++numberOfBunnies), the computer adds 1 to number OfBunnies before printing the new value of numberOfBunnies on-screen. An alternative to preincrement is postincrement. (The post stands for after.) The word after has two different meanings: ✓ You put ++ after the variable. ✓ The computer adds 1 to the variable’s value after the variable is used in any other part of the statement. To see more clearly how postincrement works, look at the bold line in Figure 4-14. The computer prints the old value of numberOfBunnies (which is 28) on the screen, and then the computer adds 1 to numberOfBunnies, which raises the value of numberOfBunnies to 29. With out.println(numberOfBunnies++), the computer adds 1 to number OfBunnies after printing the old value that numberOfBunnies already had. Figure 4-15 shows a run of the code in Figure 4-14. Compare Figure 4-15 with the run in Figure 4-13: ✓ With preincrement in Figure 4-13, the second number is 29. ✓ With postincrement in Figure 4-15, the second number is 28. In Figure 4-15, 29 doesn’t show onscreen until the end of the run, when the computer executes one last out.println(numberOfBunnies). Are you trying to decide between using preincrement or postincrement? Try no longer. Most programmers use postincrement. In a typical Java program, you often see things like numberOfBunnies++. You seldom see things like ++numberOfBunnies. 09_9780470371732-ch04.indd 8809_9780470371732-ch04.indd 88 7/6/11 7:00 PM7/6/11 7:00 PM www.it-ebooks.info 89 Chapter 4: Making the Most of Variables and Their Values Figure 4-14: Using post- increment. Figure 4-15: A run of the code in Figure 4-14. In addition to preincrement and postincrement, Java has two operators that use --. These operators are called predecrement and postdecrement. ✓ With predecrement (--numberOfBunnies), the computer subtracts 1 from the variable’s value before the variable is used in the rest of the statement. ✓ With postdecrement (numberOfBunnies--), the computer subtracts 1 from the variable’s value after the variable is used in the rest of the statement. 09_9780470371732-ch04.indd 8909_9780470371732-ch04.indd 89 7/6/11 7:00 PM7/6/11 7:00 PM www.it-ebooks.info 90 Part II: Writing Your Own Java Programs Instead of writing ++numberOfBunnies, you could achieve the same effect by writing numberOfBunnies = numberOfBunnies + 1. So some people con- clude that Java’s ++ and -- operators are for saving keystrokes — to keep those poor fingers from overworking themselves. This is entirely incorrect. The best reason for using ++ is to avoid the inefficient and error-prone practice of writing the same variable name, such as numberOfBunnies, twice in the same state- ment. If you write numberOfBunnies only once (as you do when you use ++ or --), the computer has to figure out what numberOfBunnies means only once. On top of that, when you write numberOfBunnies only once, you have only one chance (instead of two chances) to type the variable name incorrectly. Statements and expressions You can describe the pre- and postincrement and pre- and postdecrement operators in two ways: the way everyone understands them and the right way. The way that I explain the con- cept in most of this section (in terms of time, with before and after) is the way that everyone understands it. Unfortunately, the way every- one understands the concept isn’t really the right way. When you see ++ or --, you can think in terms of time sequence. But occasion- ally some programmer uses ++ or -- in a con- voluted way, and the notions of before and after break down. So, if you’re ever in a tight spot, think about these operators in terms of state- ments and expressions. First, remember that a statement tells the com- puter to do something, and an expression has a value. (I discuss statements in Chapter 3, and I describe expressions elsewhere in this chapter.) Which category does numberOf Bunnies++ belong to? The surprising answer is both. The Java code number OfBunnies++ is both a statement and an expression. Assume that, before the computer executes the code out.println(numberOfBunnies++), the value of numberOfBunnies is 28. ✓ As a statement, numberOfBunnies++ tells the computer to add 1 to numberOf Bunnies. ✓ As an expression, the value of number OfBunnies++ is 28, not 29. So, even though the computer adds 1 to numberOfBunnies, the code out. println(numberOfBunnies++) really means out.println(28). Now, almost everything you just read about numberOfBunnies++ is true about ++numberOfBunnies. The only difference is that as an expression, ++numberOfBunnies behaves in a more intuitive way. ✓ As a statement, ++numberOfBunnies tells the computer to add 1 to numberOf Bunnies. ✓ As an expression, the value of ++number OfBunnies is 29. So, with out.println(++number OfBunnies), the computer adds 1 to the variable numberOfBunnies, and the code out.println(++numberOfBunnies) really means out.println(29). 09_9780470371732-ch04.indd 9009_9780470371732-ch04.indd 90 7/6/11 7:00 PM7/6/11 7:00 PM www.it-ebooks.info 91 Chapter 4: Making the Most of Variables and Their Values With simple expressions like numberOfBunnies++, these advantages hardly make a difference. But with more complicated expressions, such as inventoryItems[(quantityReceived--*itemsPerBox+17)]++, the efficiency and accuracy that you gain by using ++ and -- are significant. Assignment operators If you read the preceding section, which is about operators that add 1, you may be wondering whether you can manipulate these operators to add 2 or add 5 or add 1000000. Can you write numberOfBunnies++++ and still call yourself a Java programmer? Well, you can’t. If you try it, an error message appears when you try to compile your code. So what can you do? As luck would have it, Java has plenty of assignment operators that you can use. With an assignment operator, you can add, sub- tract, multiply, or divide by anything you want. You can do other cool opera- tions, too. Listing 4-8 has a smorgasbord of assignment operators (the things with equal signs). Figure 4-16 shows the output from running Listing 4-8. Listing 4-8: Assignment Operators class UseAssignmentOperators { public static void main(String args[]) { int numberOfBunnies = 27; int numberExtra = 53; numberOfBunnies += 1; System.out.println(numberOfBunnies); numberOfBunnies += 5; System.out.println(numberOfBunnies); numberOfBunnies += numberExtra; System.out.println(numberOfBunnies); numberOfBunnies *= 2; System.out.println(numberOfBunnies); System.out.println(numberOfBunnies -= 7); System.out.println(numberOfBunnies = 100); } } 09_9780470371732-ch04.indd 9109_9780470371732-ch04.indd 91 7/6/11 7:00 PM7/6/11 7:00 PM www.it-ebooks.info 92 Part II: Writing Your Own Java Programs Figure 4-16: A run of the code in Listing 4-8. Listing 4-8 shows how versatile Java’s assignment operators are. With the assignment operators, you can add, subtract, multiply, or divide a variable by any number. Notice how += 5 adds 5 to numberOfBunnies, and how *= 2 multiplies numberOfBunnies by 2. You can even use another expres- sion’s value (in Listing 4-8, numberExtra) as the number to be applied. The last two lines in Listing 4-8 demonstrate a special feature of Java’s assign- ment operators. You can use an assignment operator as part of a larger Java statement. In the next to last line of Listing 4-8, the operator subtracts 7 from numberOfBunnies, decreasing the value of numberOfBunnies from 172 to 165. Then the whole assignment business is stuffed into a call to System. out.println, so 165 prints onscreen. Lo and behold, the last line of Listing 4-8 shows how you can do the same thing with Java’s plain-old equal sign. The thing that I call an assignment statement near the start of this chapter is really one of the assignment opera- tors that I describe in this section. Therefore, whenever you assign a value to something, you can make that assignment be part of a larger statement. Each use of an assignment operator does double duty as a statement and an expression. In all cases, the expression’s value equals whatever value you assign. For example, before executing the code System.out.println (numberOfBunnies -= 7), the value of numberOfBunnies is 172. As a statement, numberOfBunnies -= 7 tells the computer to subtract 7 from numberOfBunnies (so the value of numberOfBunnies goes from 172 to 165). As an expression, the value of numberOfBunnies -= 7 is 165. So the code System.out.println(numberOfBunnies -= 7) really means System. out.println(165). The number 165 displays on the computer screen. For a richer explanation of this kind of thing, see the sidebar, “Statements and expressions,” earlier in this chapter. 09_9780470371732-ch04.indd 9209_9780470371732-ch04.indd 92 7/6/11 7:00 PM7/6/11 7:00 PM www.it-ebooks.info Chapter 5 Controlling Program Flow with Decision-Making Statements In This Chapter ▶ Writing statements that choose between alternatives ▶ Putting statements inside one another ▶ Choosing among many alternatives The TV show Dennis the Menace aired on CBS from 1959 to 1963. I remember one episode in which Mr. Wilson was having trouble making an important decision. I think it was something about changing jobs or moving to a new town. Anyway, I can still see that shot of Mr. Wilson sitting in his yard, sipping lemonade, and staring into nowhere for the whole after- noon. Of course, the annoying character Dennis was constantly interrupting Mr. Wilson’s peace and quiet. That’s what made this situation funny. What impressed me about this episode (the reason why I remember it so clearly even now) was Mr. Wilson’s dogged intent in making the decision. This guy wasn’t going about his everyday business, roaming around the neighbor- hood, while thoughts about the decision wandered in and out of his mind. He was sitting quietly in his yard, making marks carefully and logically on his mental balance sheet. How many people actually make decisions this way? At that time, I was still pretty young. I’d never faced the responsibility of having to make a big decision that affected my family and me. But I wondered what such a decision-making process would be like. Would it help to sit there like a stump for hours on end? Would I make my decisions by the careful weighing and tallying of options? Or would I shoot in the dark, take risks, and act on impulse? Only time would tell. 10_9780470371732-ch05.indd 9310_9780470371732-ch05.indd 93 7/6/11 6:59 PM7/6/11 6:59 PM www.it-ebooks.info 94 Part II: Writing Your Own Java Programs Making Decisions (Java if Statements) When you’re writing computer programs, you’re constantly hitting forks in roads. Did the user correctly type his or her password? If yes, let the user work; if no, kick the bum out. So the Java programming language needs a way of making a program branch in one of two directions. Fortunately, the language has a way. It’s called an if statement. Guess the number Listing 5-1 illustrates the use of an if statement. Two runs of the program in Listing 5-1 are shown in Figure 5-1. Listing 5-1: A Guessing Game import static java.lang.System.out; import java.util.Scanner; import java.util.Random; class GuessingGame { public static void main(String args[]) { Scanner keyboard = new Scanner(System.in); out.print(“Enter an int from 1 to 10: “); int inputNumber = keyboard.nextInt(); int randomNumber = new Random().nextInt(10) + 1; if (inputNumber == randomNumber) { out.println(“**********”); out.println(“*You win.*”); out.println(“**********”); } else { out.println(“You lose.”); out.print(“The random number was “); out.println(randomNumber + “.”); } out.println(“Thank you for playing.”); } } 10_9780470371732-ch05.indd 9410_9780470371732-ch05.indd 94 7/6/11 6:59 PM7/6/11 6:59 PM www.it-ebooks.info 95 Chapter 5: Controlling Program Flow with Decision-Making Statements Figure 5-1: Two runs of the guessing game. The program in Listing 5-1 plays a guessing game with the user. The program gets a number (a guess) from the user and then generates a random number between 1 and 10. If the number that the user entered is the same as the random number, the user wins. Otherwise, the user loses, and the program tells the user what the random number was. She controlled keystrokes from the keyboard Taken together, the lines import java.util.Scanner; Scanner keyboard = new Scanner(System.in); int inputNumber = keyboard.nextInt(); in Listing 5-1 get whatever number the user types on the computer’s key- board. The last of the three lines puts this number into a variable named inputNumber. If these lines look complicated, don’t worry. You can copy these lines almost word for word whenever you want to read from the key- board. Include the first two lines (the import and Scanner lines) just once in your program. Later in your program, wherever the user types an int value, include a line with a call to nextInt (as in the last of the preceding three lines of code). Of all the names in these three lines of code, the only two names that I coined myself are inputNumber and keyboard. All the other names are part of Java. So, if I want to be creative, I can write the lines this way: 10_9780470371732-ch05.indd 9510_9780470371732-ch05.indd 95 7/6/11 6:59 PM7/6/11 6:59 PM www.it-ebooks.info 96 Part II: Writing Your Own Java Programs import java.util.Scanner; Scanner readingThingie = new Scanner(System.in); int valueTypedIn = readingThingie.nextInt(); I can also beef up my program’s import declarations, as I do in Listings 5-2 and 5-3. Other than that, I have very little leeway. As you read on in this book, you’ll start recognizing the patterns behind these three lines of code, so I don’t clutter up this section with all the details. For now, you can just copy these three lines and keep the following in mind: ✓ When you import java.util.Scanner, you don’t use the word static. But importing Scanner is different from importing System.out. When you import java.lang.System.out, you use the word static. (See Listing 5-1.) The difference creeps into the code because Scanner is the name of a class, and System.out isn’t the name of a class. For a quick look at the use of the word static in import declarations, see one of the sidebars in Chapter 4. For a more complete story about the word, see Chapter 10. ✓ The name System.in stands for the keyboard. To get characters from some place other than the keyboard, you can type something other than System.in inside the parentheses. What else can you put inside the parentheses? For some ideas, see Chapter 8. In Listing 5-1, I make the arbitrary decision to give one of my variables the name keyboard. The name keyboard reminds you, the reader, that this variable refers to a bunch of plastic buttons in front of your computer. Naming something keyboard doesn’t tell Java anything about plastic but- tons or about user input. On the other hand, the name System.in always tells Java about those plastic buttons. The code Scanner keyboard = new Scanner(System.in) in Listing 5-1 connects the name keyboard with the plastic buttons that we all know and love. ✓ When you expect the user to type an int value (a whole number of some kind), use nextInt(). If you expect the user to type a double value (a number containing a decimal point), use nextDouble(). If you expect the user to type true or false, use nextBoolean(). If you expect the user to type a word like Barry, Java, or Hello, use next(). 10_9780470371732-ch05.indd 9610_9780470371732-ch05.indd 96 7/6/11 6:59 PM7/6/11 6:59 PM www.it-ebooks.info 97 Chapter 5: Controlling Program Flow with Decision-Making Statements For an example in which the user types a word, see Listing 5-3. For an example in which the user types a single character, see Listing 6-4 in Chapter 6. For an example in which a program reads an entire line of text (all in one big gulp), see Chapter 8. ✓ You can get several values from the keyboard, one after another. To do this, use the keyboard.nextInt() code several times. To see a program that reads more than one value from the keyboard, go to Listing 5-4. Creating randomness Achieving real randomness is surprisingly difficult. Mathematician Persi Diaconis says that if you flip a coin several times, always starting with the head side up, you’re likely to toss heads more often than tails. If you toss several more times, always starting with the tail side up, you’re likely to toss tails more often than heads. In other words, coin tossing isn’t really fair.* Computers aren’t much better than coins and human thumbs. A computer mimics the generation of random sequences but, in the end, the computer just does what it’s told and does all this in a purely deterministic fashion. So in Listing 5-1, when the computer executes import java.util.Random; int randomNumber = new Random().nextInt(10) + 1; the computer appears to give us a randomly generated number — a whole number between 1 and 10. But it’s all a fake. The computer just follows instructions. It’s not really random, but without bending a computer over backwards, it’s the best that anyone can do. Once again, I ask you to take this code on blind faith. Don’t worry about what new Random().nextInt means until you have more experience with Java. Just copy this code into your own programs and have fun with it. And if the numbers from 1 to 10 aren’t in your flight plans, don’t fret. To roll an imagi- nary die, write the statement int rollEmBaby = new Random().nextInt(6) + 1; With the execution of this statement, the variable rollEmBaby gets a value from 1 to 6. * Diaconis, Persi. “The Search for Randomness.” American Association for the Advancement of Science annual meeting. Seattle. 14 Feb. 2004. 10_9780470371732-ch05.indd 9710_9780470371732-ch05.indd 97 7/6/11 6:59 PM7/6/11 6:59 PM www.it-ebooks.info 98 Part II: Writing Your Own Java Programs The if statement At the core of Listing 5-1 is a Java if statement. This if statement represents a fork in the road. (See Figure 5-2.) The computer follows one of two prongs — the prong that prints You win or the prong that prints You lose. The com- puter decides which prong to take by testing the truth or falsehood of a condition. In Listing 5-1, the condition being tested is inputNumber == randomNumber Does the value of inputNumber equal the value of randomNumber? When the condition is true, the computer does the stuff between the condition and the word else. When the condition turns out to be false, the computer does the stuff after the word else. Either way, the computer goes on to execute the last println call, which displays Thank you for playing. The condition in an if statement must be enclosed in parentheses. However, a line like if (inputNumber == randomNumber) is not a complete state- ment (just as “If I had a hammer” isn’t a complete sentence). So this line if (inputNumber == randomNumber) shouldn’t end with a semicolon. Figure 5-2: An if state- ment is like a fork in the road. Does inputNumber equal randomNumber? ********** *You win.* ********** You lose. The random number was... Thank you for playing. yes no 10_9780470371732-ch05.indd 9810_9780470371732-ch05.indd 98 7/6/11 6:59 PM7/6/11 6:59 PM www.it-ebooks.info 99 Chapter 5: Controlling Program Flow with Decision-Making Statements Sometimes, when I’m writing about a condition that’s being tested, I slip into using the word expression instead of condition. That’s okay, because every condition is an expression. An expression is something that has a value and, sure enough, every condition has a value. The condition’s value is either true or false. (For revealing information about expressions and values like true and false, see Chapter 4.) The double equal sign In Listing 5-1, in the if statement’s condition, notice the use of the double equal sign. Comparing two numbers to see whether they’re the same isn’t the same as setting something equal to something else. That’s why the symbol to compare for equality isn’t the same as the symbol that’s used in an assignment or an initialization. In an if statement’s condition, you can’t replace the double equal sign with a single equal sign. If you do, your program just won’t work. (You almost always get an error message when you try to compile your code.) On the other hand, if you never make the mistake of using a single equal sign in a condition, you’re not normal. Not long ago, while I was teaching an introductory Java course, I promised that I’d swallow my laser pointer if no one made the single equal sign mistake during any of the lab sessions. This wasn’t an idle promise. I knew I’d never have to keep it. As it turned out, even if I had ignored the first ten times anybody made the single equal sign mis- take during those lab sessions, I would still be laser-pointer free. Everybody mistakenly uses the single equal sign several times in his or her programming career. The trick is not to avoid making the mistake; the trick is to catch the mistake whenever you make it. Brace yourself The if statement in Listing 5-1 has two halves — a top half and a bottom half. I have names for these two parts of an if statement. I call them the if part (the top half) and the else part (the bottom half). The if part in Listing 5-1 seems to have more than one statement in it. I make this happen by enclosing the three statements of the if part in a pair of curly braces. When I do this, I form a block. A block is a bunch of statements scrunched together by a pair of curly braces. 10_9780470371732-ch05.indd 9910_9780470371732-ch05.indd 99 7/6/11 6:59 PM7/6/11 6:59 PM www.it-ebooks.info 100 Part II: Writing Your Own Java Programs With this block, three calls to println are tucked away safely inside the if part. With the curly braces, the rows of asterisks and the words You win display only when the user’s guess is correct. This business with blocks and curly braces applies to the else part as well. In Listing 5-1, whenever inputNumber doesn’t equal randomNumber, the computer executes three print/println calls. To convince the computer that all three of these calls are inside the else clause, I put these calls into a block. That is, I enclose these three calls in a pair of curly braces. Strictly speaking, Listing 5-1 has only one statement between the if and the else statements and only one statement after the else statement. The trick is that when you place a bunch of statements inside curly braces, you get a block; and a block behaves, in all respects, like a single statement. In fact, the official Java documentation lists blocks as one of the many kinds of state- ments. So, in Listing 5-1, the block that prints You win and asterisks is a single statement that has, within it, three smaller statements. Indenting if statements in your code Notice how, in Listing 5-1, the print and println calls inside the if state- ment are indented. (This includes both the You win and You lose state- ments. The print and println calls that come after the word else are still part of the if statement.) Strictly speaking, you don’t have to indent the statements that are inside an if statement. For all the compiler cares, you can write your whole program on a single line or place all your statements in an artful, misshapen zigzag. The problem is that neither you nor anyone else can make sense of your code if you don’t indent your statements in some logical fashion. In Listing 5-1, the indenting of the print and println state- ments helps your eye (and brain) see quickly that these statements are sub- ordinate to the overall if/else flow. In a small program, unindented or poorly indented code is barely tolerable. But in a complicated program, indentation that doesn’t follow a neat, logical pattern is a big, ugly nightmare. Many Java IDEs have tools to indent your code automatically. In fact, code indentation is one of my favorite IDE features. So don’t walk — run — to a computer, and visit this book’s website for more information on what Java IDEs can offer. When you write if statements, you may be tempted to chuck all the rules about curly braces out the window and just rely on indentation. Unfortunately, this 10_9780470371732-ch05.indd 10010_9780470371732-ch05.indd 100 7/6/11 6:59 PM7/6/11 6:59 PM www.it-ebooks.info 101 Chapter 5: Controlling Program Flow with Decision-Making Statements seldom works. If you indent three statements after the word else and forget to enclose those statements in curly braces, the computer thinks that the else part includes only the first of the three statements. What’s worse, the indenta- tion misleads you into believing that the else part includes all three state- ments. This makes it more difficult for you to figure out why your code isn’t behaving the way you think it should behave. So watch those braces! Elseless in Ifrica Okay, so the title of this section is contrived. Big deal! The idea is that you can create an if statement without the else part. Take, for instance, the code in Listing 5-1. Maybe you’d rather not rub it in whenever the user loses the game. The modified code in Listing 5-2 shows you how to do this (and Figure 5-3 shows you the result). Listing 5-2: A Kinder, Gentler Guessing Game import static java.lang.System.in; import static java.lang.System.out; import java.util.Scanner; import java.util.Random; class DontTellThemTheyLost { public static void main(String args[]) { Scanner keyboard = new Scanner(in); out.print(“Enter an int from 1 to 10: “); int inputNumber = keyboard.nextInt(); int randomNumber = new Random().nextInt(10) + 1; if (inputNumber == randomNumber) { out.println(“*You win.*”); } out.println(“That was a very good guess :-)”); out.print(“The random number was “); out.println(randomNumber + “.”); out.println(“Thank you for playing.”); } } 10_9780470371732-ch05.indd 10110_9780470371732-ch05.indd 101 7/6/11 6:59 PM7/6/11 6:59 PM www.it-ebooks.info 102 Part II: Writing Your Own Java Programs Figure 5-3: Two runs of the game in Listing 5-2. The if statement in Listing 5-2 has no else part. When inputNumber is the same as randomNumber, the computer prints You win. When inputNumber is different from randomNumber, the computer doesn’t print You win. Listing 5-2 illustrates another new idea. With an import declaration for System.in, I can reduce new Scanner(System.in) to the shorter new Scanner(in). Adding this import declaration is hardly worth the effort. In fact, I do more typing with the import declaration than without it. Nevertheless, the code in Listing 5-2 demonstrates that it’s possible to import System.in. Forming Conditions with Comparisons and Logical Operators The Java programming language has plenty of little squiggles and doodads for your various condition-forming needs. This section tells you all about them. Comparing numbers; comparing characters Table 5-1 shows you the operators that you can use to compare one thing with another. Table 5-1 Comparison Operators Operator Symbol Meaning Example == is equal to numberOfCows == 5 != is not equal to buttonClicked != panicButton < is less than numberOfCows < 5 > is greater than myInitial > ‘B’ <= is less than or equal to numberOfCows <= 5 >= is greater than or equal to myInitial >= ‘B’ 10_9780470371732-ch05.indd 10210_9780470371732-ch05.indd 102 7/6/11 6:59 PM7/6/11 6:59 PM www.it-ebooks.info 103 Chapter 5: Controlling Program Flow with Decision-Making Statements You can use all Java’s comparison operators to compare numbers and char- acters. When you compare numbers, things go pretty much the way you think they should go. But when you compare characters, things are a little strange. Comparing uppercase letters with one another is no problem. Because the letter B comes alphabetically before H, the condition ‘B’ < ‘H’ is true. Comparing lowercase letters with one another is also okay. What’s strange is that when you compare an uppercase letter with a lowercase letter, the uppercase letter is always smaller. So, even though ‘Z’ < ‘A’ is false, ‘Z’ < ‘a’ is true. Under the hood, the letters A through Z are stored with numeric codes 65 through 90. The letters a through z are stored with codes 97 through 122. That’s why each uppercase letter is smaller than each lowercase letter. Be careful when you compare two numbers for equality (with ==) or inequality (with !=). After doing some calculations and obtaining two double values or two float values, the values that you have are seldom dead-on equal to one another. (The problem comes from those pesky digits beyond the decimal point.) For instance, the Fahrenheit equivalent of 21 degrees Celsius is 69.8, and when you calculate 9.0 / 5 * 21 + 32 by hand, you get 69.8. But the condition 9.0 / 5 * 21 + 32 == 69.8 turns out to be false. That’s because, when the com- puter calculates 9.0 / 5 * 21 + 32, it gets 69.80000000000001, not 69.8. Comparing objects When you start working with objects, you find that you can use == and != to compare objects with one another. For instance, a button that you see on the computer screen is an object. You can ask whether the thing that was just mouse-clicked is a particular button on your screen. You do this with Java’s equality operator. if (e.getSource() == bCopy) { clipboard.setText(which.getText()); To find out more about responding to button clicks, read Chapter 16. The big gotcha with Java’s comparison scheme comes when you compare two strings. (For a word or two about Java’s String type, see the section about reference types in Chapter 4.) When you compare two strings with one another, you don’t want to use the double equal sign. Using the double equal sign would ask, “Is this string stored in exactly the same place in memory as that other string?” Usually, that’s not what you want to ask. Instead, you usually want to ask, “Does this string have the same characters in it as that other string?” To ask the second question (the more appropriate question) Java’s String type has a method named equals. (Like everything else in the known universe, this equals method is defined in the Java API, short for Application Programming Interface.) The equals method compares two strings to see whether they have the same characters in them. For an example using Java’s equals method, see Listing 5-3. (Figure 5-4 shows a run of the program in Listing 5-3.) 10_9780470371732-ch05.indd 10310_9780470371732-ch05.indd 103 7/6/11 6:59 PM7/6/11 6:59 PM www.it-ebooks.info 104 Part II: Writing Your Own Java Programs Listing 5-3: Checking a Password import static java.lang.System.*; import java.util.Scanner; class CheckPassword { public static void main(String args[]) { out.print(“What’s the password? “); Scanner keyboard = new Scanner(in); String password = keyboard.next(); out.println(“You typed >>” + password + “<<”); out.println(); if (password == “swordfish”) { out.println(“The word you typed is stored”); out.println(“in the same place as the real”); out.println(“password. You must be a”); out.println(“hacker.”); } else { out.println(“The word you typed is not”); out.println(“stored in the same place as”); out.println(“the real password, but that’s”); out.println(“no big deal.”); } out.println(); if (password.equals(“swordfish”)) { out.println(“The word you typed has the”); out.println(“same characters as the real”); out.println(“password. You can use our”); out.println(“precious system.”); } else { out.println(“The word you typed doesn’t”); out.println(“have the same characters as”); out.println(“the real password. You can’t”); out.println(“use our precious system.”); } } } In Listing 5-3, the call keyboard.next() grabs whatever word the user types on the computer keyboard. The code shoves this word into the vari- able named password. Then the program’s if statements use two different techniques to compare password with “swordfish”. 10_9780470371732-ch05.indd 10410_9780470371732-ch05.indd 104 7/6/11 6:59 PM7/6/11 6:59 PM www.it-ebooks.info 105 Chapter 5: Controlling Program Flow with Decision-Making Statements Figure 5-4: The result of using == and using Java’s equals method. The more appropriate of the two techniques uses Java’s equals method. The equals method looks funny because when you call it, you put a dot after one string and put the other string in parentheses. But that’s the way you have to do it. In calling Java’s equals method, it doesn’t matter which string gets the dot and which gets the parentheses. For instance, in Listing 5-3, you could have written if (“swordfish”.equals(password)) The method would work just as well. A call to Java’s equals method looks imbalanced, but it’s not. There’s a reason behind the apparent imbalance between the dot and the parenthe- ses. The idea is that you have two objects: the password object and the “swordfish” object. Each of these two objects is of type String. (However, password is a variable of type String, and “swordfish” is a String lit- eral.) When you write password.equals(“swordfish”), you’re calling an equals method that belongs to the password object. When you call that method, you’re feeding “swordfish” to the method as the method’s param- eter (pun intended). You can read more about methods belonging to objects in Chapter 7. When comparing strings with one another, use the equals method — not the double equal sign. 10_9780470371732-ch05.indd 10510_9780470371732-ch05.indd 105 7/6/11 6:59 PM7/6/11 6:59 PM www.it-ebooks.info 106 Part II: Writing Your Own Java Programs Importing everything in one fell swoop The first line of Listing 5-3 illustrates a lazy way of importing both System.out and System.in. To import everything that System has to offer, you use the asterisk wildcard character (*). In fact, importing java.lang.System.* is like having about 30 separate import declarations, including System.in, System. out, System.err, System.nanoTime, and many other System things. The use of an asterisk in an import declaration is generally considered bad programming practice, so I don’t do it often in this book’s examples. But for larger programs — programs that use dozens of names from the Java API — the lazy asterisk trick is handy. You can’t toss an asterisk anywhere you want inside an import declaration. For example, you can’t import everything starting with java by writing import java.*. You can substitute an asterisk only for the name of a class or for the name of something static that’s tucked away inside a class. For more informa- tion about asterisks in import declarations, see Chapter 9. For information about static things, see Chapter 10. Java’s logical operators Mr. Spock would be pleased. Java has all the operators that you need for mixing and matching logical tests. The operators are shown in Table 5-2. Table 5-2 Logical Operators Operator Symbol Meaning Example && and 5 < x && x < 10 || or x < 5 || 10 < x ! not !password.equals(“swordfish”) You can use these operators to form all kinds of elaborate conditions. Listing 5-4 has an example. 10_9780470371732-ch05.indd 10610_9780470371732-ch05.indd 106 7/6/11 6:59 PM7/6/11 6:59 PM www.it-ebooks.info 107 Chapter 5: Controlling Program Flow with Decision-Making Statements Listing 5-4: Checking Username and Password import javax.swing.JOptionPane; class Authenticator { public static void main(String args[]) { String username = JOptionPane.showInputDialog(“Username:”); String password = JOptionPane.showInputDialog(“Password:”); if ( username != null && password != null && ( (username.equals(“bburd”) && password.equals(“swordfish”)) || (username.equals(“hritter”) && password.equals(“preakston”)) ) ) { JOptionPane.showMessageDialog (null, “You’re in.”); } else { JOptionPane.showMessageDialog (null, “You’re suspicious.”); } } } Several runs of the program of Listing 5-4 are shown in Figure 5-5. When the user- name is bburd and the password is swordfish or when the username is hritter and the password is preakston, the user gets a nice message. Otherwise, the user is a bum who gets the nasty message that he or she deserves. Figure 5-5 is a fake! To help you read the usernames and passwords, I added an extra statement to Listing 5-4. The extra statement (UIManager. put(“TextField.font”, new Font(“Dialog”, Font.BOLD, 14))) enlarges each text field’s font size. Yes, I modified the code before creating the figure. Shame on me! 10_9780470371732-ch05.indd 10710_9780470371732-ch05.indd 107 7/6/11 6:59 PM7/6/11 6:59 PM www.it-ebooks.info 108 Part II: Writing Your Own Java Programs Figure 5-5: Several runs of the code from Listing 5-4. Listing 5-4 illustrates a new way to get user input; namely, to show the user an input dialog. The statement String password = JOptionPane.showInputDialog(“Password:”); in Listing 5-4 performs more or less the same task as the statement String password = keyboard.next(); from Listing 5-3. The big difference is, while keyboard.next() displays dull- looking text in a console, JOptionPane.showInputDialog(“Username:”) displays a fancy dialog box containing a text field and buttons. (Compare Figures 5-4 and 5-5.) When the user clicks OK, the computer takes whatever text is in the text field and hands that text over to a variable. In fact, Listing 5-4 uses JOptionPane.showInputDialog twice — once to get a value for the user name variable, and a second time to get a value for the password variable. 10_9780470371732-ch05.indd 10810_9780470371732-ch05.indd 108 7/6/11 6:59 PM7/6/11 6:59 PM www.it-ebooks.info 109 Chapter 5: Controlling Program Flow with Decision-Making Statements Near the end of Listing 5-4, I use a slight variation on the JOptionPane business, JOptionPane.showMessageDialog (null, “You’re in.”); With showMessageDialog, I show a very simple dialog box — a box with no text field. (Again, see Figure 5-5.) Like thousands of other names, the name JOptionPane is defined in Java’s API. (To be more specific, JOptionPane is defined inside something called javax.swing, which in turn is defined inside Java’s API.) So to use the name JOptionPane throughout Listing 5-4, I import javax.swing.JOptionPane at the top of the listing. In Listing 5-4, JOptionPane.showInputDialog works nicely because the user’s input (username and password) are mere strings of characters. If you want the user to input a number (an int or a double, for exam- ple), you have to do some extra work. For example, to get an int value from the user, type something like int numberOfCows = Integer. parseInt(JOptionPane.showInputDialog(“How many cows?”)). The extra Integer.parseInt stuff forces your text field’s input to be an int value. To get a double value from the user, type something like double fractionOfHolsteins = Double.parseDouble(JOptionPane. showInputDialog(“Holsteins:”)). The extra Double.parseDouble business forces your text field’s input to be a double value. Vive les nuls! The French translations of For Dummies books are books Pour les Nuls. So a “dummy” in English is a “nul” in French. But in Java, the word null means “nothing.” When you see if ( username != null in Listing 5-4, you can imagine that you see if ( username isn’t nothing 10_9780470371732-ch05.indd 10910_9780470371732-ch05.indd 109 7/6/11 6:59 PM7/6/11 6:59 PM www.it-ebooks.info 110 Part II: Writing Your Own Java Programs or if ( username has any value at all To find out how username can have no value, see the last row in Figure 5-5. When you click Cancel in the first dialog box, the computer hands null to your program. So in Listing 5-4, the variable username becomes null. The comparisons username != null checks to make sure that you haven’t clicked Cancel in the program’s first dialog box. The comparison password != null performs the same kind of check for the program’s second dialog box. When you see the if statement in Listing 5-4, you can imagine that you see the following: if ( you didn’t press Cancel in the username dialog and you didn’t press Cancel in the password dialog and ( (you typed “bburd” in the username dialog) and you typed “swordfish” in the password dialog)) or (you typed “hritter” in the username dialog) and you typed “preakston” in the password dialog)) ) ) In Listing 5-4, the comparisons username != null and password != null are not optional. If you forget to include these and click Cancel when the pro- gram runs, you get a nasty NullPointerException message, and the program comes crashing down before your eyes. The word null represents nothing, and in Java, you can’t compare nothing to a string like “bburd” or “swordfish”. In Listing 5-4, the purpose of the comparison username != null is to prevent Java from moving on to check username.equals(“bburd”) whenever you happen to click Cancel. Without this preliminary username != null test, you’re courting trouble. The last couple of nulls in Listing 5-4 are different from the others. In the code JOptionPane.showMessageDialog (null, “You’re in.”), the word null stands for “no other dialog box.” In particular, the call showMessageDialog tells Java to pop up a new dialog box, and the word null indicates that the new dialog box doesn’t grow out of any existing dialog box. One way or another, Java insists that you say something about the origin of the newly popped dialog box. (For some reason, Java doesn’t insist that you specify the origin of the showInputDialog box. Go figure!) Anyway, in Listing 5-4, having a showMessageDialog box pop up from nowhere is quite useful. 10_9780470371732-ch05.indd 11010_9780470371732-ch05.indd 110 7/6/11 6:59 PM7/6/11 6:59 PM www.it-ebooks.info 111 Chapter 5: Controlling Program Flow with Decision-Making Statements (Conditions in parentheses) Keep an eye on those parentheses! When you’re combining conditions with logical operators, it’s better to waste typing effort and add unneeded paren- theses than to goof up your result by using too few parentheses. Take, for example, the expression 2 < 5 || 100 < 6 && 27 < 1 By misreading this expression, you might conclude that the expression is false. That is, you could wrongly read the expression as meaning (something- or-other) && 27 < 1. Because 27 < 1 is false, you would conclude that the whole expression is false. The fact is that, in Java, any && operator is evaluated before any || operator. So the expression really asks if 2 < 5 || (something-or-other). Because 2 < 5 is true, the whole expression is true. To change the expression’s value from true to false, you can put the expression’s first two comparisons in parentheses, like this: (2 < 5 || 100 < 6) && 27 < 1 Java’s || operator is inclusive. This means that you get a true value when- ever the thing on the left side is true, the thing on the right side is true, or both things are true. For instance, the expression 2 < 10 || 20 < 30 is true. In Java, you can’t combine comparisons the way you do in ordinary English. In English, you may say, “We’ll have between three and ten people at the dinner table.” But in Java, you get an error message if you write 3 <= people <= 10. To do this comparison, you need something like 3 <= people && people <= 10. In Listing 5-4, the if statement’s condition has more than a dozen parenthe- ses. What happens if you omit two of them? if ( username != null && password != null && // open parenthesis omitted (username.equals(“bburd”) && password.equals(“swordfish”)) || (username.equals(“hritter”) && password.equals(“preakston”)) // close parenthesis omitted ) 10_9780470371732-ch05.indd 11110_9780470371732-ch05.indd 111 7/6/11 6:59 PM7/6/11 6:59 PM www.it-ebooks.info 112 Part II: Writing Your Own Java Programs Java tries to interpret your wishes by grouping everything before the “or” (the || operator): if ( username != null && password != null && (username.equals(“bburd”) && password.equals(“swordfish”)) || (username.equals(“hritter”) && password.equals(“preakston”)) ) When the user clicks Cancel and username is null, Java says, “Okay! The stuff before the || operator is false, but maybe the stuff after the || operator is true. I’ll check the stuff after the || operator to find out if it’s true.” (Java often talks to itself. The psychiatrists are monitoring this situation.) Anyway, when Java finally checks username.equals(“hritter”), your program aborts with an ugly NullPointerException message. You’ve made Java angry by trying to apply .equals to a null username. (Psychiatrists have recommended anger management sessions for Java, but Java’s insurance plan refuses to pay for the sessions.) Building a Nest Have you seen those cute Russian Matryoshka nesting dolls? Open up one, and another one is inside. Open up the second, and a third one is inside it. You can do the same thing with Java’s if statements. (Talk about fun!) Listing 5-5 shows you how. Listing 5-5: Nested if Statements import static java.lang.System.out; import java.util.Scanner; class Authenticator2 { 10_9780470371732-ch05.indd 11210_9780470371732-ch05.indd 112 7/6/11 6:59 PM7/6/11 6:59 PM www.it-ebooks.info 113 Chapter 5: Controlling Program Flow with Decision-Making Statements public static void main(String args[]) { Scanner keyboard = new Scanner(System.in); out.print(“Username: “); String username = keyboard.next(); if (username.equals(“bburd”)) { out.print(“Password: “); String password = keyboard.next(); if (password.equals(“swordfish”)) { out.println(“You’re in.”); } else { out.println(“Incorrect password”); } } else { out.println(“Unknown user”); } } } Figure 5-6 shows several runs of the code in Listing 5-5. The main idea is that to log on, you have to pass two tests. (In other words, two conditions must be true.) The first condition tests for a valid username; the second condition tests for the correct password. If you pass the first test (the username test), you march right into another if statement that performs a second test (the password test). If you fail the first test, you never make it to the second test. Figure 5-7 shows the overall plan. Figure 5-6: Three runs of the code in Listing 5-5. 10_9780470371732-ch05.indd 11310_9780470371732-ch05.indd 113 7/6/11 6:59 PM7/6/11 6:59 PM www.it-ebooks.info 114 Part II: Writing Your Own Java Programs Figure 5-7: Don’t try eating with this fork. Does username equal "bburd"? Does password equal "swordfish"? no yes no yes Unknown user You're inIncorrect password The code in Listing 5-5 does a good job with nested if statements, but it does a terrible job with real-world user authentication. First, never show a password in plain view (without asterisks to masquerade the password). Second, don’t handle passwords without encrypting them. Third, don’t tell the malicious user which of the two words (the username or the password) was entered incorrectly. Fourth . . . well I could go on and on. The code in Listing 5-5 just isn’t meant to illustrate good username/password practices. Choosing among Many Alternatives (Java switch Statements) I’m the first to admit that I hate making decisions. If things go wrong, I would rather have the problem be someone else’s fault. Writing the previous sections 10_9780470371732-ch05.indd 11410_9780470371732-ch05.indd 114 7/6/11 6:59 PM7/6/11 6:59 PM www.it-ebooks.info 115 Chapter 5: Controlling Program Flow with Decision-Making Statements (on making decisions with Java’s if statement) knocked the stuffing right out of me. That’s why my mind boggles as I begin this section on choosing among many alternatives. What a relief it is to have that confession out of the way! Your basic switch statement Now, it’s time to explore situations in which you have a decision with many branches. Take, for instance, the popular campfire song “Al’s All Wet.” (For a review of the lyrics, see the sidebar.) You’re eager to write code that prints this song’s lyrics. Fortunately, you don’t have to type all the words over and over again. Instead, you can take advantage of the repetition in the lyrics. A complete program to display the “Al’s All Wet” lyrics won’t come until Chapter 6. In the meantime, assume that you have a variable named verse. The value of verse is 1, 2, 3, or 4, depending on which verse of “Al’s All Wet” you’re trying to print. You could have a big, clumsy bunch of if statements that checks each possible verse number. “Al’s All Wet” Sung to the tune of “Gentille Alouette”: Al’s all wet. Oh, why is Al all wet? Oh, Al’s all wet ’cause he’s standing in the rain. Why is Al out in the rain? That’s because he has no brain. Has no brain, has no brain, In the rain, in the rain. Ohhhhhhhh. . . . Al’s all wet. Oh, why is Al all wet? Oh, Al’s all wet ’cause he’s standing in the rain. Why is Al out in the rain? That’s because he is a pain. He’s a pain, he’s a pain, Has no brain, has no brain, In the rain, in the rain. Ohhhhhhhh. . . . Al’s all wet. Oh, why is Al all wet? Oh, Al’s all wet ’cause he’s standing in the rain. Why is Al out in the rain? ’Cause this is the last refrain. Last refrain, last refrain, He’s a pain, he’s a pain, Has no brain, has no brain, In the rain, in the rain. Ohhhhhhhh. . . . Al’s all wet. Oh, why is Al all wet? Oh, Al’s all wet ’cause he’s standing in the rain. –Harriet Ritter and Barry Burd 10_9780470371732-ch05.indd 11510_9780470371732-ch05.indd 115 7/6/11 6:59 PM7/6/11 6:59 PM www.it-ebooks.info 116 Part II: Writing Your Own Java Programs if (verse == 1) { out.println(“That’s because he has no brain.”); } if (verse == 2) { out.println(“That’s because he is a pain.”); } if (verse == 3) { out.println(“’Cause this is the last refrain.”); } But that approach seems wasteful. Why not create a statement that checks the value of verse just once and then takes an action based on the value that it finds? Fortunately, just such a statement exists. It’s called a switch state- ment. Listing 5-6 has an example of a switch statement. Listing 5-6: A switch Statement import static java.lang.System.out; import java.util.Scanner; class JustSwitchIt { public static void main(String args[]) { Scanner keyboard = new Scanner(System.in); out.print(“Which verse? “); int verse = keyboard.nextInt(); switch (verse) { case 1: out.println(“That’s because he has no brain.”); break; case 2: out.println(“That’s because he is a pain.”); break; case 3: out.println(“’Cause this is the last refrain.”); break; default: out.println(“No such verse. Please try again.”); break; } out.println(“Ohhhhhhhh. . . .”); } } 10_9780470371732-ch05.indd 11610_9780470371732-ch05.indd 116 7/6/11 6:59 PM7/6/11 6:59 PM www.it-ebooks.info 117 Chapter 5: Controlling Program Flow with Decision-Making Statements Figure 5-8 shows two runs of the program in Listing 5-6. (Figure 5-9 illustrates the program’s overall idea.) First, the user types a number, like the number 2. Then, execution of the program reaches the top of the switch statement. The computer checks the value of the verse variable. When the computer deter- mines that the verse variable’s value is 2, the computer checks each case of the switch statement. The value 2 doesn’t match the topmost case, so the computer proceeds on to the middle of the three cases. The value posted for the middle case (the number 2) matches the value of the verse variable, so the computer executes the statements that come immediately after case 2. These two statements are out.println(“That’s because he is a pain.”); break; The first of the two statements displays the line That’s because he is a pain. on the screen. The second statement is called a break statement. (What a surprise!) When the computer encounters a break statement, the computer jumps out of whatever switch statement it’s in. So, in Listing 5-6, the computer skips right past the case that would display ’Cause this is the last refrain. In fact, the computer jumps out of the entire switch statement and goes straight to the statement just after the end of the switch statement. The computer displays Ohhhhhhhh. . . . because that’s what the statement after the switch statement tells the computer to do. Figure 5-8: Running the code of Listing 5-6 two times. If the pesky user asks for verse 6, the computer responds by dropping past cases 1, 2, and 3. Instead, the computer does the default. In the default, the computer displays No such verse. Please try again, and then breaks out of the switch statement. After the computer is out of the switch state- ment, the computer displays Ohhhhhhhh. . . . 10_9780470371732-ch05.indd 11710_9780470371732-ch05.indd 117 7/6/11 6:59 PM7/6/11 6:59 PM www.it-ebooks.info 118 Part II: Writing Your Own Java Programs Figure 5-9: The big fork in the code of Listing 5-6. Which verse is this? Has no brain Ohhhhhhhh.... 1 Is a pain 2 Last refrain 3 Try again other You don’t really need to put a break at the very end of a switch statement. In Listing 5-6, the last break (the break that’s part of the default) is just for the sake of overall tidiness. To break or not to break In every Java programmer’s life, a time comes when he or she forgets to use break statements. At first, the resulting output is confusing, but then the programmer remembers fall-through. The term fall-through describes what happens when you end a case without a break statement. What hap- pens is that execution of the code falls right through to the next case in line. Execution keeps falling through until you eventually reach a break statement or the end of the entire switch statement. Usually, when you’re using a switch statement, you don’t want fall-through, so you pepper break statements throughout the switch statements. But, occasionally, fall-through is just the thing you need. Take, for instance, the “Al’s All Wet” song. (The classy lyrics are shown in the sidebar bearing the 10_9780470371732-ch05.indd 11810_9780470371732-ch05.indd 118 7/6/11 6:59 PM7/6/11 6:59 PM www.it-ebooks.info 119 Chapter 5: Controlling Program Flow with Decision-Making Statements song’s name.) Each verse of “Al’s All Wet” adds new lines in addition to the lines from previous verses. This situation (accumulating lines from one verse to another) cries out for a switch statement with fall-through. Listing 5-7 demonstrates the idea. Listing 5-7: A switch Statement with Fall-Through import static java.lang.System.out; import java.util.Scanner; class FallingForYou { public static void main(String args[]) { Scanner keyboard = new Scanner(System.in); out.print(“Which verse? “); int verse = keyboard.nextInt(); switch (verse) { case 3: out.print(“Last refrain, “); out.println(“last refrain,”); case 2: out.print(“He’s a pain, “); out.println(“he’s a pain,”); case 1: out.print(“Has no brain, “); out.println(“has no brain,”); } out.println(“In the rain, in the rain.”); out.println(“Ohhhhhhhh...”); out.println(); } } Figure 5-10 shows several runs of the program in Listing 5-7. Because the switch has no break statements in it, fall-through happens all over the place. For instance, when the user selects verse 2, the computer executes the two statements in case 2: out.print(“He’s a pain, “); out.println(“he’s a pain,”); 10_9780470371732-ch05.indd 11910_9780470371732-ch05.indd 119 7/6/11 6:59 PM7/6/11 6:59 PM www.it-ebooks.info 120 Part II: Writing Your Own Java Programs Then, the computer marches right on to execute the two statements in case 1: out.print(“Has no brain, “); out.println(“has no brain,”); That’s good, because the song’s second verse has all these lines in it. Figure 5-10: Running the code of Listing 5-7 four times. Notice what happens when the user asks for verse 6. The switch statement in Listing 5-7 has no case 6 and no default, so none of the actions inside the switch statement are executed. Even so, with statements that print In the rain, in the rain and Ohhhhhhhh. . . right after the switch state- ment, the computer displays something when the user asks for verse 6. Along comes Java 7 In Listings 5-6 and 5-7, the variable verse (an int value) steers the switch statement to one case or another. An int value inside a switch statement works in any version of Java, old or new. (For that matter, char values and a few other kinds of values have worked in Java’s switch statements ever since Java was a brand new language.) But if you live in the fast lane and you’re using Java 7, you can set it up so that the case to be executed in a switch statement depends on the value of 10_9780470371732-ch05.indd 12010_9780470371732-ch05.indd 120 7/6/11 6:59 PM7/6/11 6:59 PM www.it-ebooks.info 121 Chapter 5: Controlling Program Flow with Decision-Making Statements a particular string. Listing 5-8 illustrates the use of strings in switch state- ments. Figure 5-11 shows a run of the code in Listing 5-8. Listing 5-8: A switch Statement with a String import static java.lang.System.out; import java.util.Scanner; class SwitchIt7 { public static void main(String args[]) { Scanner keyboard = new Scanner(System.in); out.print(“Which verse (one, two or three)? “); String verse = keyboard.next(); switch (verse) { case “one”: out.println(“That’s because he has no brain.”); break; case “two”: out.println(“That’s because he is a pain.”); break; case “three”: out.println(“’Cause this is the last refrain.”); break; default: out.println(“No such verse. Please try again.”); break; } out.println(“Ohhhhhhhh. . . .”); } } Figure 5-11: Running the code of Listing 5-8. If you’re using Java 6, or an older version of Java, then you can’t have a string decide the fate of a switch statement. 10_9780470371732-ch05.indd 12110_9780470371732-ch05.indd 121 7/6/11 6:59 PM7/6/11 6:59 PM www.it-ebooks.info 122 Part II: Writing Your Own Java Programs 10_9780470371732-ch05.indd 12210_9780470371732-ch05.indd 122 7/6/11 6:59 PM7/6/11 6:59 PM www.it-ebooks.info Chapter 6 Controlling Program Flow with Loops In This Chapter ▶ Using basic looping ▶ Counting as you loop ▶ Repeating relentlessly (until the user gives you a clear answer) In 1966, the company that brings you Head & Shoulders shampoo made history. On the back of the bottle, the directions for using the shampoo read, “LATHER-RINSE-REPEAT.” Never before had a complete set of direc- tions (for doing anything, let alone shampooing your hair) been summarized so succinctly. People in the direction-writing business hailed this as a monu- mental achievement. Directions like these stood in stark contrast to others of the time. (For instance, the first sentence on a can of bug spray read, “Turn this can so that it points away from your face.” Duh!) Aside from their brevity, the thing that made the Head & Shoulders direc- tions so cool was that, with three simple words, it managed to capture a notion that’s at the heart of all instruction-giving — the notion of repetition. That last word, REPEAT, took an otherwise bland instructional drone and turned it into a sophisticated recipe for action. The fundamental idea is that when you’re following directions, you don’t just follow one instruction after another. Instead, you take turns in the road. You make decisions (“If HAIR IS DRY, then USE CONDITIONER,”) and you go into loops (“LATHER-RINSE, and then LATHER-RINSE again.”). In computer programming, you use decision making and looping all the time. This chapter explores looping in Java. 11_9780470371732-ch06.indd 12311_9780470371732-ch06.indd 123 7/6/11 6:59 PM7/6/11 6:59 PM www.it-ebooks.info 124 Part II: Writing Your Own Java Programs Repeating Instructions Over and Over Again (Java while Statements) Here’s a guessing game for you. The computer generates a random number from 1 to 10. The computer asks you to guess the number. If you guess incor- rectly, the game continues. As soon as you guess correctly, the game is over. Listing 6-1 shows the program to play the game, and Figure 6-1 shows a round of play. Listing 6-1: A Repeating Guessing Game import static java.lang.System.out; import java.util.Scanner; import java.util.Random; class GuessAgain { public static void main(String args[]) { Scanner keyboard = new Scanner(System.in); int numGuesses = 0; int randomNumber = new Random().nextInt(10) + 1; out.println(“ ************ “); out.println(“Welcome to the Guessing Game”); out.println(“ ************ “); out.println(); out.print(“Enter an int from 1 to 10: “); int inputNumber = keyboard.nextInt(); numGuesses++; while (inputNumber != randomNumber) { out.println(); out.println(“Try again...”); out.print(“Enter an int from 1 to 10: “); inputNumber = keyboard.nextInt(); numGuesses++; } out.print(“You win after “); out.println(numGuesses + “ guesses.”); } } In Figure 6-1, the user makes four guesses. Each time around, the computer checks to see whether the guess is correct. An incorrect guess generates a request to try again. For a correct guess, the user gets a rousing You win, 11_9780470371732-ch06.indd 12411_9780470371732-ch06.indd 124 7/6/11 6:59 PM7/6/11 6:59 PM www.it-ebooks.info 125 Chapter 6: Controlling Program Flow with Loops along with a tally of the number of guesses he or she made. The computer repeats several statements, checking each time through to see whether the user’s guess is the same as a certain randomly generated number. Each time the user makes a guess, the computer adds 1 to its tally of guesses. When the user makes the correct guess, the computer displays that tally. Figure 6-2 illustrates the flow of action. Figure 6-1: Play until you drop. When you look over Listing 6-1, you see the code that does all this work. At the core of the code is a thing called a while statement (also known as a while loop). Rephrased in English, the while statement says: Figure 6-2: Around and around you go. Welcome to the Guessing Game Enter an int from 1 to 10: Get inputNumber from the user Add 1 to numGuesses Try again... Enter an int from 1 to 10: Get inputNumber from the user Add 1 to numGuesses Compare inputNumber and randomNumber You win after numGuesses They're the same They're different 11_9780470371732-ch06.indd 12511_9780470371732-ch06.indd 125 7/6/11 6:59 PM7/6/11 6:59 PM www.it-ebooks.info 126 Part II: Writing Your Own Java Programs while the inputNumber is not equal to the randomNumber keep doing all the stuff in curly braces: { } The stuff in curly braces (the stuff that repeats) is the code that prints Try again, Enter an int . . ., gets a value from the keyboard, and adds 1 to the count of the user’s guesses. When you’re dealing with counters, like numGuesses in Listing 6-1, you may easily become confused and be off by 1 in either direction. You can avoid this headache by making sure that the ++ statements stay close to the state- ments whose events you’re counting. For example, in Listing 6-1, the variable numGuesses starts with a value of 0. That’s because, when the program starts running, the user hasn’t made any guesses. Later in the program, right after each call to keyboard.nextInt, is a numGuesses++ statement. That’s how you do it — you increment the counter as soon as the user enters another guess. The statements in curly braces are repeated as long as inputNumber != randomNumber is true. Each repetition of the statements in the loop is called an iteration of the loop. In Figure 6-1, the loop undergoes three itera- tions. (If you don’t believe that Figure 6-1 has exactly three iterations, count the number of Try again printings in the program’s output. A Try again appears for each incorrect guess.) When, at long last, the user enters the correct guess, the computer goes back to the top of the while statement, checks the condition in parentheses, and finds itself in double double-negative land. The not equal (!=) relation- ship between inputNumber and randomNumber no longer holds. In other words, the while statement’s condition, inputNumber != random Number, is false. Because the while statement’s condition is false, the computer jumps past the while loop and goes on to the statements just below the while loop. In these two statements, the computer prints You win after 4 guesses. With code of the kind shown in Listing 6-1, the computer never jumps out in mid-loop. When the computer finds that inputNumber isn’t equal to randomNumber, the computer marches on and executes all five statements inside the loop’s curly braces. The computer performs the test again (to see whether inputNumber is still not equal to randomNumber) only after it fully executes all five statements in the loop. 11_9780470371732-ch06.indd 12611_9780470371732-ch06.indd 126 7/6/11 6:59 PM7/6/11 6:59 PM www.it-ebooks.info 127 Chapter 6: Controlling Program Flow with Loops Repeating a Certain Number of Times (Java for Statements) “Write ‘I will not talk in class’ on the blackboard 100 times.” What your teacher really meant was, Set the count to 0. As long as the count is less than 100, Write ‘I will not talk in class’ on the blackboard, Add 1 to the count. Fortunately, you didn’t know about loops and counters at the time. If you pointed out all this stuff to your teacher, you’d have gotten into a lot more trouble than you were already in. One way or another, life is filled with examples of counting loops. And com- puter programming mirrors life — or is it the other way around? When you tell a computer what to do, you’re often telling the computer to print three lines, process ten accounts, dial a million phone numbers, or whatever. Because counting loops is so common in programming, the people who create programming languages have developed statements just for loops of this kind. In Java, the statement that repeats something a certain number of times is called a for statement. Listings 6-2 and 6-3 illustrate the use of the for statement. Listing 6-2 has a rock-bottom simple example, and Listing 6-3 has a more exotic example. Take your pick. Listing 6-2: The World’s Most Boring for Loop import static java.lang.System.out; class Yawn { public static void main(String args[]) { for (int count = 1; count <= 10; count++) { out.print(“The value of count is “); out.print(count); out.println(“.”); } out.println(“Done!”); } } 11_9780470371732-ch06.indd 12711_9780470371732-ch06.indd 127 7/6/11 6:59 PM7/6/11 6:59 PM www.it-ebooks.info 128 Part II: Writing Your Own Java Programs Figure 6-3 shows you what you get when you run the program of Listing 6-2. (You get exactly what you deserve.) The for statement in Listing 6-2 starts by setting the count variable to 1. Then the statement tests to make sure that count is less than or equal to 10 (which it certainly is). Then the for state- ment dives ahead and executes the printing statements between the curly braces. (At this early stage of the game, the computer prints The value of count is 1.) Finally, the for statement does that last thing inside its parentheses — it adds 1 to the value of count. With count now equal to 2, the for statement checks again to make sure that count is less than or equal to 10. (Yes, 2 is smaller than 10.) Because the test turns out okay, the for statement marches back into the curly braced statements and prints The value of count is 2 on the screen. Finally, the for statement does that last thing inside its parentheses — it adds 1 to the value of count, increasing the value of count to 3. Figure 6-3: Counting to ten. And so on. This whole thing repeats until, after 10 iterations, the value of count finally reaches 11. When this happens, the check for count being less than or equal to 10 fails, and the loop’s execution ends. The computer jumps to whatever statement comes immediately after the for statement. In Listing 6-2, the computer prints Done! Figure 6-4 illustrates the whole process. The anatomy of a for statement After the word for, you always put three things in parentheses. The first of these three things is called an initialization, the second is an expression, and the third thing is called an update. for ( initialization ; expression ; update ) Each of the three items in parentheses plays its own distinct role: ✓ The initialization is executed once, when the run of your program first reaches the for statement. ✓ The expression is evaluated several times (before each iteration). ✓ The update is also evaluated several times (at the end of each iteration). 11_9780470371732-ch06.indd 12811_9780470371732-ch06.indd 128 7/6/11 6:59 PM7/6/11 6:59 PM www.it-ebooks.info 129 Chapter 6: Controlling Program Flow with Loops Figure 6-4: The action of the for loop in Listing 6-2. Set count to 1 The value of count is ... Add 1 to count Is count less than or equal to 10? Done yes no If it helps, think of the loop as if its text is shifted all around: int count = 1 for count <= 10 { out.print(“The value of count is “); out.print(count); out.println(“.”); count++ } You can’t write a real for statement this way. Even so, this is the order in which the parts of the statement are executed. If you declare a variable in the initialization of a for loop, you can’t use that variable outside the loop. For instance, in Listing 6-2, you get an error message if you try putting out.println(count) after the end of the loop. Anything that can be done with a for loop can also be done with a while loop. Choosing to use a for loop is a matter of style and convenience, not necessity. The world premiere of “Al’s All Wet” Listing 6-2 is very nice, but the program in that listing doesn’t do anything interesting. For a more eye-catching example, see Listing 6-3. In Listing 6-3, I make good on a promise I made in Chapter 5. The program in Listing 6-3 prints all the lyrics of the hit single, “Al’s All Wet.” (You can find the lyrics in Chapter 5.) 11_9780470371732-ch06.indd 12911_9780470371732-ch06.indd 129 7/6/11 6:59 PM7/6/11 6:59 PM www.it-ebooks.info 130 Part II: Writing Your Own Java Programs Listing 6-3: The Unabridged “Al’s All Wet” Song import static java.lang.System.out; class AlsAllWet { public static void main(String args[]) { for (int verse = 1; verse <= 3; verse++) { out.print(“Al’s all wet. “); out.println(“Oh, why is Al all wet? Oh,”); out.print(“Al’s all wet ‘cause “); out.println(“he’s standing in the rain.”); out.println(“Why is Al out in the rain?”); switch (verse) { case 1: out.println(“That’s because he has no brain.”); break; case 2: out.println(“That’s because he is a pain.”); break; case 3: out.println(“’Cause this is the last refrain.”); break; } switch (verse) { case 3: out.println(“Last refrain, last refrain,”); case 2: out.println(“He’s a pain, he’s a pain,”); case 1: out.println(“Has no brain, has no brain,”); } out.println(“In the rain, in the rain.”); out.println(“Ohhhhhhhh...”); out.println(); } out.print(“Al’s all wet. “); out.println(“Oh, why is Al all wet? Oh,”); out.print(“Al’s all wet ‘cause “); out.println(“he’s standing in the rain.”); } } 11_9780470371732-ch06.indd 13011_9780470371732-ch06.indd 130 7/6/11 6:59 PM7/6/11 6:59 PM www.it-ebooks.info 131 Chapter 6: Controlling Program Flow with Loops Listing 6-3 is nice because it combines many of the ideas from Chapters 5 and 6. In Listing 6-3, two switch statements are nested inside a for loop. One of the switch statements uses break statements; the other switch statement uses fall-through. As the value of the for loop’s counter variable (verse) goes from 1 to 2 and then to 3, all the cases in the switch statements are executed. When the program is near the end of its run and execution has dropped out of the for loop, the program’s last four statements print the song’s final verse. When I boldly declare that a for statement is for counting, I’m stretching the truth just a bit. Java’s for statement is very versatile. You can use a for state- ment in situations that have nothing to do with counting. For instance, a state- ment with no update part, such as for (i = 0; i < 10; ), just keeps on going. The looping ends when some action inside the loop assigns a big number to the variable i. You can even create a for statement with nothing inside the parentheses. The loop for ( ; ; ) runs forever, which is good if the loop controls a serious piece of machinery. Usually, when you write a for statement, you’re counting how many times to repeat something. But, in truth, you can do just about any kind of repetition with a for statement. Listing 6-3 uses break statements to jump out of a switch. But a break statement can also play a role inside a loop. To see an example, visit this book’s website. Repeating Until You Get What You Want (Java do Statements) “Fools rush in where angels fear to tread.” –Alexander Pope Today, I want to be young and foolish (or, at the very least, foolish). Look back at Figure 6-2 and notice how Java’s while loop works. When execu- tion enters a while loop, the computer checks to make sure that the loop’s condition is true. If the condition isn’t true, the statements inside the loop are never executed — not even once. In fact, you can easily cook up a while loop whose statements are never executed (although I can’t think of a reason why you would ever want to do it). 11_9780470371732-ch06.indd 13111_9780470371732-ch06.indd 131 7/6/11 6:59 PM7/6/11 6:59 PM www.it-ebooks.info 132 Part II: Writing Your Own Java Programs int twoPlusTwo = 2 + 2; while (twoPlusTwo == 5) { out.println(“Are you kidding?”); out.println(“2 + 2 doesn’t equal 5”); out.print(“Everyone knows that”); out.println(“ 2 + 2 equals 3”); } In spite of this silly twoPlusTwo example, the while statement turns out to be the most versatile of Java’s looping constructs. In particular, the while loop is good for situations in which you must look before you leap. For exam- ple, “While money is in my account, write a mortgage check every month.” When you first encounter this statement, if your account has a zero balance, you don’t want to write a mortgage check — not even one check. But at times (not many), you want to leap before you look. Take, for instance, the situation in which you’re asking the user for a response. Maybe the user’s response makes sense, but maybe it doesn’t. If it doesn’t, you want to ask again. Maybe the user’s finger slipped, or perhaps the user didn’t understand the question. Figure 6-5 shows some runs of a program to delete a file. Before deleting the file, the program asks the user whether making the deletion is okay. If the user answers y or n, the program proceeds according to the user’s wishes. But if the user enters any other character (any digit, uppercase letter, punctuation symbol, or whatever), the program asks the user for another response. Figure 6-5: Two runs of the code in Listing 6-4. To write this program, you need a loop — a loop that repeatedly asks the user whether the file should be deleted. The loop keeps asking until the user gives a meaningful response. Now, the thing to notice is that the loop doesn’t need to check anything before asking the user the first time. Indeed, before the user gives the first response, the loop has nothing to check. The loop doesn’t start with “as long as such-and-such is true, then get a response from the user.” Instead, the loop just leaps ahead, gets a response from the user, and then checks the response to see if it makes sense. 11_9780470371732-ch06.indd 13211_9780470371732-ch06.indd 132 7/6/11 6:59 PM7/6/11 6:59 PM www.it-ebooks.info 133 Chapter 6: Controlling Program Flow with Loops That’s why the program in Listing 6-4 has a do loop (also known as a do . . . while loop). With a do loop, the program jumps right in, takes action, and then checks a condition to see whether the result of the action makes sense. If the result makes sense, execution of the loop is done. If not, the program goes back to the top of the loop for another go-around. Listing 6-4: To Delete or Not to Delete import java.io.File; import static java.lang.System.out; import java.util.Scanner; class DeleteEvidence { public static void main(String args[]) { File evidence = new File(“cookedBooks.txt”); Scanner keyboard = new Scanner(System.in); char reply; do { out.print(“Delete evidence? (y/n) “); reply = keyboard.findWithinHorizon(“.”,0).charAt(0); } while (reply != ‘y’ && reply != ‘n’); if (reply == ‘y’) { out.println(“Okay, here goes...”); evidence.delete(); out.println(“The evidence has been deleted.”); } else { out.println(“Sorry, buddy. Just asking.”); } } } Figure 6-5 shows two runs of the code in Listing 6-4. The program accepts lowercase letters y and n, but not the uppercase letters Y and N. To make the program accept uppercase letters, change the conditions in the code as follows: do { out.print(“Delete evidence? (y/n) “); reply = keyboard.findWithinHorizon(“.”, 0).charAt(0); } while (reply != ‘y’ && reply != ‘Y’ && reply != ‘n’ && reply!=’N’); if (reply == ‘y’ || reply == ‘Y’) { 11_9780470371732-ch06.indd 13311_9780470371732-ch06.indd 133 7/6/11 6:59 PM7/6/11 6:59 PM www.it-ebooks.info 134 Part II: Writing Your Own Java Programs Figure 6-6 shows the flow of control in the loop of Listing 6-4. With a do loop, the situation in the twoPlusTwo program (shown at the beginning of this section) can never happen. Because the do loop carries out its first action without testing a condition, every do loop is guaranteed to perform at least one iteration. Figure 6-6: Here we go loop, do loop. Delete evidence? Delete the file, or don't delete the file (depending on the reply) Was the reply either y or n?no yes The location of Listing 6-4’s cookedBooks.txt file on your computer’s hard drive depends on several things. If you create a cookedBooks.txt file in the wrong directory, then the code in Listing 6-4 cannot delete your file. (More precisely, if cookedBooks.txt is in the wrong directory on your hard drive, then the code in Listing 6-4 can’t find the cookedBooks.txt file in prepara- tion for deleting the file.) In most settings, you start testing Listing 6-4 by cre- ating a project within your IDE. The new project lives in a folder on your hard drive, and the cookedBooks.txt file belongs directly inside that folder. For example, with the Eclipse IDE, I have a project named Listing06-04. That project lives on my hard drive in a folder named c:\Users\my-user-name\ workspace\Listing06-04. Inside that folder, I have a file named cooked Books.txt (until I delete the file with the code in Listing 6-4). Also in that Listing06-04 folder I have a subfolder named src. My DeleteEvidence. java file is directly inside that Listing06-04 folder. For more information about files and their folders, see Chapter 8. Reading a single character Back in Listing 5-3, the user types a word on the keyboard. The keyboard. next method grabs the word and places the word into a String variable named password. Everything works nicely because a String variable can store many characters at once and the next method can read many charac- ters at once. 11_9780470371732-ch06.indd 13411_9780470371732-ch06.indd 134 7/6/11 6:59 PM7/6/11 6:59 PM www.it-ebooks.info 135 Chapter 6: Controlling Program Flow with Loops But in Listing 6-4, you’re not interested in reading several characters. You expect the user to type one letter — either y or n. So you don’t create a String variable to store the user’s response. Instead, you create a char variable — a variable that stores just one symbol at a time. The Java API doesn’t have a nextChar method. So to read something suit- able for storage in a char variable, you have to improvise. In Listing 6-4, the improvisation looks like this: keyboard.findWithinHorizon(“.”, 0).charAt(0) You can use this code exactly as it appears in Listing 6-4 whenever you want to read a single character. A String variable can contain many characters or just one character. But a String variable that contains only one character isn’t the same as a char variable. No matter what you put in a String variable, String variables and char variables have to be treated differently. File handling in Java In Listing 6-4, the actual file-handling statements deserve some attention. These statements involve the use of classes, objects, and methods. Many of the meaty details about these things are in other chapters, like Chapters 7 and 9. Even so, I can’t do any harm by touching on some highlights right here. So, you can find a class in the Java language API named java.io.File. The statement File evidence = new File(“cookedBooks.txt”); creates a new object in the computer’s memory. This object, formed from the java.io.File class, describes everything that the program needs to know about the disk file cookedBooks.txt. From this point on in Listing 6-4, the variable evidence refers to the disk file cookedBooks.txt. After you have all this java.io.File stuff in your head, the only thing left to know is that the evidence object, being an instance of the java. io.File class, has a delete method. (What can I say? It’s in the API documentation.) When you call evidence.delete, the computer gets rid of the file for you. 11_9780470371732-ch06.indd 13511_9780470371732-ch06.indd 135 7/6/11 6:59 PM7/6/11 6:59 PM www.it-ebooks.info 136 Part II: Writing Your Own Java Programs Variable declarations and blocks A bunch of statements surrounded by curly braces forms a block. If you declare a variable inside a block, you generally can’t use that variable outside the block. For instance, in Listing 6-4, you get an error message if you make the following change: do { out.print(“Delete evidence? (y/n) “); char reply = keyboard.findWithinHorizon(“.”, 0).charAt(0); } while (reply != ‘y’ && reply != ‘n’); if (reply == ‘y’) With the declaration char reply inside the loop’s curly braces, no use of the name reply makes sense anywhere outside the braces. When you try to compile this code, you get three error messages — two for the reply words in while (reply != ‘y’ && reply != ‘n’), and a third for the if statement’s reply. So in Listing 6-4, your hands are tied. The program’s first real use of the reply variable is inside the loop. But, to make that variable available after the loop, you have to declare reply before the loop. In this situation, you’re best off declaring the reply variable without initializing the variable. Very interesting! To read more about variable initializations, see Chapter 4. To read more about blocks, see Chapter 5. All versions of Java have the three kinds of loops described in this chapter (while loops, for loops, and do . . . while loops). But newer Java versions (namely, Java 5 and beyond) have yet another kind of loop called an enhanced for loop. For a look at Java’s enhanced for loop, see Chapter 11. 11_9780470371732-ch06.indd 13611_9780470371732-ch06.indd 136 7/6/11 6:59 PM7/6/11 6:59 PM www.it-ebooks.info Part III Working with the Big Picture: Object-Oriented Programming 12_9780470371732-pp03.indd 13712_9780470371732-pp03.indd 137 7/6/11 6:59 PM7/6/11 6:59 PM www.it-ebooks.info In this part . . . Have you read or heard anything about object- oriented programming? Sometimes, all the object- oriented programmers seem to belong to a little club. They have a secret handshake, a secret sign, and a prom- ise not to reveal object-oriented programming concepts to any outsiders. Well, the secrecy is ending. In this part, I take all the mystery out of object-oriented programming. I introduce the concepts step by step and illustrate each concept with a Java program or two. 12_9780470371732-pp03.indd 13812_9780470371732-pp03.indd 138 7/6/11 6:59 PM7/6/11 6:59 PM www.it-ebooks.info Chapter 7 Thinking in Terms of Classes and Objects In This Chapter ▶ Thinking like a real object-oriented programmer ▶ Passing values to and from methods ▶ Hiding details in your object-oriented code As a computer book author, I’ve been told this over and over again — I shouldn’t expect people to read sections and chapters in their logical order. People jump around, picking what they need and skipping what they don’t feel like reading. With that in mind, I realize that you may have skipped Chapter 1. If that’s the case, please don’t feel guilty. You can compensate in just 60 seconds by reading the following information culled from Chapter 1: Because Java is an object-oriented programming language, your primary goal is to describe classes and objects. A class is the idea behind a certain kind of thing. An object is a concrete instance of a class. The programmer defines a class, and from the class definition, the computer makes individ- ual objects. Of course, you can certainly choose to skip over the 60-second summary paragraph. If that’s the case, you may want to recoup some of your losses. You can do that by reading the following two-word summary of Chapter 1: Classes; objects. 13_9780470371732-ch07.indd 13913_9780470371732-ch07.indd 139 7/6/11 6:59 PM7/6/11 6:59 PM www.it-ebooks.info 140 Part III: Working with the Big Picture: Object-Oriented Programming Defining a Class (What It Means to Be an Account) What distinguishes one bank account from another? If you ask a banker this question, you hear a long sales pitch. The banker describes interest rates, fees, penalties — the whole routine. Fortunately for you, I’m not interested in all that. Instead, I want to know how my account is different from your account. After all, my account is named Barry Burd, trading as Burd Brain Consulting, and your account is named Jane Q. Reader, trading as Budding Java Expert. My account has $24.02 in it. How about yours? When you come right down to it, the differences between one account and another can be summarized as values of variables. Maybe there’s a variable named balance. For me, the value of balance is 24.02. For you, the value of balance is 55.63. The question is, when writing a computer program to deal with accounts, how do I separate my balance variable from your balance variable? The answer is to create two separate objects. Let one balance variable live inside one of the objects and let the other balance variable live inside the other object. While you’re at it, put a name variable and an address variable in each of the objects. And there you have it — two objects, and each object represents an account. More precisely, each object is an instance of the Account class. (See Figure 7-1.) Figure 7-1: Two objects. An instance of the Account class name address balance Barry 222 Cyberspace Lane 24.02 Another instance of the Account class name address balance Jane 111 Consumer Street 55.63 So far, so good. However, you still haven’t solved the original problem. In your computer program, how do you refer to my balance variable, as opposed to your balance variable? Well, you have two objects sitting around, so maybe you have variables to refer to these two objects. Create one variable named myAccount and another variable named yourAccount. The myAccount variable refers to my object (my instance of the Account class) with all the stuff that’s inside it. To refer to my balance, write 13_9780470371732-ch07.indd 14013_9780470371732-ch07.indd 140 7/6/11 6:59 PM7/6/11 6:59 PM www.it-ebooks.info 141 Chapter 7: Thinking in Terms of Classes and Objects myAccount.balance To refer to my name, write myAccount.name Then yourAccount.balance refers to the value in your object’s balance variable, and yourAccount.name refers to the value of your object’s name variable. To tell the computer how much I have in my account, you can write myAccount.balance = 24.02; To display your name on the screen, you can write out.println(yourAccount.name); These ideas come together in Listings 7-1 and 7-2. Here’s Listing 7-1: Listing 7-1: What It Means to Be an Account public class Account { String name; String address; double balance; } The Account class in Listing 7-1 defines what it means to be an Account. In particular, Listing 7-1 tells you that each of the Account class’s instances has three variables — name, address, and balance. This is consistent with the information in Figure 7-1. Java programmers have a special name for variables of this kind (variables that belong to instances of classes). Each of these variables — name, address, and balance — is called a field. A variable declared inside a class but not inside any particular method is a field. In Listing 7-1, the variables name, address, and balance are fields. Another name for a field is an instance variable. If you’ve been grappling with the material in Chapters 4 through 6, the code for class Account (Listing 7-1) may come as a big shock to you. Can you really define a complete Java class with only four lines of code (give or take a curly brace)? You certainly can. In fact, the Account class in Listing 7-1 is quite rep- resentative of what Java programmers think of when they think class. A class is a grouping of existing things. In the Account class of Listing 7-1, those existing things are two String values and a double value. 13_9780470371732-ch07.indd 14113_9780470371732-ch07.indd 141 7/6/11 6:59 PM7/6/11 6:59 PM www.it-ebooks.info 142 Part III: Working with the Big Picture: Object-Oriented Programming A public class According to the code in Listing 7-1, the Account class is public. A public class is available for use by all other classes. So, for example, if you write an ATMController program in some remote corner of cyberspace, then your ATMController program can contain code, such as myAccount.balance = 24.02, making use of the Account class declared in Listing 7-1. (Of course, your code has to know where in cyberspace I’ve stored the code in Listing 7-1, but that’s another story.) In the next section, Listing 7-2 finally manages to use the Account class. Therefore, you might say to yourself, “The Account class has to be public because another class (the code in Listing 7-2) uses the Account class.” Unfortunately, the real lowdown about public classes is a bit more complicated. In fact, when the planets align themselves correctly, one class can make use of another class’s code, even though the other class isn’t public. And in this chap- ter, the word public in Listing 7-1 isn’t necessary. Listings 7-1 and 7-2 run just as well with or without the Account class’s being public. In Listing 7-1, declaring the Account class to be public makes me feel good. Yes, programmers do certain things in order to feel good. In this example, my esthetic sense of goodness comes from the fact that an Account class is useful to many other programmers. When I create a class that declares something useful and nameable — an Account, an Engine, a Customer, a BrainWave, a Headache, or a SevenLayerCake class — I declare the class to be public. For more news about the word public and other such words, see Chapter 13. Declaring variables and creating objects A young fellow approaches me while I’m walking down the street. He tells me to print “You’ll love Java!” so I print those words. If you must know, I print them with chalk on the sidewalk. But where I print the words doesn’t matter. What matters is that some guy issues instructions, and I follow the instructions. Later that day, an elderly woman sits next to me on a park bench. She says, “An account has a name, an address, and a balance.” And I say, “That’s fine, but what do you want me to do about it?” In response she just stares at me, so I don’t do anything about her account pronouncement. I just sit there, she sits there, and we both do absolutely nothing. Listing 7-1 is like the elderly woman. This listing defines what it means to be an Account, but the listing doesn’t tell me to do anything with my account, or with anyone else’s account. In order to do something, I need a second 13_9780470371732-ch07.indd 14213_9780470371732-ch07.indd 142 7/6/11 6:59 PM7/6/11 6:59 PM www.it-ebooks.info 143 Chapter 7: Thinking in Terms of Classes and Objects piece of code. I need another class — a class that contains a main method. Fortunately, while the woman and I sit quietly on the park bench, a young child comes by with Listing 7-2. Listing 7-2: Dealing with Account Objects import static java.lang.System.out; class UseAccount { public static void main(String args[]) { Account myAccount; Account yourAccount; myAccount = new Account(); yourAccount = new Account(); myAccount.name = “Barry Burd”; myAccount.address = “222 Cyberspace Lane”; myAccount.balance = 24.02; yourAccount.name = “Jane Q. Public”; yourAccount.address = “111 Consumer Street”; yourAccount.balance = 55.63; out.print(myAccount.name); out.print(“ (“); out.print(myAccount.address); out.print(“) has $”); out.print(myAccount.balance); out.println(); out.print(yourAccount.name); out.print(“ (“); out.print(yourAccount.address); out.print(“) has $”); out.print(yourAccount.balance); } } Taken together, the two classes — Account and UseAccount — form one complete program. The code in Listing 7-2 defines the UseAccount class, and the UseAccount class has a main method. This main method has vari- ables of its own — yourAccount and myAccount. In a way, the first two lines inside the main method of Listing 7-2 are mislead- ing. Some people read Account yourAccount as if it’s supposed to mean, “yourAccount is an Account,” or “The variable yourAccount refers to an instance of the Account class.” That’s not really what this first line means. Instead, the line Account yourAccount means, “If and when I make the variable yourAccount refer to something, that something will be an instance of the Account class.” So, what’s the difference? 13_9780470371732-ch07.indd 14313_9780470371732-ch07.indd 143 7/6/11 6:59 PM7/6/11 6:59 PM www.it-ebooks.info 144 Part III: Working with the Big Picture: Object-Oriented Programming The difference is that simply declaring Account yourAccount doesn’t make the yourAccount variable refer to an object. All the declaration does is reserve the variable name yourAccount so that the name can eventually refer to an instance of the Account class. The creation of an actual object doesn’t come until later in the code, when the computer executes new Account(). Technically, when the computer executes new Account(), you’re creating an object by calling the Account class’s constructor. I have more to say about that in Chapter 9. When the computer executes the assignment yourAccount = new Account(), the computer creates a new object (a new instance of the Account class) and makes the variable yourAccount refer to that new object. (The equal sign makes the variable refer to the new object.) Figure 7-2 illustrates the situation. Figure 7-2: Before and after a con- structor is called. After executing Account yourAccount; After executing yourAccount = new Account (); yourAccount yourAccount name address balance To test the claim that I made in the last few paragraphs, I added an extra line to the code of Listing 7-2. I tried to print yourAccount.name after declaring yourAccount, but before calling new Account(). Account myAccount; Account yourAccount; out.println(yourAccount.name); myAccount = new Account(); yourAccount = new Account(); 13_9780470371732-ch07.indd 14413_9780470371732-ch07.indd 144 7/6/11 6:59 PM7/6/11 6:59 PM www.it-ebooks.info 145 Chapter 7: Thinking in Terms of Classes and Objects When I tried to compile the new code, I got this error message: vari- able yourAccount might not have been initialized. That settles it. Before you do new Account(), you can’t print the name variable of an object because an object doesn’t exist. When a variable has a reference type, simply declaring the variable isn’t enough. You don’t get an object until you call a constructor and use the keyword new. For information about reference types, see Chapter 4. Initializing a variable In Chapter 4, I announce that you can initialize a primitive type variable as part of the variable’s declaration. int weightOfAPerson = 150; You can do the same thing with reference type variables, such as myAccount and yourAccount in Listing 7-2. You can combine the first four lines in the listing’s main method into just two lines, like this: Account myAccount = new Account(); Account yourAccount = new Account(); If you combine lines this way, you automatically avoid the variable might not have been initialized error that I describe in the previous sec- tion. Sometimes you find a situation in which you can’t initialize a variable. But when you can initialize, it’s usually a plus. Using an object’s fields After you’ve bitten off and chewed the main method’s first four lines, the rest of the code in Listing 7-2 is sensible and straightforward. You have three lines that put values in the myAccount object’s fields, three lines that put values in the yourAccount object’s fields, and four lines that do some printing. Figure 7-3 shows the program’s output. Figure 7-3: Running the code in Listings 7-1 and 7-2. 13_9780470371732-ch07.indd 14513_9780470371732-ch07.indd 145 7/6/11 6:59 PM7/6/11 6:59 PM www.it-ebooks.info 146 Part III: Working with the Big Picture: Object-Oriented Programming One program; several classes Each program in Chapters 3 to 6 consists of a single class. That’s great for a book’s introductory chapters. But in real life, a typical program consists of hundreds or even thousands of classes. The program that spans Listings 7-1 and 7-2 consists of two classes. Sure, having two classes isn’t like having thou- sands of classes, but it’s a step in that direction. In practice, most programmers put each class in a file of its own. When you create a program, such as the one in Listings 7-1 and 7-2, you create two files on your computer’s hard drive. Therefore, when you download this section’s example from the web, you get two separate files — Account.java and UseAccount.java. For information about running a program consisting of more than one .java file in Eclipse, NetBeans and IntelliJ IDEA, visit this book’s website. Defining a Method within a Class (Displaying an Account) Imagine a table containing the information about two accounts. (If you have trouble imagining such a thing, just look at Table 7-1.) Table 7-1 Without Object-Oriented Programming Name Address Balance Barry Burd 222 Cyberspace Lane 24.02 Jane Q. Public 111 Consumer Street 55.63 In Table 7-1, each account has three things — a name, an address, and a bal- ance. That’s how things were done before object-oriented programming came along. But object-oriented programming involved a big shift in thinking. With object-oriented programming, each account can have a name, an address, a balance, and a way of being displayed. In object-oriented programming, each object has its own built-in functional- ity. An account knows how to display itself. A string can tell you whether it has the same characters inside it as another string has. A PrintStream instance, such as System.out, knows how to do println. In object- oriented programming, each object has its own methods. These methods are little subprograms that you can call to have an object do things to (or for) itself. 13_9780470371732-ch07.indd 14613_9780470371732-ch07.indd 146 7/6/11 6:59 PM7/6/11 6:59 PM www.it-ebooks.info 147 Chapter 7: Thinking in Terms of Classes and Objects And why is this a good idea? It’s good because you’re making pieces of data take responsibility for themselves. With object-oriented programming, all the functionality that’s associated with an account is collected inside the code for the Account class. Everything you have to know about a string is located in the file String.java. Anything having to do with year numbers (whether they have two or four digits, for instance) is handled right inside the Year class. Therefore, if anybody has problems with your Account class or your Year class, he or she knows just where to look for all the code. That’s great! So imagine an enhanced account table. In this new table, each object has built-in functionality. Each account knows how to display itself on the screen. Each row of the table has its own copy of a display method. Of course, you don’t need much imagination to picture this table. I just happen to have a table you can look at. It’s Table 7-2. Table 7-2 The Object-Oriented Way Name Address Balance Display Barry Burd 222 Cyberspace Lane 24.02 out.print. . . . Jane Q. Public 111 Consumer Street 55.63 out.print. . . . An account that displays itself In Table 7-2, each account object has four things — a name, an address, a bal- ance, and a way of displaying itself on the screen. After you make the jump to object-oriented thinking, you’ll never turn back. Listings 7-3 and 7-4 show programs that implements the ideas in Table 7-2. Listing 7-3: An Account Displays Itself import static java.lang.System.out; public class Account { String name; String address; double balance; public void display() { out.print(name); out.print(“ (“); out.print(address); out.print(“) has $”); out.print(balance); } } 13_9780470371732-ch07.indd 14713_9780470371732-ch07.indd 147 7/6/11 6:59 PM7/6/11 6:59 PM www.it-ebooks.info 148 Part III: Working with the Big Picture: Object-Oriented Programming Listing 7-4: Using the Improved Account Class class UseAccount { public static void main(String args[]) { Account myAccount = new Account(); Account yourAccount = new Account(); myAccount.name = “Barry Burd”; myAccount.address = “222 Cyberspace Lane”; myAccount.balance = 24.02; yourAccount.name = “Jane Q. Public”; yourAccount.address = “111 Consumer Street”; yourAccount.balance = 55.63; myAccount.display(); System.out.println(); yourAccount.display(); } } A run of the code in Listings 7-3 and 7-4 looks just like a run for Listings 7-1 and 7-2. You can see the action back in Figure 7-3. In Listing 7-3, the Account class has four things in it — a name, an address, a balance, and a display method. These things match up with the four columns in Table 7-2. So each instance of the Account class has a name, an address, a balance, and a way of displaying itself. The way you call these things is nice and uniform. To refer to the name stored in myAccount, you write myAccount.name To get myAccount to display itself on the screen, you write myAccount.display() The only difference is the parentheses. When you call a method, you put parentheses after the method’s name. The display method’s header Look again at Listings 7-3 and 7-4. A call to the display method is inside the UseAccount class’s main method, but the declaration of the display method is up in the Account class. The declaration has a header and a body. (See Chapter 3.) The header has three words and some parentheses: 13_9780470371732-ch07.indd 14813_9780470371732-ch07.indd 148 7/6/11 6:59 PM7/6/11 6:59 PM www.it-ebooks.info 149 Chapter 7: Thinking in Terms of Classes and Objects ✓ The word public serves roughly the same purpose as the word public in Listing 7-1. Roughly speaking, any code can contain a call to a public method, even if the calling code and the public method belong to two different classes. In this section’s example, the decision to make the display method public is a matter of taste. Normally, when I create a method that’s useful in a wide variety of applications, I declare the method to be public. ✓ The word void tells the computer that when the display method is called, the display method doesn’t return anything to the place that called it. To see a method that does return something to the place that called it, see the next section. ✓ The word display is the method’s name. Every method must have a name. Otherwise, you don’t have a way to call the method. ✓ The parentheses contain all the things you’re going to pass to the method when you call it. When you call a method, you can pass infor- mation to that method on the fly. The display method in Listing 7-3 looks strange because the parentheses in the method’s header have nothing inside them. This nothingness indicates that no information is passed to the display method when you call it. For a meatier example, see the next section. Listing 7-3 contains the display method’s declaration, and Listing 7-4 con- tains a call to the display method. Although Listings 7-3 and 7-4 contain dif- ferent classes, both uses of public in Listing 7-3 are optional. To learn why, check out Chapter 13. Sending Values to and from Methods (Calculating Interest) Think about sending someone to the supermarket to buy bread. When you do this, you say, “Go to the supermarket and buy some bread.” (Try it at home. You’ll have a fresh loaf of bread in no time at all!) Of course, some other time, you send that same person to the supermarket to buy bananas. You say, “Go to the supermarket and buy some bananas.” And what’s the point of all this? Well, you have a method, and you have some on-the-fly information that you pass to the method when you call it. The method is named goToTheSupermarketAndBuySome. The on-the-fly information is either bread or bananas, depending on your culinary needs. In Java, the method calls would look like this: goToTheSupermarketAndBuySome(bread); goToTheSupermarketAndBuySome(bananas); 13_9780470371732-ch07.indd 14913_9780470371732-ch07.indd 149 7/6/11 6:59 PM7/6/11 6:59 PM www.it-ebooks.info 150 Part III: Working with the Big Picture: Object-Oriented Programming The things in parentheses are called parameters or parameter lists. With parameters, your methods become much more versatile. Instead of getting the same thing each time, you can send somebody to the supermarket to buy bread one time, bananas another time, and birdseed the third time. When you call your goToTheSupermarketAndBuySome method, you decide right there what you’re going to ask your pal to buy. And what happens when your friend returns from the supermarket? “Here’s the bread you asked me to buy,” says your friend. By carrying out your wishes, your friend returns something to you. You make a method call, and the method returns information (or a loaf of bread). The thing returned to you is called the method’s return value. The general type of thing that is returned to you is called the method’s return type. These concepts are made more concrete in Listings 7-5 and 7-6. Listing 7-5: An Account That Calculates Its Own Interest import static java.lang.System.out; public class Account { String name; String address; double balance; public void display() { out.print(name); out.print(“ (“); out.print(address); out.print(“) has $”); out.print(balance); } public double getInterest(double percentageRate) { return balance * percentageRate / 100.00; } } Listing 7-6: Calculating Interest import static java.lang.System.out; class UseAccount { public static void main(String args[]) { Account myAccount = new Account(); Account yourAccount = new Account(); 13_9780470371732-ch07.indd 15013_9780470371732-ch07.indd 150 7/6/11 6:59 PM7/6/11 6:59 PM www.it-ebooks.info 151 Chapter 7: Thinking in Terms of Classes and Objects myAccount.name = “Barry Burd”; myAccount.address = “222 Cyberspace Lane”; myAccount.balance = 24.02; yourAccount.name = “Jane Q. Public”; yourAccount.address = “111 Consumer Street”; yourAccount.balance = 55.63; myAccount.display(); out.print(“ plus $”); out.print(myAccount.getInterest(5.00)); out.println(“ interest “); yourAccount.display(); double yourInterestRate = 7.00; out.print(“ plus $”); double yourInterestAmount = yourAccount.getInterest(yourInterestRate); out.print(yourInterestAmount); out.println(“ interest “); } } Figure 7-4 shows the output of the code in Listings 7-5 and 7-6. In Listing 7-5, the Account class has a getInterest method. This getInterest method is called twice from the main method in Listing 7-6. The actual account bal- ances and interest rates are different each time. Figure 7-4: Running the code in Listings 7-5 and 7-6. ✓ In the first call, the balance is 24.02, and the interest rate is 5.00. The first call, myAccount.getInterest(5.00), refers to the myAccount object and to the values stored in the myAccount object’s fields. (See Figure 7-5.) When this call is made, the expression balance * percentageRate / 100.00 stands for 24.02 * 5.00 / 100.00. ✓ In the second call, the balance is 55.63, and the interest rate is 7.00. In the main method, just before this second call is made, the variable yourInterestRate is assigned the value 7.00. The call itself, yourAccount.getInterest(yourInterestRate), refers to the 13_9780470371732-ch07.indd 15113_9780470371732-ch07.indd 151 7/6/11 6:59 PM7/6/11 6:59 PM www.it-ebooks.info 152 Part III: Working with the Big Picture: Object-Oriented Programming yourAccount object and to the values stored in the yourAccount object’s fields. (Again, see Figure 7-5.) So, when the call is made, the expression balance * percentageRate / 100.00 stands for 55.63 * 7.00 / 100.00. Figure 7-5: My account and your account. An instance of the Account class name address balance Barry 222 Cyberspace Lane 24.02 Another instance of the Account class name address balance Jane 111 Consumer Street 55.63 myAccount yourAccount Account UseAccount By the way, the main method in Listing 7-3 contains two calls to getInter- est. One call has the literal 5.00 in its parameter list; the other call has the variable yourInterestRate in its parameter list. Why does one call use a literal and the other call use a variable? No reason. I just want to show you that you can do it either way. Passing a value to a method Take a look at the getInterest method’s header. (As you read the explana- tion in the next few bullets, you can follow some of the ideas visually with the diagram in Figure 7-6.) ✓ The word double tells the computer that when the getInterest method is called, the getInterest method returns a double value back to the place that called it. The statement in the getInterest method’s body confirms this. The statement says return balance * percentageRate / 100.00, and the expression balance * percentageRate / 100.00 has type double. (That’s because all the things in the expression — balance, percentageRate, and 100.00 — have type double.) 13_9780470371732-ch07.indd 15213_9780470371732-ch07.indd 152 7/6/11 6:59 PM7/6/11 6:59 PM www.it-ebooks.info 153 Chapter 7: Thinking in Terms of Classes and Objects Figure 7-6: Passing a value to a method. Account UseAccount double getInterest(double percentageRate ) { return balance * percentageRate / 100.00; } out.println(myAccount.getInterest( 5.00 )); 22 11 When the getInterest method is called, the return statement calcu- lates balance * percentageRate / 100.00 and hands the calcula- tion’s result back to the code that called the method. ✓ The word getInterest is the method’s name. That’s the name you use to call the method when you’re writing the code for the UseAccount class. ✓ The parentheses contain all the things that you pass to the method when you call it. When you call a method, you can pass information to that method on the fly. This information is the method’s parameter list. The getInterest method’s header says that the getInterest method takes one piece of information and that piece of information must be of type double. public double getInterest(double percentageRate) Sure enough, if you look at the first call to getInterest (down in the useAccount class’s main method), that call has the number 5.00 in it. And 5.00 is a double literal. When I call getInterest, I’m giving the method a value of type double. If you don’t remember what a literal is, see Chapter 4. The same story holds true for the second call to getInterest. Down near the bottom of Listing 7-6, I call getInterest and feed the variable yourInterestRate to the method in its parameter list. Luckily for me, I declared yourInterestRate to be of type double just a few lines before that. When you run the code in Listings 7-5 and 7-6, the flow of action isn’t from top to bottom. The action goes from main to getInterest, then back to main, then back to getInterest, and finally back to main again. Figure 7-7 shows the whole business. 13_9780470371732-ch07.indd 15313_9780470371732-ch07.indd 153 7/6/11 6:59 PM7/6/11 6:59 PM www.it-ebooks.info 154 Part III: Working with the Big Picture: Object-Oriented Programming Figure 7-7: The flow of control in Listings 7-5 and 7-6. class Account { Yada, yada, yada... double getInterest(double percentageRate) { return balance * percentageRate / 100.00; } } class UseAccount { public static void main(String args[]) { Account myAccount = new Account(); Account yourAccount = new Account(); myAccount.name = "Barry Burd"; myAccount.address = "222 Cyberspace Lane"; myAccount.balance = 24.02; yourAccount.name = "Jane Q. Public"; yourAccount.address = "111 Consumer Street"; yourAccount.balance = 55.63; myAccount.display(); out.print(" plus $"); out.print( myAccount.getInterest(5.00) ); out.println(" interest "); yourAccount.display(); double yourInterestRate = 7.00; out.print(" plus $"); double yourInterestAmount = yourAccount.getInterest(yourInterestRate) ; out.print(yourInterestAmount); out.println(" interest "); } } 11 22 33 44 55 13_9780470371732-ch07.indd 15413_9780470371732-ch07.indd 154 7/6/11 6:59 PM7/6/11 6:59 PM www.it-ebooks.info 155 Chapter 7: Thinking in Terms of Classes and Objects Returning a value from the getInterest method When the getInterest method is called, the method executes the one statement that’s in the method’s body: a return statement. The return statement computes the value of balance * percentageRate / 100.00. If balance happens to be 24.02, and percentageRate is 5.00, the value of the expression is 1.201 — around $1.20. (Because the computer works exclusively with 0s and 1s, the computer gets this number wrong by an ever so tiny amount. The computer gets 1.2009999999999998. That’s just some- thing that humans have to live with.) Anyway, after this value is calculated, the computer executes the return, which sends the value back to the place in main where getInterest was called. At that point in the process, the entire method call — myAccount. getInterest(5.00) — takes on the value 1.2009999999999998. The call itself is inside a println: out.println(myAccount.getInterest(5.00)); So the println ends up with the following meaning: out.println(1.2009999999999998); The whole process, in which a value is passed back to the method call, is illustrated in Figure 7-8. Figure 7-8: A method call is an expression with a value. Account UseAccount double getInterest(double percentageRate ) { return balance * percentageRate / 100.00; } out.println( myAccount.getInterest(5.00) ); 13_9780470371732-ch07.indd 15513_9780470371732-ch07.indd 155 7/6/11 6:59 PM7/6/11 6:59 PM www.it-ebooks.info 156 Part III: Working with the Big Picture: Object-Oriented Programming If a method returns anything, a call to the method is an expression with a value. That value can be printed, assigned to a variable, added to something else, or whatever. Anything you can do with any other kind of value, you can do with a method call. You might use the Account class in Listing 7-5 to solve a real problem. You’d call the Account class’s display and getInterest methods in the course of an actual banking application. But the UseAccount class in Listing 7-6 is artificial. The UseAccount code creates some fake account data, and then calls some Account class methods to convince you that the Account class’s code works correctly. (You don’t seriously think that a bank has depositors named “Jane Q. Public” and “Barry Burd,” do you?) The UseAccount class in Listing 7-6 is a test case — a short-lived class whose sole purpose is to test another class’s code. Like the code in Listing 7-6, each test case in this book is an ordinary class — a free-form class containing its own main method. Free- form classes are okay, but they’re not optimal. Java developers have some- thing better — a more disciplined way of writing test cases. The “better way” is called JUnit, and it’s described on this book’s website. Making Numbers Look Good Looking back at Figure 7-4, you may be concerned that the interest on my account is only $1.2009999999999998. Seemingly, the bank is cheating me out of two hundred-trillionths of a cent. I should go straight there and demand my fair interest. Maybe you and I should go together. We’ll kick up some fur at that old bank and bust this scam right open. If my guess is correct, this is part of a big salami scam. In a salami scam, someone shaves little slices off millions of accounts. People don’t notice their tiny little losses, but the person doing the shaving collects enough for a quick escape to Barbados (or for a whole truckload of salami). But, wait a minute! Nothing is motivating you to come with me to the bank. Checking back at Figure 7-4, I see that you’re way ahead of the game. According to my calculations, the program overpays you by three hundred- trillionths of a cent. Between the two of us, we’re ahead by a hundred- trillionth of a cent. What gives? Well, because computers use 0s (zeros) and 1s and don’t have an infinite amount of space to do calculations, such inaccuracies as the ones shown in Figure 7-4 are normal. The quickest solution is to display the inaccurate num- bers in a more sensible fashion. You can round the numbers and display only two digits beyond the decimal point, and some handy tools from Java’s API (Application Programming Interface) can help. Listing 7-7 shows the code, and Figure 7-9 displays the pleasant result. 13_9780470371732-ch07.indd 15613_9780470371732-ch07.indd 156 7/6/11 6:59 PM7/6/11 6:59 PM www.it-ebooks.info 157 Chapter 7: Thinking in Terms of Classes and Objects Listing 7-7: Making Your Numbers Look Right import static java.lang.System.out; class UseAccount { public static void main(String args[]) { Account myAccount = new Account(); Account yourAccount = new Account(); myAccount.balance = 24.02; yourAccount.balance = 55.63; double myInterest = myAccount.getInterest(5.00); double yourInterest = yourAccount. getInterest(7.00); out.printf(“$%4.2f\n”, myInterest); out.printf(“$%5.2f\n”, myInterest); out.printf(“$%.2f\n”, myInterest); out.printf(“$%3.2f\n”, myInterest); out.printf(“$%.2f $%.2f”, myInterest, yourInterest); } } Figure 7-9: Numbers that look like dollar amounts. The inaccurate numbers in Figure 7-4 come from the computer’s use of 0s and 1s. A mythical computer whose circuits were wired to use digits 0, 1, 2, 3, 4, 5, 6, 7, 8, and 9 wouldn’t suffer from the same inaccuracies. So to make things better, Java provides its own special way around the computer’s inaccurate calculations. Java’s API has a class named BigDecimal — a class that bypasses the computer’s strange 0s and 1s, and uses ordinary decimal digits to perform arithmetic calculations. For more information, visit this book’s website. Listing 7-7 uses a handy method named printf. When you call printf, you always put at least two parameters inside the call’s parentheses. 13_9780470371732-ch07.indd 15713_9780470371732-ch07.indd 157 7/6/11 6:59 PM7/6/11 6:59 PM www.it-ebooks.info 158 Part III: Working with the Big Picture: Object-Oriented Programming ✓ The first parameter is a format string. The format string uses funny-looking codes to describe exactly how the other parameters are displayed. ✓ All the other parameters (after the first) are values to be displayed. Look at the last printf call of Listing 7-7. The first parameter’s format string has two placeholders for numbers. The first placeholder (%.2f) describes the display of myInterest. The second placeholder (another %.2f) describes the display of yourInterest. To find out exactly how these format strings work, see Figures 7-10 through 7-14. Figure 7-10: Using a format string. Display a dollar sign. Use at least four places to display a number and put two of these places to the right of the decimal point. Go to a new line. "a number" is the second parameter (the value of myInterest) What the computer displays: $1.20 "$%4.2f\n" Figure 7-11: Adding extra places to display a value. Display a dollar sign. Use at least five places to display a number and put two of these places to the right of the decimal point. Go to a new line. Because myInterest takes only four places, display myInterest with an extra blank space. What the computer displays: $ 1.20 "$%5.2f\n" 13_9780470371732-ch07.indd 15813_9780470371732-ch07.indd 158 7/6/11 6:59 PM7/6/11 6:59 PM www.it-ebooks.info 159 Chapter 7: Thinking in Terms of Classes and Objects Figure 7-12: Displaying a value without specifying the exact number of places. Display a dollar sign. Use appropriately many places to display a number and put two of these places to the right of the decimal point. Go to a new line. What the computer displays: $1.20 "$%.2f\n" Figure 7-13: Specifying too few places to display a value. Display a dollar sign. Use at least three places to display a number and put two of these places to the right of the decimal point. Go to a new line. Three isn't enough, so the computer uses four places. What the computer displays: $1.20 "$%3.2f\n" Figure 7-14: Displaying more than one value with a format string. Display a dollar sign. Display the value of the second parameter (myInterest) with two of these places to the right of the decimal point. Display a blank space and a dollar sign. Display the value of the third parameter (yourInterest) with two of these places to the right of the decimal point. What the computer displays: $1.20 $3.89 "$%.2f $%.2f" 13_9780470371732-ch07.indd 15913_9780470371732-ch07.indd 159 7/6/11 6:59 PM7/6/11 6:59 PM www.it-ebooks.info 160 Part III: Working with the Big Picture: Object-Oriented Programming For more examples using the printf method and its format strings, see Chapters 8 and 9. For a complete list of options associated with the printf method’s format string, see the java.util.Formatter page of Java’s API documentation. The format string in a printf call doesn’t change the way a number is stored internally for calculations. All the format string does is create a nice-looking bunch of digit characters that can be displayed on your screen. Hiding Details with Accessor Methods (Why You Shouldn’t Micromanage a Bank Teller) Put down this book and put on your hat. You’ve been such a loyal reader that I’m taking you out to lunch! I’ve got just one problem. I’m a bit short on cash. Would you mind if, on the way to lunch, we stopped at an automatic teller machine and picked up a few bucks? Also, we have to use your account. My account is a little low. Fortunately, the teller machine is easy to use. Just step right up and enter your PIN. After entering your PIN, the machine asks which of several variable names you want to use for your current balance. You have a choice of balance324, myBal, currentBalance, b$, BALANCE, asj999, or conStanTinople. Having selected a variable name, you’re ready to select a memory location for the vari- able’s value. You can select any number between 022FFF and 0555AA. (Those numbers are in hexadecimal format.) After you configure the teller machine’s software, you can easily get your cash. You did bring a screwdriver, didn’t you? Good programming When it comes to good computer programming practice, one word stands out above all others — simplicity. When you’re writing complicated code, the last thing you want is to deal with somebody else’s misnamed variables, convoluted solutions to problems, or clever, last-minute kludges. You want a clean interface that makes you solve your own problems and no one else’s. In the automatic teller machine scenario that I describe earlier, the big prob- lem is that the machine’s design forces you to worry about other people’s concerns. When you should be thinking about getting money for lunch, 13_9780470371732-ch07.indd 16013_9780470371732-ch07.indd 160 7/6/11 6:59 PM7/6/11 6:59 PM www.it-ebooks.info 161 Chapter 7: Thinking in Terms of Classes and Objects you’re thinking instead about variables and storage locations. Sure, someone has to work out the teller machine’s engineering problems, but the banking customer isn’t the person. This section is about safety, not security. Safe code keeps you from making accidental programming errors. Secure code (a completely different story) keeps malicious hackers from doing intentional damage. So, everything connected with every aspect of a computer program has to be simple, right? Well, no. That’s not right. Sometimes, to make things simple in the long run, you have to do lots of preparatory work up front. The people who built the automated teller machine worked hard to make sure that the machine is consumer-proof. The machine’s interface, with its screen mes- sages and buttons, makes the machine a very complicated, but carefully designed, device. The point is that making things look simple takes some planning. In the case of object-oriented programming, one of the ways to make things look simple is to keep code outside a class from directly using fields defined inside the class. Take a peek at the code in Listing 7-1. You’re working at a company that has just spent $10 million for the code in the Account class. (That’s more than a million and a half per line!) Now your job is to write the UseAccount class. You would like to write myAccount.name = “Barry Burd”; but doing so would be getting you too far inside the guts of the Account class. After all, people who use an automatic teller machine aren’t allowed to program the machine’s variables. They can’t use the machine’s keypad to type the statement balanceOnAccount29872865457 = balanceOnAccount29872865457 + 1000000.00; Instead, they push buttons that do the job in an orderly manner. That’s how a programmer achieves safety and simplicity. So, to keep things nice and orderly, you need to change the Account class from Listing 7-1 by outlawing such statements as the following: myAccount.name = “Barry Burd”; and out.print(yourAccount.balance); 13_9780470371732-ch07.indd 16113_9780470371732-ch07.indd 161 7/6/11 6:59 PM7/6/11 6:59 PM www.it-ebooks.info 162 Part III: Working with the Big Picture: Object-Oriented Programming Of course, this poses a problem. You’re the person who’s writing the code for the UseAccount class. If you can’t write myAccount.name or yourAccount.balance, how are you going to accomplish anything at all? The answer lies in things called accessor methods. Listings 7-8 and 7-9 demonstrate these methods. Listing 7-8: Hide Those Fields public class Account { private String name; private String address; private double balance; public void setName(String n) { name = n; } public String getName() { return name; } public void setAddress(String a) { address = a; } public String getAddress() { return address; } public void setBalance(double b) { balance = b; } public double getBalance() { return balance; } } Listing 7-9: Calling Accessor Methods import static java.lang.System.out; class UseAccount { public static void main(String args[]) { Account myAccount = new Account(); Account yourAccount = new Account(); myAccount.setName(“Barry Burd”); myAccount.setAddress(“222 Cyberspace Lane”); myAccount.setBalance(24.02); 13_9780470371732-ch07.indd 16213_9780470371732-ch07.indd 162 7/6/11 6:59 PM7/6/11 6:59 PM www.it-ebooks.info 163 Chapter 7: Thinking in Terms of Classes and Objects yourAccount.setName(“Jane Q. Public”); yourAccount.setAddress(“111 Consumer Street”); yourAccount.setBalance(55.63); out.print(myAccount.getName()); out.print(“ (“); out.print(myAccount.getAddress()); out.print(“) has $”); out.print(myAccount.getBalance()); out.println(); out.print(yourAccount.getName()); out.print(“ (“); out.print(yourAccount.getAddress()); out.print(“) has $”); out.print(yourAccount.getBalance()); } } A run of the code in Listings 7-8 and 7-9 looks no different from a run of Listings 7-1 and 7-2. Either program’s run is shown back in Figure 7-3. The big difference is that in Listing 7-8, the Account class enforces the carefully controlled use of its name, address, and balance fields. Public lives and private dreams: Making a field inaccessible Notice the addition of the word private in front of each of the Account class’s field declarations. The word private is a Java keyword. When a field is declared private, no code outside of the class can make direct refer- ence to that field. So if you put myAccount.name = “Barry Burd” in the UseAccount class of Listing 7-9, you get the error message name has private access in Account. Instead of referencing myAccount.name, the UseAccount programmer must call method myAccount.setName or method myAccount.getName. These methods, setName and getName, are called accessor methods, because they provide access to the Account class’s name field. (Actually, the term acces- sor method isn’t formally a part of the Java programming language. It’s just the term that people use for methods that do this sort of thing.) To zoom in even more, setName is called a setter method, and getName is called a getter method. (I bet you won’t forget that terminology!) Another commonly used term for an accessor method is a bean method. The phrase bean method comes from the world of JavaBeans — a way of plug- ging Java programs into existing graphical user interface (GUI) environments. Because JavaBeans relies heavily on accessor methods, many people associ- ate accessor methods with the JavaBeans specification. 13_9780470371732-ch07.indd 16313_9780470371732-ch07.indd 163 7/6/11 6:59 PM7/6/11 6:59 PM www.it-ebooks.info 164 Part III: Working with the Big Picture: Object-Oriented Programming With many IDEs, you don’t have to type your own accessor methods. First, you type a field declaration like private String name. Then, in your IDE’s menu bar, you choose Source➪Generate Getters and Setters, or choose Code➪Insert Code➪Setter or some mix of those commands. After you make all your choices, the IDE creates accessor methods and adds them to your code. Notice that all the setter and getter methods in Listing 7-8 are declared to be public. This ensures that anyone from anywhere can call these two methods. The idea here is that manipulating the actual fields from outside the Account code is impossible, but you can easily reach the approved setter and getter methods for using those fields. To read more about the public and private keywords, see Chapter 13. Think again about the automatic teller machine. Someone using the ATM can’t type a command that directly changes the value in his or her account’s balance field, but the procedure for depositing a million-dollar check is easy to follow. The people who build the teller machines know that if the check depositing procedure is complicated, plenty of customers will mess it up roy- ally. So that’s the story — make impossible anything that people shouldn’t do and make sure that the tasks people should be doing are easy. Nothing about having setter and getter methods is sacred. You don’t have to write any setter and getter methods that you’re not going to use. For instance, in Listing 7-8, I can omit the declaration of method getAddress, and every- thing still works. The only problem if I do this is that anyone else who wants to use my Account class and retrieve the address of an existing account is up a creek. When you create a method to set the value in a balance field, you don’t have to name your method setBalance. You can name it tunaFish, or whatever you like. The trouble is that the setFieldname convention (with lowercase letters in set and an uppercase letter to start the Fieldname part) is an established stylistic convention in the world of Java programming. If you don’t follow the convention, you confuse the kumquats out of other Java program- mers. If your integrated development environment has drag-and-drop GUI design capability, you may temporarily lose that capability. (For a word about drag-and-drop GUI design, see Chapter 2.) When you call a setter method, you feed it a value of the type that’s being set. That’s why, in Listing 7-9, you call yourAccount.setBalance(55.63) with a parameter of type double. In contrast, when you call a getter method, you usually don’t feed any values to the method. That’s why, in Listing 7-9, you call yourAccount.getBalance() with an empty parameter list. Occasionally, you may want to get and set a value with a single statement. To add a dollar to your account’s existing balance, you write yourAccount. setBalance(yourAccount.getBalance() + 1.00). 13_9780470371732-ch07.indd 16413_9780470371732-ch07.indd 164 7/6/11 6:59 PM7/6/11 6:59 PM www.it-ebooks.info 165 Chapter 7: Thinking in Terms of Classes and Objects Enforcing rules with accessor methods Go back to Listing 7-8 and take a quick look at the setName method. Imagine putting the method’s assignment statement inside an if statement. public void setName(String n) { if (!n.equals(“”)) { name = n; } } Now, if the programmer in charge of the UseAccount class writes myAccount.setName(“”), the call to setName doesn’t have any effect. Furthermore, because the name field is private, the following statement is illegal in the UseAccount class: myAccount.name = “”; Of course, a call such as myAccount.setName(“Joe Schmoe”) still works because “Joe Schmoe” doesn’t equal the empty string “”. That’s cool. With a private field and an accessor method, you can prevent someone from assigning the empty string to an account’s name field. With more elaborate if statements, you can enforce any rules you want. 13_9780470371732-ch07.indd 16513_9780470371732-ch07.indd 165 7/6/11 6:59 PM7/6/11 6:59 PM www.it-ebooks.info 166 Part III: Working with the Big Picture: Object-Oriented Programming 13_9780470371732-ch07.indd 16613_9780470371732-ch07.indd 166 7/6/11 6:59 PM7/6/11 6:59 PM www.it-ebooks.info Chapter 8 Saving Time and Money: Reusing Existing Code In This Chapter ▶ Adding new life to old code ▶ Tweaking your code ▶ Making changes without spending a fortune Once upon a time, there was a beautiful princess. When the princess turned 25 (the optimal age for strength, good looks, and fine moral char- acter), her kind father brought her a gift in a lovely golden box. Anxious to know what was in the box, the princess ripped off the golden wrapping paper. When the box was finally opened, the princess was thrilled. To her surprise, her father had given her what she had always wanted — a computer program that always ran correctly. The program did everything the princess wanted and did it all exactly the way she wanted it to be done. The princess was happy, and so was her kind, old father. As time went on, the computer program never failed. For years on end, the princess changed her needs, expected more out of life, made increas- ing demands, expanded her career, reached for more and more fulfillment, juggled the desires of her husband and her kids, stretched the budget, and sought peace within her soul. Through all this, the program remained her steady, faithful companion. As the princess grew old, the program became old along with her. One eve- ning, as she sat by the fireside, she posed a daunting question to the pro- gram. “How do you do it?” she asked. “How do you manage to keep giving the right answers, time after time, year after year?” 14_9780470371732-ch08_.indd 16714_9780470371732-ch08_.indd 167 7/6/11 6:59 PM7/6/11 6:59 PM www.it-ebooks.info 168 Part III: Working with the Big Picture: Object-Oriented Programming “Clean living,” replied the program. “I swim 20 apps each day, I take C++ to Word off viruses, I avoid hogarithmic algorithms, I link Java in moderation, I say GNU to bugs, I don’t smoke to backup, and I never byte off more than I can queue.” Needless to say, the princess was stunned. Defining a Class (What It Means to Be an Employee) Wouldn’t it be nice if every piece of software did just what you wanted it to do? In an ideal world, you could just buy a program, make it work right away, plug it seamlessly into new situations, and update it easily whenever your needs change. Unfortunately, software of this kind doesn’t exist. (Nothing of this kind exists.) The truth is that no matter what you want to do, you can find software that does some of it, but not all of it. This is one of the reasons why object-oriented programming has been so suc- cessful. For years, companies were buying prewritten code only to discover that the code didn’t do what they wanted it to do. So what did the companies do about it? They started messing with the code. Their programmers dug deep into the program files, changed variable names, moved subprograms around, reworked formulas, and generally made the code worse. The reality was that if a program didn’t already do what you wanted it to do (even if it did something ever so close to what you wanted), you could never improve the situation by mucking around inside the code. The best option was always to chuck the whole program (expensive as that was) and start all over again. What a sad state of affairs! With object-oriented programming, a big change has come about. At its heart, an object-oriented program is made to be modified. With correctly written software, you can take advantage of features that are already built-in, add new features of your own, and override features that don’t suit your needs. And the best part is that the changes you make are clean. No clawing and dig- ging into other people’s brittle program code. Instead, you make nice, orderly additions and modifications without touching the existing code’s internal logic. It’s the ideal solution. The last word on employees When you write an object-oriented program, you start by thinking about the data. You’re writing about accounts. So what’s an account? You’re writing code to handle button clicks. So what’s a button? You’re writing a program to send payroll checks to employees. What’s an employee? 14_9780470371732-ch08_.indd 16814_9780470371732-ch08_.indd 168 7/6/11 6:59 PM7/6/11 6:59 PM www.it-ebooks.info 169 Chapter 8: Saving Time and Money: Reusing Existing Code In this chapter’s first example, an employee is someone with a name and a job title. Sure, employees have other characteristics, but for now I stick to the basics. The code in Listing 8-1 defines what it means to be an employee. Listing 8-1: What Is an Employee? import static java.lang.System.out; public class Employee { private String name; private String jobTitle; public void setName(String nameIn) { name = nameIn; } public String getName() { return name; } public void setJobTitle(String jobTitleIn) { jobTitle = jobTitleIn; } public String getJobTitle() { return jobTitle; } public void cutCheck(double amountPaid) { out.printf(“Pay to the order of %s “, name); out.printf(“(%s) ***$”, jobTitle); out.printf(“%,.2f\n”, amountPaid); } } According to Listing 8-1, each employee has seven features. Two of these fea- tures are fairly simple. Each employee has a name and a job title. (In Listing 8-1, the Employee class has a name field and a jobTitle field.) And what else does an employee have? Each employee has four methods to handle the values of the employee’s name and job title. These methods are setName, getName, setJobTitle, and getJobTitle. I explain methods like these (accessor methods) in Chapter 7. On top of all that, each employee has a cutCheck method. The idea is that the method that writes payroll checks has to belong to one class or another. Because most of the information in the payroll check is customized for a particular employee, you may as well put the cutCheck method inside the Employee class. For details about the printf calls in the cutCheck method, see the section entitled “Cutting a check,” later in this chapter. 14_9780470371732-ch08_.indd 16914_9780470371732-ch08_.indd 169 7/6/11 6:59 PM7/6/11 6:59 PM www.it-ebooks.info 170 Part III: Working with the Big Picture: Object-Oriented Programming Putting your class to good use The Employee class in Listing 8-1 has no main method, so there’s no start- ing point for executing code. To fix this deficiency, the programmer writes a separate program with a main method and uses that program to create Employee instances. Listing 8-2 shows a class with a main method — one that puts the code in Listing 8-1 to the test. Listing 8-2: Writing Payroll Checks import java.util.Scanner; import java.io.File; import java.io.IOException; class DoPayroll { public static void main(String args[]) throws IOException { Scanner diskScanner = new Scanner(new File(“EmployeeInfo.txt”)); for (int empNum = 1; empNum <= 3; empNum++) { payOneEmployee(diskScanner); } } static void payOneEmployee(Scanner aScanner) { Employee anEmployee = new Employee(); anEmployee.setName(aScanner.nextLine()); anEmployee.setJobTitle(aScanner.nextLine()); anEmployee.cutCheck(aScanner.nextDouble()); aScanner.nextLine(); } } To run the code in Listing 8-2, your hard drive must contain a file named EmployeeInfo.txt. For example, with the Eclipse IDE, I have a project named Listing08-02. That project lives on my hard drive in a folder named c:\Users\my-user-name\workspace\Listing08-02. Directly inside that folder, I have a file named EmployeeInfo.txt. For more words of wisdom about files on your hard drive, see the section entitled “Working with Disk Files (A Brief Detour)” in this chapter. The DoPayroll class in Listing 8-2 has two methods. One of the methods, main, calls the other method, payOneEmployee, three times. Each time around, the payOneEmployee method gets stuff from the EmployeeInfo. txt file and feeds this stuff to the Employee class’s methods. Here’s how the variable name anEmployee is reused and recycled: 14_9780470371732-ch08_.indd 17014_9780470371732-ch08_.indd 170 7/6/11 6:59 PM7/6/11 6:59 PM www.it-ebooks.info 171 Chapter 8: Saving Time and Money: Reusing Existing Code ✓ The first time that payOneEmployee is called, the statement anEmployee = new Employee() makes anEmployee refer to a new object. ✓ The second time that payOneEmployee is called, the computer exe- cutes the same statement again. This second execution creates a new incarnation of the anEmployee variable that refers to a brand- new object. ✓ The third time around, all the same stuff happens again. A new anEmployee variable ends up referring to a third object. The whole story is pictured in Figure 8-1. Figure 8-1: Three calls to the payOne- Employee method. An instance of the Employee class name jobTitle Barry CEO Another instance of the Employee class name jobTitle Harriet Captain anEmployee Employee DoPayroll anEmployee anEmployee A third instance of the Employee class name jobTitle You Exec 123 Cutting a check Listing 8-1 has three printf calls. Each printf call has a format string (like “(%s) ***$”) and a variable (like jobTitle). Each format string has a placeholder (like %s) that determines where and how the variable’s value is displayed. For example, in the second printf call, the format string has a %s placeholder. This %s holds a place for the jobTitle variable’s value. According to Java’s rules, the notation %s always holds a place for a string and, sure enough, the variable jobTitle is declared to be of type String in Listing 8-1. Parentheses and some other characters surround the %s placeholder, so parentheses sur- round each job title in the program’s output. (See Figure 8-2.) 14_9780470371732-ch08_.indd 17114_9780470371732-ch08_.indd 171 7/6/11 6:59 PM7/6/11 6:59 PM www.it-ebooks.info 172 Part III: Working with the Big Picture: Object-Oriented Programming Figure 8-2: Everybody gets paid. Back in Listing 8-1, notice the comma inside the %,.2f placeholder. The comma tells the program to use grouping separators. That’s why, in Figure 8-2, you see $5,000.00, $7,000.00, and $10,000.00 instead of $5000.00, $7000.00, and $10000.00. Grouping separators vary from one country to another. For instance, in France, to write the number one thousand (mille), you write 1 000,00. Java can Frenchify your number automatically with a statement like out.print (new java.util.Formatter().format(java.util.Locale.FRANCE, “%,.2f”, 1000.00)). For details, see the API (Application Programming Interface) documentation for Java’s Formatter and Locale classes. Working with Disk Files (A Brief Detour) In previous chapters, programs read characters from the computer’s key- board. But the code in Listing 8-2 reads characters from a specific file. The file (named EmployeeInfo.txt) lives on your computer’s hard drive. This EmployeeInfo.txt file is like a word processing document. The file can contain letters, digits, and other characters. But unlike a word process- ing document, the EmployeeInfo.txt file contains no formatting — no italics, no bold, no font sizes, nothing of that kind. The EmployeeInfo.txt file contains only ordinary characters — the kinds of keystrokes that you type while you play a guessing game from Chapters 5 or 6. Of course, getting guesses from a user’s keyboard and reading employee data from a disk file aren’t exactly the same. In a guess- ing game, the program displays prompts, such as Enter an int from 1 to 10. The game program conducts a back-and-forth dialogue with the person sitting at the keyboard. In contrast, Listing 8-2 has no dialogue. This DoPayroll program reads characters from a hard drive and doesn’t prompt or interact with anyone. Most of this chapter is about code reuse. But Listing 8-2 stumbles upon an important idea — an idea that’s not directly related to code reuse. Unlike the examples in previous chapters, Listing 8-2 reads data from a stored disk file. So in the following sections, I take a short side trip to explore disk files. 14_9780470371732-ch08_.indd 17214_9780470371732-ch08_.indd 172 7/6/11 6:59 PM7/6/11 6:59 PM www.it-ebooks.info 173 Chapter 8: Saving Time and Money: Reusing Existing Code Storing data in a file The code in Listing 8-2 doesn’t run unless you have some employee data sit- ting in a file. Listing 8-2 says that this file is EmployeeInfo.txt. So before running the code of Listing 8-2, I created a small EmployeeInfo.txt file. The file is shown in Figure 8-3; refer to Figure 8-2 for the resulting output. Figure 8-3: An Employee Info.txt file. To keep Listing 8-2 simple I insist that, when you type the characters in Figure 8-3, you finish up by typing 10000.00 and then pressing Enter. (Look again at Figure 8-3 and notice how the cursor is at the start of a brand new line.) If you forget to finish by pressing Enter, then the code in Listing 8-2 will crash when you try to run it. This book’s website has tips for readers who need to create data files. This includes instructions for Windows, Linux, and Macintosh environments. Copying and pasting code In almost any computer programming language, reading data from a file can be tricky. You add extra lines of code to tell the computer what to do. Sometimes you can copy and paste these lines from other peoples’ code. For example, you can follow the pattern in Listing 8-2: /* * The pattern in Listing 8-2 */ import java.util.Scanner; import java.io.File; import java.io.IOException; class SomeClassName { public static void main(String args[]) throws IOException { Scanner scannerName = new Scanner(new File(“SomeFileName”)); //Some code goes here 14_9780470371732-ch08_.indd 17314_9780470371732-ch08_.indd 173 7/6/11 6:59 PM7/6/11 6:59 PM www.it-ebooks.info 174 Part III: Working with the Big Picture: Object-Oriented Programming scannerName.nextInt(); scannerName.nextDouble(); scannerName.next(); scannerName.nextLine(); //Some code goes here } } You want to read data from a file. You start by imagining that you’re reading from the keyboard. Put the usual Scanner and next codes into your pro- gram. Then add some extra items from the Listing 8-2 pattern: ✓ Add two new import declarations — one for java.io.File and another for java.io.IOException. ✓ Type throws IOException in your method’s header. ✓ Type new File(“”) in your call to new Scanner. ✓ Take a file that’s already on your hard drive. Type that filename inside the quotation marks. ✓ Take the word that you use for the name of your scanner. Reuse that word in calls to next, nextInt, nextDouble, and so on. Occasionally, copying and pasting code can get you into trouble. Maybe you’re writing a program that doesn’t fit the simple Listing 8-2 pattern. You need to tweak the pattern a bit. But in order to tweak the pattern, you need to understand some of the ideas behind the pattern. That’s how the next section comes to your rescue. It covers some of these ideas. Reading from a file In previous chapters, programs read characters from the computer’s keyboard. These programs use things like Scanner, System.in, and nextDouble — things defined in Java’s API. The DoPayroll program in Listing 8-2 puts a new spin on this story. Instead of reading characters from the keyboard, the program reads characters from the EmployeeInfo.txt file. The file lives on your com- puter’s hard drive. To read characters from a file, you use some of the same things that help you read characters from the keyboard. You use Scanner, nextDouble, and other goodies. But in addition to these goodies, you have a few extra hurdles to jump. Here’s a list: 14_9780470371732-ch08_.indd 17414_9780470371732-ch08_.indd 174 7/6/11 6:59 PM7/6/11 6:59 PM www.it-ebooks.info 175 Chapter 8: Saving Time and Money: Reusing Existing Code ✓ You need a new File object. To be more precise, you need a new instance of the API’s File class. You get this new instance with code like new File(“EmployeeInfo.txt”) The stuff in quotation marks is the name of a file — a file on your computer’s hard drive. The file contains characters like those shown previously in Figure 8-3. At this point, the terminology makes mountains out of molehills. Sure, I use the phrases new File object and new File instance, but all you’re doing is making new File(“EmployeeInfo.txt”) stand for a file on your hard drive. After you shove new File(“EmployeeInfo.txt”) into new Scanner, Scanner diskScanner = new Scanner(new File(“EmployeeInfo.txt”)); you can forget all about the new File business. From that point on in the code, diskScanner stands for the EmployeeInfo.txt filename on your computer’s hard drive. (The name diskScanner stands for a file on your hard drive just as, in previous examples, the name keyboard stands for those buttons that you press day-in and day-out.) Creating a new File object in Listing 8-2 is like creating a new Employee object later in the same listing. It’s also like creating a new Account object in the examples of Chapter 7. The only difference is that the Employee and Account classes are defined in this book’s examples. The File class is defined in Java’s API. When you connect to a disk file with new Scanner, don’t forget the new File part. If you write new Scanner(“EmployeeInfo.txt”) without new File, the compiler won’t mind. (You won’t get any warnings or error messages before you run the code.) But when you run the code, you won’t get anything like the results that you expect to get. ✓ You must refer to the File class by its full name — java.io.File. You can do this with an import declaration like the one in Listing 8-2. Alternatively, you can clutter up your code with a statement like Scanner diskScanner = new Scanner(new java.io.File(“EmployeeInfo.txt”)); ✓ You need a throws IOException clause. Lots of things can go wrong when your program connects to EmployeeInfo.txt. For one thing, your hard drive may not have a file named EmployeeInfo.txt. For another, the file EmployeeInfo.txt may be in the wrong directory. To brace for this kind of calamity, the Java programming language takes certain precautions. The language insists that when a disk file is involved, you acknowledge the possible dangers of calling new Scanner. 14_9780470371732-ch08_.indd 17514_9780470371732-ch08_.indd 175 7/6/11 6:59 PM7/6/11 6:59 PM www.it-ebooks.info 176 Part III: Working with the Big Picture: Object-Oriented Programming You can acknowledge the hazards in several possible ways, but the sim- plest way is to use a throws clause. In Listing 8-2, the main method’s header ends with the words throws IOException. By adding these two words, you appease the Java compiler. It’s as if you’re saying “I know that calling new Scanner can lead to problems. You don’t have to remind me.” And, sure enough, adding throws IOException to your main method keeps the compiler from complaining. (Without this throws clause, you get an unreported exception error message.) For the full story on Java exceptions, read Chapter 12. In the meantime, add throws IOException to the header of any method that calls new Scanner(new File(.... ✓ You must refer to the IOException class by its full name — java. io.IOException. You can do this with an import declaration like the one in Listing 8-2. Alternatively, you can enlarge the main method’s throws clause: public static void main(String args[]) throws java.io.IOException { ✓ You must pass the file scanner’s name to the payOneEmployee method. In Listing 7-5 in Chapter 7, the getInterest method has a parameter named percentageRate. Whenever you call the getInterest method, you hand an extra, up-to-date piece of information to the method. (You hand a number — an interest rate — to the method. Figure 7-7 illustrates the idea.) The same thing happens in Listing 8-2. The payOneEmployee method has a parameter named aScanner. Whenever you call the payOne- Employee method, you hand an extra, up-to-date piece of information to the method. (You hand a scanner — a reference to a disk file — to the method.) You may wonder why the payOneEmployee method needs a parameter. After all, in Listing 8-2, the payOneEmployee method always reads data from the same file. Why bother informing this method, each time you call it, that the disk file is still the EmployeeInfo.txt file? Well, there are plenty of ways to shuffle the code in Listing 8-2. Some ways don’t involve a parameter. But the way that this example has arranged things, you have two separate methods — a main method and a payOneEmployee method. You create a scanner once inside the main method and then use the scanner three times — once inside each call to the payOneEmployee method. Anything that you define inside a method is like a private joke that’s known only to the code inside that method. So, the diskScanner that you define inside the main method isn’t automatically known inside the 14_9780470371732-ch08_.indd 17614_9780470371732-ch08_.indd 176 7/6/11 6:59 PM7/6/11 6:59 PM www.it-ebooks.info 177 Chapter 8: Saving Time and Money: Reusing Existing Code payOneEmployee method. To make the payOneEmployee method aware of the disk file, you pass diskScanner from the main method to the payOneEmployee method. To read more about things that you declare inside (and outside) of methods, see Chapter 10. Who moved my file? When you download the code from this book’s website, you’re going to find files named Employee.java and DoPayroll.java — the code in Listings 8-1 and 8-2. You’ll also find a file named EmployeeInfo.txt. That’s good, because if Java can’t find the EmployeeInfo.txt file, the whole project doesn’t run properly. Instead, you get a FileNotFoundException. In general, when you get a FileNotFoundException, some file that your program needs isn’t available to it. This is an easy mistake to make. It can be frustrating because to you, a file such as EmployeeInfo.txt may look like it’s available to your program. But remember — computers are stupid. If you make a tiny mistake, the computer can’t read between the lines for you. So if your EmployeeInfo.txt file isn’t in the right directory on your hard drive or the filename is spelled incorrectly, the computer chokes when it tries to run your code. Sometimes you know darn well that an EmployeeInfo.txt (or whatever. xyz) file exists on your hard drive. But when you run your program, you still get a mean-looking FileNotFoundException. When this happens, the file is usually in the wrong directory on your hard drive. (Of course, it depends on your point of view. Maybe the file is in the right directory, but you’ve told your Java program to look for the file in the wrong directory.) When this hap- pens, try copying the file to some other directories on your hard drive and rerunning your code. Stare carefully at the names and locations of files on your hard drive until you figure out what’s wrong. On this book’s website, you can find tips on the proper location of the EmployeeInfo.txt file. Look for tips that apply to your operating system (Windows, Macintosh, or Linux) and to your IDE (Eclipse, NetBeans, or IntelliJ IDEA). Adding directory names to your filenames You can specify a file’s exact location in your Java code. Code like new File(“C:\\Users\\bburd\\workspace\\Listing08-01-02\\ EmployeeInfo.txt”) looks really ugly, but it works. 14_9780470371732-ch08_.indd 17714_9780470371732-ch08_.indd 177 7/6/11 6:59 PM7/6/11 6:59 PM www.it-ebooks.info 178 Part III: Working with the Big Picture: Object-Oriented Programming In the previous paragraph, notice the double backslashes in “C: \\Users\\ bburd\\workspace . ..”. If you’re a Windows user, you’d be tempted to write C:\Users\bburd\workspace . . . with single backslashes. But in Java, the single backslash has its own special meaning. (For example, back in Listing 7-7, \n means to go to the next line.) So in Java, to indicate a backs- lash inside a quoted string, you use a double backslash instead. Macintosh and Linux users might find comfort in the fact that their path separator, /, has no special meaning in a Java string. On a Mac, the code new File(“/Users/bburd/workspace/Listing08-01-02/EmployeeInfo. txt”) is as normal as breathing. (Well, it’s almost that normal!) But Mac users and Linux wonks shouldn’t claim superiority too quickly. Lines such as new File(“/Users/bburd/workspace... work in Windows as well. In Windows, you can use either a slash (/) or a backslash (\) as your path name separator. In the Windows Command Prompt, I can type cd c:/users\ bburd to get to my home directory. If you know where your Java program looks for files, you can worm your way from that place to the directory of your choice. Assume, for the moment, that the code in Listing 8-2 normally looks for the EmployeeInfo.txt file in a directory named Listing08-01-02. So, as an experiment, go to the Listing08-01-02 directory and create a new subdirectory named dataFiles. Then move my EmployeeInfo.txt file to the new dataFiles directory. To read numbers and words from the file that you moved, modify Listing 8-2 with the code new File(“dataFiles\\EmployeeInfo.txt”). Reading a line at a time In Listing 8-2, the payOneEmployee method illustrates some useful tricks for reading data. In particular, every scanner that you create has a nextLine method. (You might not use this nextLine method, but the method is avail- able nonetheless.) When you call a scanner’s nextLine method, the method grabs everything up to the end of the current line of text. In Listing 8-2, a call to nextLine can read a whole line from the EmployeeInfo.txt file. (In another program, a scanner’s nextLine call may read everything the user types on the keyboard up to the pressing of the Enter key.) Notice my careful choice of words: nextLine reads everything up to the end of the current line. Unfortunately, what it means to read up to the end of the current line isn’t always what you think it means. Intermingling nextInt, nextDouble, and nextLine calls can be messy. You have to watch what you’re doing and check your program’s output carefully. 14_9780470371732-ch08_.indd 17814_9780470371732-ch08_.indd 178 7/6/11 6:59 PM7/6/11 6:59 PM www.it-ebooks.info 179 Chapter 8: Saving Time and Money: Reusing Existing Code To understand all this, you need to be painfully aware of a data file’s line breaks. Think of a line break as an extra character, stuck between one line of text and the next. Then imagine that calling nextLine means to read everything up to and including the next line break. Now take a look at Figure 8-4. ✓ If one call to nextLine reads Barry Burd[LineBreak], the subse- quent call to nextLine reads CEO[LineBreak]. ✓ If one call to nextDouble reads the number 5000.00, the subsequent call to nextLine reads the [LineBreak] that comes immediately after the number 5000.00. (That’s all the nextLine reads — a [LineBreak] and nothing more.) ✓ If a call to nextLine reads the [LineBreak] after the number 5000.00, the subsequent call to nextLine reads Harriet Ritter[LineBreak]. So after reading the number 5000.00, you need two calls to nextLine in order to scoop up the name Harriet Ritter. The mistake that I usually make is to forget the first of those two calls. Look again at the file in Figure 8-3. For this section’s code to work correctly, you must have a line break after the last 10000.00. If you don’t, a final call to nextLine makes your program crash and burn. The error message reads NoSuchElementException: No line found. Figure 8-4: Calling next- Double and nextLine. LineBreakBarry Burd nextLine() LineBreakCEO nextLine() LineBreak5000.00 nextLine()nextDouble() LineBreakHarriet Ritter nextLine() 14_9780470371732-ch08_.indd 17914_9780470371732-ch08_.indd 179 7/6/11 6:59 PM7/6/11 6:59 PM www.it-ebooks.info 180 Part III: Working with the Big Picture: Object-Oriented Programming I’m always surprised by the number of quirks that I find in each programming language’s scanning methods. For example, the first nextLine that reads from the file in Figure 8-3 devours Barry Burd[LineBreak] from the file. But that nextLine call delivers Barry Burd (without any line break) to the running code. So nextLine looks for a line break, and then nextLine loses the line break. Yes, this is a subtle point. And no, this subtle point hardly ever causes problems for anyone. If this business about nextDouble and nextLine confuses you, please don’t put the blame on Java. Mixing input calls is delicate work in any computer pro- gramming language. And the really nasty thing is that each programming lan- guage approaches the problem a little differently. What you find out about nextLine in Java helps you understand the issues when you get to know C++ or Visual Basic, but it doesn’t tell you all the details. Each language’s details are unique to that language. (Yes, it’s a big pain. But because all computer programmers become rich and famous, the pain eventually pays off.) Defining Subclasses (What It Means to Be a Full-Time or Part-Time Employee) This time last year, your company paid $10 million for a piece of software. That software came in the Employee.class file. People at Burd Brain Consulting (the company that created the software) don’t want you to know about the innards of the software (otherwise, you may steal their ideas). So you don’t have the Java program file that the software came from. (In other words, you don’t have Employee.java.) You can run the bytecode in the Employee.class file. You can also read the documentation in a web page named Employee.html. But you can’t see the statements inside the Employee.java program, and you can’t change any of the program’s code. Since this time last year, your company has grown. Unlike the old days, your company now has two kinds of employees: full-time and part-time. Each full- time employee is on a fixed, weekly salary. (If the employee works nights and weekends, then in return for this monumental effort, the employee receives a hearty handshake.) In contrast, each part-time employee works for an hourly wage. Your company deducts an amount from each full-time employee’s pay- check to pay for the company’s benefits package. Part-time employees, how- ever, don’t get benefits. The question is, how can the software that your company bought last year keep up with the company’s growth? You invested in a great program to handle employees and their payroll, but the program doesn’t differentiate between your full-time and part-time employees. You have several options: 14_9780470371732-ch08_.indd 18014_9780470371732-ch08_.indd 180 7/6/11 6:59 PM7/6/11 6:59 PM www.it-ebooks.info 181 Chapter 8: Saving Time and Money: Reusing Existing Code ✓ Call your next-door neighbor, whose 12-year-old child knows more about computer programming than anyone in your company. Get this uppity little brat to take the employee software apart, rewrite it, and hand it back to you with all the changes and additions your company requires. On second thought, you can’t do that. No matter how smart that kid is, the complexities of the employee software will probably confuse the kid. By the time you get the software back, it’ll be filled with bugs and inconsistencies. Besides, you don’t even have the Employee.java file to hand to the kid. All you have is the Employee.class file, which can’t be read or modified with a text editor. (See Chapter 2.) Besides, your kid just beat up the neighbor’s kid. You don’t want to give your neighbor the satisfaction of seeing you beg for the whiz kid’s help. ✓ Scrap the $10 million employee software. Get someone in your company to rewrite the software from scratch. In other words, say goodbye to your time and money. ✓ Write a new front end for the employee software. That is, build a piece of code that does some preliminary processing on full-time employees and then hands the preliminary results to your $10 million software. Do the same for part-time employees. This idea could be decent or spell disaster. Are you sure that the exist- ing employee software has convenient hooks in it? (That is, does the employee software contain entry points that allow your front-end software to easily send preliminary data to the expensive employee software?) Remember, this plan treats the existing software as one big, monolithic lump, which can become cumbersome. Dividing the labor between your front-end code and the existing employee program is difficult. And if you add layer upon layer to existing black box code, you’ll probably end up with a fairly inefficient system. ✓ Call Burd Brain Consulting, the company that sold you the employee software. Tell Dr. Burd that you want the next version of his software to differentiate between full-time and part-time employees. “No problem,” says Dr. Burd. “It’ll be ready by the start of the next fiscal quarter.” That evening, Dr. Burd makes a discreet phone call to his next- door neighbor. . . . ✓ Create two new Java classes named FullTimeEmployee and PartTimeEmployee. Have each new class extend the existing function- ality of the expensive Employee class, but have each new class define its own specialized functionality for certain kinds of employees. Way to go! Figure 8-5 shows the structure that you want to create. 14_9780470371732-ch08_.indd 18114_9780470371732-ch08_.indd 181 7/6/11 6:59 PM7/6/11 6:59 PM www.it-ebooks.info 182 Part III: Working with the Big Picture: Object-Oriented Programming Figure 8-5: The Employee class family tree. Employee FullTimeEmployee PartTimeEmployee Creating a subclass In Listing 8-1, I define an Employee class. I can use what I define in Listing 8-1 and extend the definition to create new, more specialized classes. So in Listing 8-3, I define a new class — a FullTimeEmployee class. Listing 8-3: What Is a FullTimeEmployee? public class FullTimeEmployee extends Employee { private double weeklySalary; private double benefitDeduction; public void setWeeklySalary(double weeklySalaryIn) { weeklySalary = weeklySalaryIn; } public double getWeeklySalary() { return weeklySalary; } public void setBenefitDeduction(double benefitDedIn) { benefitDeduction = benefitDedIn; } public double getBenefitDeduction() { return benefitDeduction; } public double findPaymentAmount() { return weeklySalary - benefitDeduction; } } 14_9780470371732-ch08_.indd 18214_9780470371732-ch08_.indd 182 7/6/11 6:59 PM7/6/11 6:59 PM www.it-ebooks.info 183 Chapter 8: Saving Time and Money: Reusing Existing Code Looking at Listing 8-3, you can see that each instance of the FullTimeEmployee class has two fields: weeklySalary and benefit- Deduction. But are those the only fields that each FullTimeEmployee instance has? No, they’re not. The first line of Listing 8-3 says that the FullTimeEmployee class extends the existing Employee class. This means that in addition to having a weeklySalary and a benefitDeduction, each FullTimeEmployee instance also has two other fields: name and jobTitle. These two fields come from the definition of the Employee class, which you can find in Listing 8-1. In Listing 8-3, the magic word is extends. When one class extends an existing class, the extending class automatically inherits functionality that’s defined in the existing class. So, the FullTimeEmployee class inherits the name and jobTitle fields. The FullTimeEmployee class also inherits all the meth- ods that are declared in the Employee class — setName, getName, setJob- Title, getJobTitle, and cutCheck. The FullTimeEmployee class is a subclass of the Employee class. That means the Employee class is the super- class of the FullTimeEmployee class. You can also talk in terms of blood relatives. The FullTimeEmployee class is the child of the Employee class, and the Employee class is the parent of the FullTimeEmployee class. It’s almost (but not quite) as if the FullTimeEmployee class were defined by the code in Listing 8-4. Listing 8-4: Fake (But Informative) Code import static java.lang.System.out; public class FullTimeEmployee { private String name; private String jobTitle; private double weeklySalary; private double benefitDeduction; public void setName(String nameIn) { name = nameIn; } public String getName() { return name; } public void setJobTitle(String jobTitleIn) { jobTitle = jobTitleIn; } public String getJobTitle() { return jobTitle; } (continued) 14_9780470371732-ch08_.indd 18314_9780470371732-ch08_.indd 183 7/6/11 6:59 PM7/6/11 6:59 PM www.it-ebooks.info 184 Part III: Working with the Big Picture: Object-Oriented Programming Listing 8-4 (continued) public void setWeeklySalary(double weeklySalaryIn) { weeklySalary = weeklySalaryIn; } public double getWeeklySalary() { return weeklySalary; } public void setBenefitDeduction(double benefitDedIn) { benefitDeduction = benefitDedIn; } public double getBenefitDeduction() { return benefitDeduction; } public double findPaymentAmount() { return weeklySalary - benefitDeduction; } public void cutCheck(double amountPaid) { out.printf(“Pay to the order of %s “, name); out.printf(“(%s) ***$”, jobTitle); out.printf(“%,.2f\n”, amountPaid); } } Why does the title for Listing 8-4 call that code fake? (Should the code feel insulted?) Well, the main difference between Listing 8-4 and the inheritance situation in Listings 8-1 and 8-3 is this: A child class can’t directly reference the private fields of its parent class. To do anything with the parent class’s private fields, the child class has to call the parent class’s accessor meth- ods. Back in Listing 8-3, calling setName(“Rufus”) would be legal, but the code name=”Rufus” wouldn’t be. If you believe everything you read in Listing 8-4, you’d think that code in the FullTimeEmployee class can do name=”Rufus”. Well, it can’t. (My, what a subtle point this is!) You don’t need the Employee.java file on your hard drive to write code that extends the Employee class. All you need is the file Employee.class. Creating subclasses is habit-forming After you’re accustomed to extending classes, you can get extend-happy. If you created a FullTimeEmployee class, you might as well create a PartTimeEmployee class, as shown in Listing 8-5. 14_9780470371732-ch08_.indd 18414_9780470371732-ch08_.indd 184 7/6/11 6:59 PM7/6/11 6:59 PM www.it-ebooks.info 185 Chapter 8: Saving Time and Money: Reusing Existing Code Listing 8-5: What Is a PartTimeEmployee? public class PartTimeEmployee extends Employee { private double hourlyRate; public void setHourlyRate(double rateIn) { hourlyRate = rateIn; } public double getHourlyRate() { return hourlyRate; } public double findPaymentAmount(int hours) { return hourlyRate * hours; } } Unlike the FullTimeEmployee class, PartTimeEmployee has no salary or deduction. Instead PartTimeEmployee has an hourlyRate field. (Adding a numberOfHoursWorked field would also be a possibility. I chose not to do this, figuring that the number of hours a part-time employee works will change drastically from week to week.) Using Subclasses The previous section tells a story about creating subclasses. It’s a good story, but it’s incomplete. Creating subclasses is fine, but you gain nothing from these subclasses unless you write code to use them. So in this section, you explore code that uses subclasses. Now the time has come for you to classify yourself as either a type-F person, a type-P person, or a type-T person. (I’m this book’s author so I get to make up some personality types. I can even point to someone in public and say “Look! He’s a type-T person!”) ✓ A type-F person wants to see the fundamentals. (The letter F stands for fundamentals.) “Show me a program that lays out the principles in their barest, most basic form,” says the type-F person. A type-F person isn’t worried about bells and whistles. The bells come later, and the whistles may never come at all. If you’re a type-F person, you want to see a program that uses the FullTimeEmployee and PartTimeEmployee subclasses, and then moves out of your way so you can get some work done. 14_9780470371732-ch08_.indd 18514_9780470371732-ch08_.indd 185 7/6/11 6:59 PM7/6/11 6:59 PM www.it-ebooks.info 186 Part III: Working with the Big Picture: Object-Oriented Programming ✓ A type-P person wants practical applications. (The letter P stands for practical.) Type-P people need to see ideas in context; otherwise the ideas float away too quickly. “Show me a program that demonstrates the usefulness of the FullTimeEmployee and PartTimeEmployee subclasses,” says the type-P person. “I have no use for your stinking abstractions. I want real-life examples, and I want them now!” ✓ A type-T person is inspired by something that I write about briefly in Chapter 7. The T person wants to test the code in the FullTimeEmployee and PartTimeEmployee subclasses. Testing the code means putting the code through its paces — checking the output’s accuracy when the input is ordinary, when the input is unexpected, and even when the input is completely unrealistic. What’s more, the type-T person wants to use a standard, easily recognizable outline for the testing code so that other programmers can quickly understand the test results. The type-T person creates JUnit tests that use the FullTimeEmployee and PartTimeEmployee subclasses. Listing 8-6, which is for the type-F crowd, is lean and simple and makes good bedtime reading. If you’re a type-P or type-T person, please visit this book’s website. The site contains examples to satisfy type-P and type-T readers. Listing 8-6 shows you a bare-bones program that uses the subclasses FullTimeEmployee and PartTimeEmployee. Figure 8-6 shows the program’s output. Listing 8-6: Putting Subclasses to Good Use class DoPayrollTypeF { public static void main(String args[]) { FullTimeEmployee ftEmployee = new FullTimeEmployee(); ftEmployee.setName(“Barry Burd”); ftEmployee.setJobTitle(“CEO”); ftEmployee.setWeeklySalary(5000.00); ftEmployee.setBenefitDeduction(500.00); ftEmployee.cutCheck(ftEmployee.findPaymentAmount()); System.out.println(); PartTimeEmployee ptEmployee = new PartTimeEmployee(); ptEmployee.setName(“Steve Surace”); ptEmployee.setJobTitle(“Driver”); ptEmployee.setHourlyRate(7.53); ptEmployee.cutCheck (ptEmployee.findPaymentAmount(10)); } } 14_9780470371732-ch08_.indd 18614_9780470371732-ch08_.indd 186 7/6/11 6:59 PM7/6/11 6:59 PM www.it-ebooks.info 187 Chapter 8: Saving Time and Money: Reusing Existing Code Figure 8-6: The out- put of the program in Listing 8-6. To understand Listing 8-6, you need to keep an eye on three classes: Employee, FullTimeEmployee, and PartTimeEmployee. (For a look at the code that defines these classes, see Listings 8-1, 8-3, and 8-5.) The first half of Listing 8-6 deals with a full-time employee. Notice how so many methods are available for use with the ftEmployee variable. For instance, you can call ftEmployee.setWeeklySalary because ftEmployee has type FullTimeEmployee. You can also call ftEmployee. setName because the FullTimeEmployee class extends the Employee class. Because cutCheck is declared in the Employee class, you can call ftEmployee.cutCheck. But you can also call ftEmployee.find- PaymentAmount because a findPaymentAmount method is in the FullTimeEmployee class. Making types match Look again at the first half of Listing 8-6. Take special notice of that last state- ment — the one in which the full-time employee is actually cut a check. The statement forms a nice, long chain of values and their types. You can see this by reading the statement from the inside out. ✓ Method ftEmployee.findPaymentAmount is called with an empty parameter list (Listing 8-6). That’s good, because the findPayment Amount method takes no parameters (Listing 8-3). ✓ The findPaymentAmount method returns a value of type double (again, Listing 8-3). ✓ The double value that ftEmployee.findPaymentAmount returns is passed to method ftEmployee.cutCheck (Listing 8-6). That’s good, because the cutCheck method takes one parameter of type double (Listing 8-1). For a fanciful graphic illustration, see Figure 8-7. 14_9780470371732-ch08_.indd 18714_9780470371732-ch08_.indd 187 7/6/11 6:59 PM7/6/11 6:59 PM www.it-ebooks.info 188 Part III: Working with the Big Picture: Object-Oriented Programming Figure 8-7: Matching parameters. No parameters No parameters double findPaymentAmount cutCheck double Always feed a method the value types that it wants in its parameter list. The second half of the story In the second half of Listing 8-6, the code creates an object of type PartTimeEmployee. A variable of type PartTimeEmployee can do some of the same things a FullTimeEmployee variable can do. But the PartTimeEmployee class doesn’t have the setWeeklySalary and set- BenefitDeduction methods. Instead, the PartTimeEmployee class has the setHourlyRate method. (See Listing 8-5.) So, in Listing 8-6, the next- to-last line is a call to the setHourlyRate method. The last line of Listing 8-6 is by far the most interesting. On that line, the code hands the number 10 (the number of hours worked) to the findPaymentAmount method. Compare this with the earlier call to findPaymentAmount — the call for the full-time employee in the first half of Listing 8-6. Between the two subclasses, FullTimeEmployee and PartTimeEmployee, are two different findPaymentAmount methods. The two methods have two different kinds of parameter lists: ✓ The FullTimeEmployee class’s findPaymentAmount method takes no parameters (Listing 8-3). ✓ The PartTimeEmployee class’s findPaymentAmount method takes one int parameter (Listing 8-5). This is par for the course. Finding the payment amount for a part-time employee isn’t the same as finding the payment amount for a full-time employee. A part-time employee’s pay changes each week, depend- ing on the number of hours the employee works in a week. The full-time employee’s pay stays the same each week. So the FullTimeEmployee and PartTimeEmployee classes both have findPaymentAmount methods, but each class’s method works quite differently. 14_9780470371732-ch08_.indd 18814_9780470371732-ch08_.indd 188 7/6/11 6:59 PM7/6/11 6:59 PM www.it-ebooks.info 189 Chapter 8: Saving Time and Money: Reusing Existing Code Overriding Existing Methods (Changing the Payments for Some of Your Employees) Wouldn’t you know it! Some knucklehead in the human resources department offered double pay for overtime to one of your part-time employees. Now word is getting around, and some of the other part-timers want double pay for their overtime work. If this keeps up, you’ll end up in the poorhouse, so you need to send out a memo to all the part-time employees, explaining why earning more money is not to their benefit. In the meantime, you have two kinds of part-time employees — the ones who receive double pay for overtime hours and the ones who don’t — so you need to modify your payroll software. What are your options? ✓ Well, you can dig right into the PartTimeEmployee class code, make a few changes, and hope for the best. (Not a good idea!) ✓ You can follow the previous section’s advice and create a subclass of the existing PartTimeEmployee class. “But wait,” you say. “The exist- ing PartTimeEmployee class already has a findPaymentAmount method. Do I need some tricky way of bypassing this existing find- PaymentAmount method for each double-pay-for-overtime employee?” At this point, you can thank your lucky stars that you’re doing object- oriented programming in Java. With object-oriented programming, you can create a subclass that overrides the functionality of its parent class. Listing 8-7 has just such a subclass. Listing 8-7: Yet Another Subclass public class PartTimeWithOver extends PartTimeEmployee { @Override public double findPaymentAmount(int hours) { if(hours <= 40) { return getHourlyRate() * hours; } else { return getHourlyRate() * 40 + getHourlyRate() * 2 * (hours - 40); } } } 14_9780470371732-ch08_.indd 18914_9780470371732-ch08_.indd 189 7/6/11 6:59 PM7/6/11 6:59 PM www.it-ebooks.info 190 Part III: Working with the Big Picture: Object-Oriented Programming Figure 8-8 shows the relationship between the code in Listing 8-7 and other pieces of code in this chapter. In particular, PartTimeWithOver is a sub- class of a subclass. In object-oriented programming, a chain of this kind is not the least bit unusual. In fact, as subclasses go, this chain is rather short. Figure 8-8: A tree of classes. Employee FullTimeEmployee PartTimeEmployee PartTimeWithOver The PartTimeWithOver class extends the PartTimeEmployee class, but PartTimeWithOver picks and chooses what it wants to inherit from the PartTimeEmployee class. Because PartTimeWithOver has its own decla- ration for the findPaymentAmount method, the PartTimeWithOver class doesn’t inherit a findPaymentAmount method from its parent. (See Figure 8-9.) According to the official terminology, the PartTimeWithOver class over- rides its parent class’s findPaymentAmount method. If you create an object from the PartTimeWithOver class, that object has the name, jobTitle, hourlyRate, and cutCheck of the PartTimeEmployee class, but the object has the findPaymentAmount method that’s defined in Listing 8-7. 14_9780470371732-ch08_.indd 19014_9780470371732-ch08_.indd 190 7/6/11 6:59 PM7/6/11 6:59 PM www.it-ebooks.info 191 Chapter 8: Saving Time and Money: Reusing Existing Code Figure 8-9: Method findPayment Amount isn’t inherited. Employee (Listing 8-1) name jobTitle cutCheck PartTimeEmployee (Listing 8-5) hourlyRate findPaymentAmount PartTimeWithOver (Listing 8-8) findPaymentAmount A Java annotation The word @Override in Listing 8-7 is an example of an annotation. A Java annotation tells your computer something about your code. In particular, the @Override annotation in Listing 8-7 tells the Java compiler to be on the lookout for a common coding error. The annotation says “make sure that the method immediately following this annotation has the same stuff (the same name, the same parameters, and so on) as one of the methods in the super- class. If not, then display an error message.” So if I accidentally type public double findPaymentAmount(double hours) { instead of int hours as in Listings 8-5 and 8-7, the compiler reminds me that my new findPaymentAmount method doesn’t really override anything that’s in Listing 8-5. Java has other kinds of annotations (such as @Deprecated and @ SuppressWarnings). You can read a bit about the @SuppressWarnings annotation in Chapter 9. Java’s annotations are optional. If you remove the word @Override from Listing 8-7, then your code still runs correctly. But the @Override annotation gives your code some added safety. With @Override, the compiler checks to make sure that you’re doing something that you intend to do (namely, over- riding one of the superclass’s methods). And with apologies to George Orwell, some types of annotations are less optional than others. You can omit certain annotations from your code only if you’re willing to replace the annotation with lots and lots of unannotated Java code. 14_9780470371732-ch08_.indd 19114_9780470371732-ch08_.indd 191 7/6/11 6:59 PM7/6/11 6:59 PM www.it-ebooks.info 192 Part III: Working with the Big Picture: Object-Oriented Programming Using methods from classes and subclasses If you need clarification on this notion of overriding a method, look at the code in Listing 8-8. A run of that code is shown in Figure 8-10. Listing 8-8: Testing the Code from Listing 8-7 class DoPayrollTypeF { public static void main(String args[]) { FullTimeEmployee ftEmployee = new FullTimeEmployee(); ftEmployee.setName(“Barry Burd”); ftEmployee.setJobTitle(“CEO”); ftEmployee.setWeeklySalary(5000.00); ftEmployee.setBenefitDeduction(500.00); ftEmployee.cutCheck(ftEmployee.findPaymentAmount()); PartTimeEmployee ptEmployee = new PartTimeEmployee(); ptEmployee.setName(“Chris Apelian”); ptEmployee.setJobTitle(“Computer Book Author”); ptEmployee.setHourlyRate(7.53); ptEmployee.cutCheck (ptEmployee.findPaymentAmount(50)); PartTimeWithOver ptoEmployee = new PartTimeWithOver(); ptoEmployee.setName(“Steve Surace”); ptoEmployee.setJobTitle(“Driver”); ptoEmployee.setHourlyRate(7.53); ptoEmployee.cutCheck (ptoEmployee.findPaymentAmount(50)); } } Figure 8-10: Running the code of Listing 8-8. 14_9780470371732-ch08_.indd 19214_9780470371732-ch08_.indd 192 7/6/11 6:59 PM7/6/11 6:59 PM www.it-ebooks.info 193 Chapter 8: Saving Time and Money: Reusing Existing Code The code in Listing 8-8 writes checks to three employees. The first employee is a full-timer. The second is a part-time employee who hasn’t yet gotten wind of the overtime payment scheme. The third employee knows about the over- time payment scheme and demands a fair wage. With the subclasses, all three of these employees coexist in Listing 8-8. Sure, one subclass comes from the old PartTimeEmployee class, but that doesn’t mean you can’t create an object from the PartTimeEmployee class. In fact, Java is very smart about this. Listing 8-8 has three calls to the findPaymentAmount method, and each call reaches out to a different version of the method. ✓ In the first call, ftEmployee.findPaymentAmount, the ftEmployee variable is an instance of the FullTimeEmployee class. So the method that’s called is the one in Listing 8-3. ✓ In the second call, ptEmployee.findPaymentAmount, the pt- Employee variable is an instance of the PartTimeEmployee class. So the method that’s called is the one in Listing 8-5. ✓ In the third call, ptoEmployee.findPaymentAmount, the pto- Employee variable is an instance of the PartTimeWithOver class. So the method that’s called is the one in Listing 8-7. This code is fantastic. It’s clean, elegant, and efficient. With all the money that you save on software, you can afford to pay everyone double for overtime hours. (Whether you do that or keep the money for yourself is another story.) 14_9780470371732-ch08_.indd 19314_9780470371732-ch08_.indd 193 7/6/11 6:59 PM7/6/11 6:59 PM www.it-ebooks.info 194 Part III: Working with the Big Picture: Object-Oriented Programming 14_9780470371732-ch08_.indd 19414_9780470371732-ch08_.indd 194 7/6/11 6:59 PM7/6/11 6:59 PM www.it-ebooks.info Chapter 9 Constructing New Objects In This Chapter ▶ Defining constructors ▶ Using constructors in subclasses ▶ Using Java’s default constructor features ▶ Constructing a simple GUI Ms. Jennie Burd 121 Schoolhouse Lane Anywhere, Kansas Dear Ms. Burd, In response to your letter of June 21, I believe I can say with complete assur- ance that objects are not created spontaneously from nothing. Although I have never actually seen an object being created (and no one else in this office can claim to have seen an object in its moment of creation), I have every confidence that some process or other is responsible for the building of these interesting and useful thingamajigs. We here at ClassesAndObjects.com sup- port the unanimous opinions of both the scientific community and the private sector on matters of this nature. Furthermore, we agree with the recent finding of a Blue Ribbon Presidential Panel, which concludes beyond any doubt that spontaneous object creation would impede the present economic outlook. Please be assured that I have taken all steps necessary to ensure the safety and well being of you, our loyal customer. If you have any further questions, please do not hesitate to contact our complaint department. The depart- ment’s manager is Mr. Blake Wholl. You can contact him by visiting our company’s website. Once again, let me thank you for your concern, and I hope you continue to patronize ClassesAndObjects.com. Yours truly, Mr. Scott Brickenchicker The one who couldn’t get on the elevator in Chapter 4 15_9780470371732-ch09.indd 19515_9780470371732-ch09.indd 195 7/6/11 7:02 PM7/6/11 7:02 PM www.it-ebooks.info 196 Part III: Working with the Big Picture: Object-Oriented Programming Defining Constructors (What It Means to Be a Temperature) Here’s a statement that creates an object: Account myAccount = new Account(); I know this works — I got it from one of my own examples in Chapter 7. Anyway, in Chapter 7, I say, “when the computer executes new Account(), you’re creating an object by calling the Account class’s constructor.” What does this mean? Well, when you ask the computer to create a new object, the computer responds by performing certain actions. For starters, the computer finds a place in its memory to store information about the new object. If the object has fields, the fields should eventually have meaningful values. To find out about fields, see Chapter 7. So one question is, when you ask the computer to create a new object, can you control what’s placed in the object’s fields? And what if you’re inter- ested in doing more than filling fields? Perhaps, when the computer creates a new object, you have a whole list of jobs for the computer to carry out. For instance, when the computer creates a new window object, you want the computer to realign the sizes of all the buttons in that window. Creating a new object can involve all kinds of tasks, so in this chapter, you create constructors. A constructor tells the computer to perform a new object’s startup tasks. What is a temperature? “Good morning, and welcome to Object News. The local temperature in your area is a pleasant 73 degrees Fahrenheit.” Each temperature consists of two things: a number and a temperature scale. A number is just a double value, such as 32.0 or 70.52. But what’s a tempera- ture scale? Is it a string of characters, like “Fahrenheit” or “Celsius”? Not really, because some strings aren’t temperature scales. There’s no “Quelploof” temperature scale, and a program that can display the tem- perature “73 degrees Quelploof” is a bad program. So how can you limit the temperature scales to the small number of scales that people use? One way to do it is with Java’s enum type. 15_9780470371732-ch09.indd 19615_9780470371732-ch09.indd 196 7/6/11 7:02 PM7/6/11 7:02 PM www.it-ebooks.info 197 Chapter 9: Constructing New Objects What is a temperature scale? (Java’s enum type) Java provides lots of ways for you to group things together. In Chapter 11, you can group things into an array or a collection. In this chapter, you group things into an enum type. (Of course, you can’t group anything unless you can pronounce enum. The word enum is pronounced ee-noom, like the first two syllables of the word enumeration.) Creating a complicated enum type isn’t easy, but to create a simple enum type, just write a bunch of words inside a pair of curly braces. Listing 9-1 defines an enum type. The name of the enum type is TempScale. Listing 9-1: The TempScale enum Type public enum TempScale { CELSIUS, FAHRENHEIT, KELVIN, RANKINE, NEWTON, DELISLE, RÉAUMUR, RØMER, LEIDEN }; When you define an enum type, two important things happen: ✓ You create values. Just as 13 and 151 are int values, CELSIUS and FAHRENHEIT are TempScale values. ✓ You can create variables to refer to those values. In Listing 9-2, I declare the fields number and scale. Just as double number declares a number variable is of type double, TempScale scale declares variable scale to be of type TempScale. Being of type TempScale means that you can have values CELSIUS, FAHRENHEIT, KELVIN, and so on. So in Listing 9-2, I can give the scale variable the value FAHRENHEIT (or TempScale.FAHRENHEIT, to be more precise). An enum type is a Java class in disguise. That’s why Listing 9-1 contains an entire file devoted to one thing; namely, the declaration of the TempScale enum type. Like the declaration of a class, an enum type declaration belongs in a file all its own. The code in Listing 9-1 belongs in a file named TempScale.java. Okay, so then what is a temperature? Each temperature consists of two things: a number and a temperature scale. The code in Listing 9-2 makes this fact abundantly clear. 15_9780470371732-ch09.indd 19715_9780470371732-ch09.indd 197 7/6/11 7:02 PM7/6/11 7:02 PM www.it-ebooks.info 198 Part III: Working with the Big Picture: Object-Oriented Programming Listing 9-2: The Temperature Class public class Temperature { private double number; private TempScale scale; public Temperature() { number = 0.0; scale = TempScale.FAHRENHEIT; } public Temperature(double number) { this.number = number; scale = TempScale.FAHRENHEIT; } public Temperature(TempScale scale) { number = 0.0; this.scale = scale; } public Temperature(double number, TempScale scale) { this.number = number; this.scale = scale; } public void setNumber(double number) { this.number = number; } public double getNumber() { return number; } public void setScale(TempScale scale) { this.scale = scale; } public TempScale getScale() { return scale; } } The code in Listing 9-2 has the usual setter and getter methods (accessor methods for the number and scale fields). For some good reading on setter and getter methods (also known as accessor methods), see Chapter 7. 15_9780470371732-ch09.indd 19815_9780470371732-ch09.indd 198 7/6/11 7:02 PM7/6/11 7:02 PM www.it-ebooks.info 199 Chapter 9: Constructing New Objects On top of all that, Listing 9-2 has four other method-like looking things. Each of these method-like things has the name Temperature, which happens to be the same as the name of the class. None of these Temperature method- like things has a return type of any kind — not even void, which is the copout return type. Each of these method-like things is called a constructor. A constructor is like a method, except that a constructor has a very special purpose — creating new objects. Whenever the computer creates a new object, the computer executes the statements inside a constructor. You can omit the word public in the first lines of Listings 9-1 and 9-2. If you omit public, other Java programs might not be able to use the features defined in your TempScale enum and in your Temperature class. (Don’t worry about the programs in this chapter. With or without the word public, all the programs in this chapter can use the code in Listings 9-1 and 9-2. To find out which Java programs can and cannot use non-public classes, see Chapter 13.) If you do use the word public in the first line of Listing 9-1, Listing 9-1 must be in a file named TempScale.java, starting with a capital letter T. And if you do use the word public in the first line of Listing 9-2, Listing 9-2 must be in a file named Temperature.java, starting with a capital letter T. (For an introduction to public classes, see Chapter 7.) What you can do with a temperature Listing 9-3 gives form to some of the ideas that I describe in the preceding section. In Listing 9-3, you call the constructors that are declared back in Listing 9-2. Figure 9-1 shows what happens when you run all this code. Listing 9-3: Using the Temperature Class import static java.lang.System.out; class UseTemperature { public static void main(String args[]) { final String format = “%5.2f degrees %s\n”; Temperature temp = new Temperature(); temp.setNumber(70.0); temp.setScale(TempScale.FAHRENHEIT); out.printf(format, temp.getNumber(), temp.getScale()); (continued) 15_9780470371732-ch09.indd 19915_9780470371732-ch09.indd 199 7/6/11 7:02 PM7/6/11 7:02 PM www.it-ebooks.info 200 Part III: Working with the Big Picture: Object-Oriented Programming Listing 9-3 (continued) temp = new Temperature(32.0); out.printf(format, temp.getNumber(), temp.getScale()); temp = new Temperature(TempScale.CELSIUS); out.printf(format, temp.getNumber(), temp.getScale()); temp = new Temperature(2.73, TempScale.KELVIN); out.printf(format, temp.getNumber(), temp.getScale()); } } Figure 9-1: Running the code from Listing 9-3. In Listing 9-3, each statement of the kind temp = new Temperature(blah,blah,blah); calls one of the constructors from Listing 9-2. So, by the time the code in Listing 9-3 is done running, it creates four instances of the Temperature class. Each instance is created by calling a different constructor from Listing 9-2. In Listing 9-3, the last of the four constructor calls has two parameters — 2.73 and TempScale.KELVIN. This isn’t particular to constructor calls. A method call or a constructor call can have a bunch of parameters. You sepa- rate one parameter from another with a comma. Another name for “a bunch of parameters” is a parameter list. The only rule you must follow is to match the parameters in the call with the parameters in the declaration. For example, in Listing 9-3, the fourth and last constructor call new Temperature(2.73, TempScale.KELVIN) has two parameters — the first of type double, and the second of type TempScale. Java approves of this constructor call because Listing 9-2 contains a matching declaration. That is, the header 15_9780470371732-ch09.indd 20015_9780470371732-ch09.indd 200 7/6/11 7:02 PM7/6/11 7:02 PM www.it-ebooks.info 201 Chapter 9: Constructing New Objects public Temperature(double number, TempScale scale) has two parameters — the first of type double, and the second of type TempScale. If a Temperature constructor call in Listing 9-3 had no matching declaration in Listing 9-2, then Listing 9-3 would crash and burn. (To state things more politely, Java would display errors when you tried to compile the code in Listing 9-3.) By the way, this business about multiple parameters isn’t new. Back in Chapter 6, I write keyboard.findWithinHorizon(“.”,0).charAt(0). In that line, the method call findWithinHorizon(“.”,0) has two parameters — a string and an int value. Lucky for me, the Java API has a method declaration for findWithinHorizon — a declaration whose first parameter is a string, and whose second parameter is an int value. Calling new Temperature(32.0): A case study When the computer executes one of the new Temperature statements in Listing 9-3, the computer has to decide which of the constructors in Listing 9-2 to use. The computer decides by looking at the parameter list — the stuff in parentheses after the words new Temperature. For instance, when the computer executes temp = new Temperature(32.0); from Listing 9-3, the computer says to itself, “The number 32.0 in parentheses is a double value. One of the Temperature constructors in Listing 9-2 has just one parameter with type double. The constructor’s header looks like this: public Temperature(double number) “So, I guess I’ll execute the statements inside that particular constructor.” The computer goes on to execute the following statements: this.number = number; scale = TempScale.FAHRENHEIT; As a result, you get a brand-new object whose number field has the value 32.0 and whose scale field has the value TempScale.FAHRENHEIT. 15_9780470371732-ch09.indd 20115_9780470371732-ch09.indd 201 7/6/11 7:02 PM7/6/11 7:02 PM www.it-ebooks.info 202 Part III: Working with the Big Picture: Object-Oriented Programming In the two lines of code, you have two statements that set values for the fields number and scale. Take a look at the second of these statements, which is a bit easier to understand. The second statement sets the new object’s scale field to TempScale.FAHRENHEIT. You see, the constructor’s parameter list is (double number), and that list doesn’t include a scale value. So whoever programmed this code had to make a decision about what value to use for the scale field. The programmer could have chosen FAHRENHEIT or CELSIUS, but she could also have chosen KELVIN, RANKINE, or any of the other obscure scales named in Listing 9-1. (This programmer happens to live in New Jersey, in the United States, where people commonly use the old Fahrenheit temperature scale.) How to cheat: enum types and switch statements Listings 9-2 and 9-3 contain long-winded names such as TempScale.FAHRENHEIT and TempScale.CELSIUS. Names such as FAHRENHEIT and CELSIUS belong to my TempScale enum type (the type defined in Listing 9-1). These names have no meaning outside of my TempScale context. (If you think I’m being egotistical with this “no mean- ing outside of my context” remark, try delet- ing the TempScale. part of TempScale. FAHRENHEIT in Listing 9-2. Suddenly, Java tells you that your code contains an error.) Java is normally very fussy about type names and dots. But when they created enum types, the makers of Java decided that enums and switch statements deserved special treat- ment. You can use an enum value to decide which case to execute in a switch state- ment. When you do this, you don’t use the enum type name in the case expressions. For exam- ple, the following Java code is correct: TempScale scale = TempScale. RANKINE; char letter; switch (scale) { case CELSIUS: letter = ‘C’; break; case KELVIN: letter = ‘K’; break; case RANKINE: case RÉAUMUR: case RØMER: letter = ‘R’; break; default: letter = ‘X’; break; } In the first line of code, I write TempScale. RANKINE because this first line isn’t inside a switch statement. But in the next sev- eral lines of code, I write case CELSIUS, case KELVIN, and case RANKINE with- out the word TempScale. In fact, if I create a case clause by writing case TempScale. RANKINE, then Java complains with a loud, obnoxious error message. 15_9780470371732-ch09.indd 20215_9780470371732-ch09.indd 202 7/6/11 7:02 PM7/6/11 7:02 PM www.it-ebooks.info 203 Chapter 9: Constructing New Objects Marching back to the first of the two statements, this first statement assigns a value to the new object’s number field. The statement uses a cute trick that you can see in many constructors (and in other methods that assign values to objects’ fields). To understand the trick, take a look at Listing 9-4. The list- ing shows you two ways that I could have written the same constructor code. Listing 9-4: Two Ways to Accomplish the Same Thing //Use this constructor ... public Temperature(double whatever) { number = whatever; scale = TempScale.FAHRENHEIT; } //... or use this constructor ... public Temperature(double number) { this.number = number; scale = TempScale.FAHRENHEIT; } //... but don’t put both constructors in your code. Listing 9-4 has two constructors in it. In the first constructor, I use two differ- ent names — number and whatever. In the second constructor, I don’t need two names. Instead of making up a new name for the constructor’s param- eter, I reuse an existing name by writing this.number. So here’s what’s going on in Listing 9-2: ✓ In the statement this.number = number, the name this.number refers to the new object’s number field — the field that’s declared near the very top of Listing 9-2. (See Figure 9-2.) ✓ In the statement this.number = number, the word number (on its own, without this) refers to the constructor’s parameter. (Again, see Figure 9-2.) In general, this.someName refers to a field belonging to the object that contains the code. In contrast, plain old someName refers to the closest place where someName happens to be declared. In the statement this.number = number (Listing 9-2), that closest place happens to be the Temperature con- structor’s parameter list. 15_9780470371732-ch09.indd 20315_9780470371732-ch09.indd 203 7/6/11 7:02 PM7/6/11 7:02 PM www.it-ebooks.info 204 Part III: Working with the Big Picture: Object-Oriented Programming Figure 9-2: What this. number and number mean. What’s this all about? Suppose your code contains a constructor — the first of the two constructors in Listing 9-4. The whatever parameter is passed a number like 32.0, for instance. Then the first statement in the constructor’s body assigns that value, 32.0, to the new object’s number field. The code works. But in writing this code, you had to make up a new name for a parameter — the name whatever. And the only purpose for this new name is to hand a value to the object’s number field. What a waste! To distinguish between the parameter and the number field, you gave a name to something that was just momentary storage for the number value. Making up names is an art, not a science. I’ve gone through plenty of naming phases. Years ago, whenever I needed a new name for a parameter, I picked a confusing misspelling of the original variable name. (I’d name the param- eter something like numbr or nuhmber.) I’ve also tried changing a variable name’s capitaliza- tion to come up with a parameter name. (I’d use parameter names like Number or nUMBER.) In Chapter 8, I name all my parameters by adding the suffix In to their corresponding variable names. (The jobTitle variable matched up with the jobTitleIn parameter.) None of these naming schemes works very well. I can never remember the quirky new names that I’ve created. The good news is that this parameter- naming effort isn’t necessary. You can give the parameter the same name as the variable. To distinguish between the two, you use the Java keyword this. 15_9780470371732-ch09.indd 20415_9780470371732-ch09.indd 204 7/6/11 7:02 PM7/6/11 7:02 PM www.it-ebooks.info 205 Chapter 9: Constructing New Objects Some things never change Chapter 7 introduces the printf method and explains that each printf call starts with a format string. The format string describes the way the other parameters are to be displayed. In previous examples, this format string is always a quoted literal. For instance, the first printf call in Listing 7-7 is out.printf(“$%4.2f\n”, myInterest); In Listing 9-3, I break with tradition and begin the printf call with a variable that I name format. out.printf(format, temp.getNumber(), temp.getScale()); That’s okay as long as my format variable is of type String. And indeed, in Listing 9-3, the first variable declaration is final String format = “%5.2f degrees %s\n”; In this declaration of the format variable, take special note of the word final. This Java keyword indicates that the value of format can’t be changed. If I add another assignment statement to Listing 9-3 format = “%6.2f (%s)\n”; then the compiler barks back at me with a cannot assign a value to final variable message. When I write the code in Listing 9-3, the use of the final keyword isn’t abso- lutely necessary. But the final keyword provides some extra protection. When I initialize format to “%5.2f degrees %s\n”, I intend to use this same format just as it is, over and over again. I know darn well that I don’t intend to change the format variable’s value. Of course, in a 10,000-line pro- gram, I can become confused and try to assign a new value to format some- where deep down in the code. So to prevent me from accidentally changing the format string, I declare the format variable to be final. It’s just good, safe programming practice. 15_9780470371732-ch09.indd 20515_9780470371732-ch09.indd 205 7/6/11 7:02 PM7/6/11 7:02 PM www.it-ebooks.info 206 Part III: Working with the Big Picture: Object-Oriented Programming More Subclasses (Doing Something about the Weather) In Chapter 8, I make a big fuss over the notion of subclasses. That’s the right thing to do. Subclasses make code reusable, and reusable code is good code. With that in mind, it’s time to create a subclass of the Temperature class (which I develop in this chapter’s first section). Building better temperatures After perusing the code in Listing 9-3, you decide that the responsibility for displaying temperatures has been seriously misplaced. Listing 9-3 has several tedious repetitions of the lines to print temperature values. A 1970s program- mer would tell you to collect those lines into one place and turn them into a method. (The 1970s programmer wouldn’t have used the word method, but that’s not important right now.) Collecting lines into methods is fine, but with today’s object-oriented programming methodology, you think in broader terms. Why not get each temperature object to take responsibility for dis- playing itself? After all, if you develop a display method, you probably want to share the method with other people who use temperatures. So put the method right inside the declaration of a temperature object. That way, anyone who uses the code for temperatures has easy access to your display method. Now replay the tape from Chapter 8. “Blah, blah, blah . . . don’t want to modify existing code . . . blah, blah, blah . . . too costly to start again from scratch . . . blah, blah, blah . . . extend existing functionality.” It all adds up to one thing: Don’t abuse it. Instead, reuse it. So you decide to create a subclass of the Temperature class — the class defined in Listing 9-2. Your new subclass complements the Temperature class’s functionality by having methods to display values in a nice, uniform fashion. The new class, TemperatureNice, is shown in Listing 9-5. Listing 9-5: The TemperatureNice Class import static java.lang.System.out; public class TemperatureNice extends Temperature { public TemperatureNice() { super(); } 15_9780470371732-ch09.indd 20615_9780470371732-ch09.indd 206 7/6/11 7:02 PM7/6/11 7:02 PM www.it-ebooks.info 207 Chapter 9: Constructing New Objects public TemperatureNice(double number) { super(number); } public TemperatureNice(TempScale scale) { super(scale); } public TemperatureNice(double number, TempScale scale) { super(number, scale); } public void display() { out.printf(“%5.2f degrees %s\n”, getNumber(), getScale()); } } In the display method of Listing 9-5, notice the calls to the Temperature class’s getNumber and getScale methods. Why do I do this? Well, inside the TemperatureNice class’s code, any direct references to the number and scale fields would generate error messages. It’s true that every TemperatureNice object has its own number and scale fields. (After all, TemperatureNice is a subclass of the Temperature class, and the code for the Temperature class defines the number and scale fields.) But because number and scale are declared to be private inside the Temperature class, only code that’s right inside the Temperature class can directly use these fields. Don’t put additional declarations of the number and scale fields inside the TemperatureNice class’s code. If you do, you inadvertently create four dif- ferent variables (two called number, and another two called scale). You’ll assign values to one pair of variables. Then you’ll be shocked that, when you display the other pair of variables, those values seem to have disappeared. When an object’s code contains a call to one of the object’s own methods, you don’t need to preface the call with a dot. For instance, in the last state- ment of Listing 9-5, the object calls its own methods with getNumber() and getScale(), not with someObject.getNumber() and somethingOr- Other.getScale(). If going dotless makes you queasy, you can compen- sate by taking advantage of yet another use for the this keyword. Just write this.getNumber() and this.getScale() in the last line of Listing 9-5. 15_9780470371732-ch09.indd 20715_9780470371732-ch09.indd 207 7/6/11 7:02 PM7/6/11 7:02 PM www.it-ebooks.info 208 Part III: Working with the Big Picture: Object-Oriented Programming Constructors for subclasses By far, the biggest news in Listing 9-5 is the way the code declares construc- tors. The TemperatureNice class has four of its own constructors. If you’ve gotten in gear thinking about subclass inheritance, you may wonder why these constructor declarations are necessary. Doesn’t TemperatureNice inherit the parent Temperature class’s constructors? No, subclasses don’t inherit constructors. Subclasses don’t inherit constructors. That’s right. Subclasses don’t inherit constructors. In one oddball case, a constructor may look like it’s being inherited, but that oddball situation is a fluke, not the norm. In general, when you define a subclass, you declare new constructors to go with the subclass. I describe the oddball case (in which a constructor looks like it’s being inher- ited) later in this chapter, in the section “The default constructor.” So the code in Listing 9-5 has four constructors. Each constructor has the name TemperatureNice, and each constructor has its own, uniquely identifiable parameter list. That’s the boring part. The interesting part is that each constructor makes a call to something named super, which is a Java keyword. In Listing 9-5, super stands for a constructor in the parent class. ✓ The statement super() in Listing 9-5 calls the parameterless Temperature() constructor that’s in Listing 9-2. That parameter- less constructor assigns 0.0 to the number field and TempScale. FAHRENHEIT to the scale field. ✓ The statement super(number, scale) in Listing 9-5 calls the con- structor Temperature(double number, TempScale scale) that’s in Listing 9-2. In turn, the constructor assigns values to the number and scale fields. ✓ In a similar way, the statements super(number) and super(scale) in Listing 9-5 call constructors from Listing 9-2. The computer decides which of the Temperature class’s constructors is being called by looking at the parameter list after the word super. For instance, when the computer executes super(number, scale); from Listing 9-5, the computer says to itself, “The number and scale fields in parentheses have types double and TempScale. But only one of the Temperature constructors in Listing 9-2 has two parameters with types double and TempScale. The constructor’s header looks like this: 15_9780470371732-ch09.indd 20815_9780470371732-ch09.indd 208 7/6/11 7:02 PM7/6/11 7:02 PM www.it-ebooks.info 209 Chapter 9: Constructing New Objects public Temperature(double number, TempScale scale) “So, I guess I’ll execute the statements inside that particular constructor.” Using all this stuff In Listing 9-5, I define what it means to be in the TemperatureNice class. Now it’s time to put this TemperatureNice class to good use. Listing 9-6 has code that uses TemperatureNice. Listing 9-6: Using the TemperatureNice Class class UseTemperatureNice { public static void main(String args[]) { TemperatureNice temp = new TemperatureNice(); temp.setNumber(70.0); temp.setScale(TempScale.FAHRENHEIT); temp.display(); temp = new TemperatureNice(32.0); temp.display(); temp = new TemperatureNice(TempScale.CELSIUS); temp.display(); temp = new TemperatureNice(2.73, TempScale.KELVIN); temp.display(); } } The code in Listing 9-6 is very much like its cousin code in Listing 9-3. The big differences are as follows: ✓ Listing 9-6 creates instances of the TemperatureNice class. That is, Listing 9-6 calls constructors from the TemperatureNice class, not the Temperature class. ✓ Listing 9-6 takes advantage of the display method in the TemperatureNice class. So the code in Listing 9-6 is much tidier than its counterpart in Listing 9-3. A run of Listing 9-6 looks exactly like a run of the code in Listing 9-3 — it just gets to the finish line in far more elegant fashion. (The run is shown previ- ously in Figure 9-1.) 15_9780470371732-ch09.indd 20915_9780470371732-ch09.indd 209 7/6/11 7:02 PM7/6/11 7:02 PM www.it-ebooks.info 210 Part III: Working with the Big Picture: Object-Oriented Programming The default constructor The main message in the previous section is that subclasses don’t inherit constructors. So what gives with all the listings back in Chapter 8? In Listing 8-6, a statement says FullTimeEmployee ftEmployee = new FullTimeEmployee(); But, here’s the problem: The code defining FullTimeEmployee (Listing 8-3) doesn’t seem to have any constructors declared inside it. So, in Listing 8-6, how can you possibly call the FullTimeEmployee constructor? Here’s what’s going on. When you create a subclass and don’t put any explicit constructor declarations in your code, Java creates one construc- tor for you. It’s called a default constructor. If you’re creating the public FullTimeEmployee subclass, the default constructor looks like the one in Listing 9-7. Listing 9-7: A Default Constructor public FullTimeEmployee() { super(); } The constructor in Listing 9-7 takes no parameters, and its one statement calls the constructor of whatever class you’re extending. (Woe be to you if the class that you’re extending doesn’t have a parameterless constructor.) You’ve just read about default constructors, but watch out! Notice one thing that this talk about default constructors doesn’t say: It doesn’t say that you always get a default constructor. In particular, if you create a subclass and define any constructors yourself, Java doesn’t add a default constructor for the subclass (and the subclass doesn’t inherit any constructors, either). So how can this trip you up? Listing 9-8 has a copy of the code from Listing 8-3, but with one constructor added to it. Take a look at this modified version of the FullTimeEmployee code. Listing 9-8: Look, I Have a Constructor! public class FullTimeEmployee extends Employee { private double weeklySalary; private double benefitDeduction; public FullTimeEmployee(double weeklySalary) { this.weeklySalary = weeklySalary; } 15_9780470371732-ch09.indd 21015_9780470371732-ch09.indd 210 7/6/11 7:02 PM7/6/11 7:02 PM www.it-ebooks.info 211 Chapter 9: Constructing New Objects public void setWeeklySalary(double weeklySalaryIn) { weeklySalary = weeklySalaryIn; } public double getWeeklySalary() { return weeklySalary; } public void setBenefitDeduction(double benefitDedIn) { benefitDeduction = benefitDedIn; } public double getBenefitDeduction() { return benefitDeduction; } public double findPaymentAmount() { return weeklySalary - benefitDeduction; } } If you use the FullTimeEmployee code in Listing 9-8, a line like the follow- ing doesn’t work: FullTimeEmployee ftEmployee = new FullTimeEmployee(); It doesn’t work because, having declared a FullTimeEmployee constructor that takes one double parameter, you no longer get a default parameterless constructor for free. So what do you do about this? If you declare any constructors, declare all the constructors that you’re possibly going to need. Take the construc- tor in Listing 9-7 and add it to the code in Listing 9-8. Then the call new FullTimeEmployee() starts working again. Under certain circumstances, Java automatically adds an invisible call to a parent class’s constructor at the top of a constructor body. This automatic addition of a super call is a tricky bit of business that doesn’t appear often, so when it does appear, it may seem quite mysterious. For more information, see this book’s website. A Constructor That Does More Here’s a quote from someplace near the start of this chapter: “And what if you’re interested in doing more than filling fields? Perhaps, when the com- puter creates a new object, you have a whole list of jobs for the computer to carry out.” Okay, what if? 15_9780470371732-ch09.indd 21115_9780470371732-ch09.indd 211 7/6/11 7:02 PM7/6/11 7:02 PM www.it-ebooks.info 212 Part III: Working with the Big Picture: Object-Oriented Programming This section’s example has a constructor that does more than just assign values to fields. The example is in Listings 9-9 and 9-10. The result of running the example’s code is shown in Figure 9-3. Listing 9-9: Defining a Frame import java.awt.FlowLayout; import javax.swing.JFrame; import javax.swing.JButton; @SuppressWarnings(“serial”) public class SimpleFrame extends JFrame { public SimpleFrame() { setTitle(“Don’t click the button!”); setLayout(new FlowLayout()); setDefaultCloseOperation(EXIT_ON_CLOSE); add(new JButton(“Panic”)); setSize(300, 100); setVisible(true); } } Listing 9-10: Displaying a Frame class ShowAFrame { public static void main(String args[]) { new SimpleFrame(); } } Figure 9-3: Don’t panic. The code in Listing 9-9 is made up mostly of calls to Java API (Application Programming Interface) methods. What this means to you is that the code contains lots of names that are probably unfamiliar to you. When I was first becoming acquainted with Java, I foolishly believed that knowing Java meant knowing all these names. Quite the contrary: These names are just carry-on baggage. The real Java is the way the language implements object-oriented concepts. 15_9780470371732-ch09.indd 21215_9780470371732-ch09.indd 212 7/6/11 7:02 PM7/6/11 7:02 PM www.it-ebooks.info 213 Chapter 9: Constructing New Objects Anyway, Listing 9-10’s main method has only one statement: a call to the con- structor in the SimpleFrame class. Notice how the object that this call cre- ates isn’t even assigned to a variable. That’s okay because the code doesn’t need to refer to the object anywhere else. Up in the SimpleFrame class is only one constructor declaration. Far from just setting variables’ values, this constructor calls method after method from the Java API. Packages and import declarations Java has a feature that lets you lump classes into groups of classes. Each lump of classes is called a package. In the Java world, pro- grammers customarily give these packages long, dot-filled names. For instance, because I’ve registered the domain name allmycode. com, I may name a package com.allmy- code.utils.textUtils. The Java API is actually a big collection of packages. The API has packages with names like java.lang, java.util, java.awt, javax.swing, and so on. With this information about packages, I can clear up some of the confusion about import declarations. Any import declaration that doesn’t use the word static must start with the name of a package and must end with either of the following: ✓ The name of a class within that package ✓ An asterisk (indicating all classes within that package) For example, the declaration import java.util.Scanner; is valid because java.util is the name of a package in the Java API, and Scanner is the name of a class in the java.util package. The dotted name java.util.Scanner is the fully qualified name of the Scanner class. A class’s fully qualified name includes the name of the package in which the class is defined. (You can find out all this stuff about java.util and Scanner by reading Java’s API documentation. For tips on reading the documentation, see Chapter 3 and this book’s website.) Here’s another example. The declaration import javax.swing.*; is valid because javax.swing is the name of a package in the Java API, and the asterisk refers to all classes in the javax.swing package. With this import declaration at the top of your Java code, you can use abbrevi- ated names for classes in the javax.swing package — names like JFrame, JButton, JMenuBar, JCheckBox, and many others. Here’s one more example. A line like import javax.*; //Bad!! is not a valid import declaration. The Java API has no package with the one-word name javax. You may think that this line allows you to abbreviate all names beginning with javax (names like javax.swing.JFrame and javax.sound.midi), but that’s not the way the import declaration works. Because javax isn’t the name of a package, the line import javax.* just angers the Java compiler. 15_9780470371732-ch09.indd 21315_9780470371732-ch09.indd 213 7/6/11 7:02 PM7/6/11 7:02 PM www.it-ebooks.info 214 Part III: Working with the Big Picture: Object-Oriented Programming All the methods called in the SimpleFrame class’s constructor come from the parent class, JFrame. The JFrame class lives in the javax.swing pack- age. This package and another package, java.awt, have classes that help you put windows, images, drawings, and other gizmos on a computer screen. (In the java.awt package, the letters awt stand for abstract windowing toolkit.) For a little gossip about the notion of a Java package, see the sidebar entitled “Packages and import declarations.” For lots of gossip about the notion of a Java package, see Chapter 13. In the Java API, what people normally call a window is an instance of the javax.swing.JFrame class. Classes and methods from the Java API Looking at Figure 9-3, you can probably tell that an instance of the SimpleFrame class doesn’t do much. The frame has only one button, and when you click the button, nothing happens. I made the frame this way to keep the example from becoming too complicated. Even so, the code in Listing 9-9 uses several API classes and methods. The setTitle, setLayout, setDefaultCloseOperation, add, setSize, and setVisible methods all belong to the javax.swing.JFrame class. Here’s a list of names used in the code: ✓ setTitle: Calling setTitle puts words in the frame’s title bar. (The new SimpleFrame object is calling its own setTitle method.) ✓ FlowLayout: An instance of the FlowLayout class positions objects on the frame in centered, typewriter fashion. Because the frame in Figure 9-3 has only one button on it, that button is centered near the top of the frame. If the frame had eight buttons, five of them may be lined up in a row across the top of the frame and the remaining three would be centered along a second row. ✓ setLayout: Calling setLayout puts the new FlowLayout object in charge of arranging components, such as buttons, on the frame. (The new SimpleFrame object is calling its own setLayout method.) ✓ setDefaultCloseOperation: Calling setDefaultCloseOperation tells Java what to do when you click the little × in the frame’s upper-right corner. Without this method call, the frame itself disappears, but the Java virtual machine (JVM) keeps running. If you use Eclipse, you have to halt the JVM by clicking the red square near the top of the Console view. (See Figure 9-4.) 15_9780470371732-ch09.indd 21415_9780470371732-ch09.indd 214 7/6/11 7:02 PM7/6/11 7:02 PM www.it-ebooks.info 215 Chapter 9: Constructing New Objects Figure 9-4: Telling Eclipse to terminate the run of a Java program. Calling setDefaultCloseOperation(EXIT_ON_CLOSE) tells Java to shut itself down when you click the × in the frame’s upper-right corner. The alternatives to EXIT_ON_CLOSE are HIDE_ON_CLOSE, DISPOSE_ ON_CLOSE, and my personal favorite, DO_NOTHING_ON_CLOSE. ✓ JButton: The JButton class lives in the javax.swing package. One of the class’s constructors takes a String instance (such as “Panic”) for its parameter. Calling this constructor makes that String instance into the label on the face of the new button. ✓ add: The new SimpleFrame object calls its add method. Calling the add method places the button on the object’s surface (in this case, the sur- face of the frame). ✓ setSize: The frame becomes 300 pixels wide and 100 pixels tall. (In the javax.swing package, whenever you specify two dimension numbers, the width number always comes before the height number.) ✓ setVisible: When it’s first created, a new frame is invisible. But when the new frame calls setVisible(true), the frame appears on your computer screen. The SuppressWarnings annotation Chapter 8 introduces the annotation — extra code that provides useful infor- mation about the nature of your program. In particular, Chapter 8 describes the Override annotation. In this chapter, Listing 9-9 introduces another type of annotation: the SuppressWarnings annotation. When you use a SuppressWarnings anno- tation, you tell Java not to remind you that your program contains certain questionable code. In Listing 9-9, the line @SuppressWarnings(“serial”) tells Java not to remind you that you’ve omitted something called a serialVersionUID field. In other words, the SuppressWarnings annota- tion tells Java not to display a warning like the one in Figure 9-5. 15_9780470371732-ch09.indd 21515_9780470371732-ch09.indd 215 7/6/11 7:02 PM7/6/11 7:02 PM www.it-ebooks.info 216 Part III: Working with the Big Picture: Object-Oriented Programming Figure 9-5: Without a Suppress Warnings annotation, Java warns you about a missing serial- VersionUID field. “And what,” you ask, “is a serialVersionUID field?” It’s something having to do with extending the JFrame class — something that you don’t care about. Not having a serialVersionUID field generates a warning, not an error. So live dangerously! Just suppress the warning (with the annotation in Listing 9-9) and don’t worry about serialVersionUID fields. 15_9780470371732-ch09.indd 21615_9780470371732-ch09.indd 216 7/6/11 7:02 PM7/6/11 7:02 PM www.it-ebooks.info Part IV Savvy Java Techniques 16_9780470371732-pp04.indd 21716_9780470371732-pp04.indd 217 7/6/11 7:02 PM7/6/11 7:02 PM www.it-ebooks.info In this part . . . Here’s where I start sharing some big-time Java concepts. This part of the book describes the tricky things, the little nooks and crannies, the special rules, and the not-so-special exceptions. As usual, you shouldn’t feel intimidated. I take you one step at a time and keep the whole thing light, interesting, and manageable. 16_9780470371732-pp04.indd 21816_9780470371732-pp04.indd 218 7/6/11 7:02 PM7/6/11 7:02 PM www.it-ebooks.info Chapter 10 Putting Variables and Methods Where They Belong In This Chapter ▶ Making something belong to an entire class ▶ Putting variables inside and outside methods ▶ Improving your batting average Hello, again. You’re listening to radio station WWW, and I’m your host, Sam Burd. It’s the start again of the big baseball season, and today station WWW brought you live coverage of the Hankees versus Socks game. At this moment, I’m awaiting news of the game’s final score. If you remember from earlier this afternoon, the Socks looked like they were going to take those Hankees to the cleaners. Then, the Hankees were belting ball after ball, giving the Socks a run for their money. Those Socks! I’m glad I wasn’t in their shoes. Anyway, as the game went on, the Socks pulled themselves up. Now the Socks are nose to nose with the Hankees. We’ll get the final score in a minute, but first, a few reminders. Stay tuned after this broadcast for the big Jersey’s game. And don’t forget to tune in next week when the Cleveland Gowns play the Bermuda Shorts. Okay, here’s the final score. Which team has the upper hand? Which team will come out a head? And the winner is . . . oh, no! It’s a tie! Defining a Class (What It Means to Be a Baseball Player) As far as I’m concerned, a baseball player has a name and a batting average. Listing 10-1 puts my feeling about this into Java program form. 17_9780470371732-ch10.indd 21917_9780470371732-ch10.indd 219 7/6/11 7:02 PM7/6/11 7:02 PM www.it-ebooks.info 220 Part IV: Savvy Java Techniques Listing 10-1: The Player Class import java.text.DecimalFormat; public class Player { private String name; private double average; public Player(String name, double average) { this.name=name; this.average=average; } public String getName() { return name; } public double getAverage() { return average; } public String getAverageString() { DecimalFormat decFormat = new DecimalFormat(); decFormat.setMaximumIntegerDigits(0); decFormat.setMaximumFractionDigits(3); decFormat.setMinimumFractionDigits(3); return decFormat.format(average); } } So here I go, picking apart the code in Listing 10-1. Luckily, earlier chapters cover lots of stuff in this code. The code defines what it means to be an instance of the Player class. Here’s what’s in the code: ✓ Declarations of the fields name and average. For bedtime reading about field declarations, see Chapter 7. ✓ A constructor to make new instances of the Player class. For the lowdown on constructors, see Chapter 9. ✓ Getter methods for the fields name and average. For chitchat about accessor methods (that is, setter and getter methods), see Chapter 7. ✓ A method that returns the player’s batting average in String form. For the good word about methods, see Chapter 7. (I put a lot of good stuff in Chapter 7, didn’t I?) Another way to beautify your numbers The getAverageString method in Listing 10-1 takes the value from the average field (a player’s batting average), converts that value (normally of type double) into a String, and then sends that String value right 17_9780470371732-ch10.indd 22017_9780470371732-ch10.indd 220 7/6/11 7:02 PM7/6/11 7:02 PM www.it-ebooks.info 221 Chapter 10: Putting Variables and Methods Where They Belong back to the method caller. The use of DecimalFormat, which comes right from the Java API (Application Programming Interface), makes sure that the String value looks like a baseball player’s batting average. According to the decFormat.setMaximum... and decFormat.setMinimum... method calls, the String value has no digits to the left of the decimal point, and has exactly three digits to the right of the decimal point. Java’s DecimalFormat class can be quite handy. For example, to display the values 345 and –345 with an accounting-friendly format, you can use the following code: DecimalFormat decFormat = new DecimalFormat(); decFormat.setMinimumFractionDigits(2); decFormat.setNegativePrefix(“(“); decFormat.setNegativeSuffix(“)”); System.out.println(decFormat.format(345)); System.out.println(decFormat.format(-345)); In this little example’s format string, everything before the semicolon dictates the way positive numbers are displayed, and everything after the semicolon determines the way negative numbers are displayed. So with this format, the numbers 345 and –345 appear as follows: 345.00 (345.00) To discover some other tricks with numbers, visit the DecimalFormat page of Java’s API documentation. Using the Player class Listings 10-2 and 10-3 have code that uses the Player class — the class that’s defined back in Listing 10-1. Listing 10-2: Using the Player Class import java.util.Scanner; import java.io.File; import java.io.IOException; import javax.swing.JFrame; import javax.swing.JLabel; import java.awt.GridLayout; @SuppressWarnings(“serial”) public class TeamFrame extends JFrame { (continued) 17_9780470371732-ch10.indd 22117_9780470371732-ch10.indd 221 7/6/11 7:02 PM7/6/11 7:02 PM www.it-ebooks.info 222 Part IV: Savvy Java Techniques Listing 10-2 (continued) public TeamFrame() throws IOException { Player player; Scanner keyboard = new Scanner(new File(“Hankees.txt”)); for (int num = 1; num <= 9; num++) { player = new Player(keyboard.nextLine(), keyboard.nextDouble()); keyboard.nextLine(); addPlayerInfo(player); } setTitle(“The Hankees”); setLayout(new GridLayout(9, 2, 20, 3)); setDefaultCloseOperation(EXIT_ON_CLOSE); pack(); setVisible(true); } void addPlayerInfo(Player player) { add(new JLabel(“ “ + player.getName())); add(new JLabel(player.getAverageString())); } } Listing 10-3: Displaying a Frame import java.io.IOException; class ShowTeamFrame { public static void main(String args[]) throws IOException { new TeamFrame(); } } For a run of the code in Listings 10-1, 10-2, and 10-3, see Figure 10-1. Figure 10-1: Would you bet money on these people? 17_9780470371732-ch10.indd 22217_9780470371732-ch10.indd 222 7/6/11 7:02 PM7/6/11 7:02 PM www.it-ebooks.info 223 Chapter 10: Putting Variables and Methods Where They Belong To run this program yourself, you need the Hankees.txt file. This file contains data on your favorite baseball players. (See Figure 10-2.) Figure 10-2: What a team! You must have the Hankees.txt file in a certain place on your hard drive. If you’re using Eclipse, that “certain place” is a project directory within your Eclipse workspace. On the other hand, if you’re running Java from the com- mand line, that “place” may be the directory that contains the Listing 10-3 code. One way or another, you can’t get away without having the Hankees. txt file in the right place on your hard drive. If you don’t have Hankees.txt in the right place, then when you try to run this section’s example, you’ll get an unpleasant FileNotFoundException message. Where you want to put the Hankees.txt file and how you get the file where you want it depend on lots of things about your computer. To read about all these things, visit this book’s website. For this section’s code to work correctly, you must have a line break after the last .212 in Figure 10-2. For details about line breaks, see Chapter 8. Nine, count ’em, nine The code in Listing 10-2 calls the Player constructor nine times. This means that the code creates nine instances of the Player class. The first time through the loop, the code creates an instance with the name Barry Burd. The second time through the loop, the code abandons the Barry Burd instance and creates another instance with name Harriet Ritter. The third time through, the code abandons poor Harriet Ritter and creates an instance for Weelie J. Katz. The code has only one instance at a time but, all in all, the code creates nine instances. 17_9780470371732-ch10.indd 22317_9780470371732-ch10.indd 223 7/6/11 7:02 PM7/6/11 7:02 PM www.it-ebooks.info 224 Part IV: Savvy Java Techniques Each Player instance has its own name and average fields. Each instance also has its own Player constructor and its own getName, getAverage, and getAverageString methods. Look at Figure 10-3 and think of the Player class with its nine incarnations. Figure 10-3: A class and its objects. instance Barry .101 constructor getName getAv getAvStr instance Harriet .200 constructor getName getAv getAvStr instance Weelie .030 constructor getName getAv getAvStr instance Harry .124 constructor getName getAv getAvStr instance Fishy .075 constructor getName getAv getAvStr instance Mia .111 constructor getName getAv getAvStr instance Jeremy .102 constructor getName getAv getAvStr instance I. M. .001 constructor getName getAv getAvStr instance Hugh .212 constructor getName getAv getAvStr The Player class Don’t get all GUI on me The code in Listing 10-2 uses several names from the Java API. Some of these names are explained in Chapter 9. Others are explained right here: ✓ JLabel: A JLabel is an object with some text in it. One of the ways to display text inside the frame is to add an instance of the JLabel class to the frame. In Listing 10-2, the addPlayerInfo method is called nine times, once for each player on the team. Each time addPlayerInfo is called, the method adds two new JLabel objects to the frame. The text for each JLabel object comes from a player object’s getter method. ✓ GridLayout: A GridLayout arranges things in evenly spaced rows and columns. This constructor for the GridLayout class takes two parameters — the number of rows and the number of columns. In Listing 10-2, the call to the GridLayout constructor takes parameters (9, 2, 20, 3). So in Figure 10-1, the display has nine rows (one for each player) and two columns (one for a name and another for an aver- age). The horizontal gap between the two columns is 20 pixels wide, and the vertical gap between any two rows is 3 pixels tall. ✓ pack: When you pack a frame, you set the frame’s size. That’s the size the frame has when it appears on your computer screen. Packing a frame shrink-wraps the frame around whatever objects you’ve added inside the frame. In Listing 10-2, by the time you’ve reached the call to pack, you’ve already called addPlayerInfo nine times and added 18 labels to the frame. In executing the pack method, the computer picks a nice size for 17_9780470371732-ch10.indd 22417_9780470371732-ch10.indd 224 7/6/11 7:02 PM7/6/11 7:02 PM www.it-ebooks.info 225 Chapter 10: Putting Variables and Methods Where They Belong each label, given whatever text you’ve put inside the label. Then, the computer picks a nice size for the whole frame, given that the frame has these 18 labels inside it. When you plop stuff onto frames, you have quite a bit of leeway with the order in which you do things. For instance, you can set the layout before or after you’ve added labels and other stuff to the frame. If you call setLayout and then add labels, the labels appear in nice, orderly positions on the frame. If you reverse this order (add labels and then call setLayout), the calling of setLayout rearranges the labels in a nice, orderly fashion. It works fine either way. In setting up a frame, the one thing that you shouldn’t do is violate the following sequence: Add things to the frame, then pack(); setVisible(true); If you call pack and then add more things to the frame, the pack method doesn’t take the more recent things that you’ve added into consideration. If you call setVisible before you add things or call pack, the user sees the frame as it’s being constructed. Finally, if you forget to set the frame’s size (by calling pack or some other sizing method), the frame that you see looks like the one in Figure 10-4. (Normally, I wouldn’t show you an anomalous run like the one in Figure 10-4, but I’ve made the mistake so many times that I feel as if this puny frame is an old friend of mine.) Figure 10-4: An under- nourished frame. Tossing an exception from method to method Chapter 8 introduces input from a disk file, and along with that topic comes the notion of an exception. When you tinker with a disk file, you need to acknowledge the possibility of raising an IOException. That’s the lesson from Chapter 8, and that’s why the constructor in Listing 10-2 has a throws IOException clause. 17_9780470371732-ch10.indd 22517_9780470371732-ch10.indd 225 7/6/11 7:02 PM7/6/11 7:02 PM www.it-ebooks.info 226 Part IV: Savvy Java Techniques But what about the main method in Listing 10-3? With no apparent reference to disk files in this main method, why does the method need its own throws IOException clause? Well, an exception is a hot potato. If you have one, you either have to eat it (as you can see in Chapter 12) or use a throws clause to toss it to someone else. If you toss an exception with a throws clause, some- one else is stuck with the exception just the way you were. The constructor in Listing 10-2 throws an IOException, but to whom is this exception thrown? Who in this chain of code becomes the bearer of respon- sibility for the problematic IOException? Well, who called the constructor in Listing 10-2? It was the main method in Listing 10-3 — that’s who called the TeamFrame constructor. Because the TeamFrame constructor throws its hot potato to the main method in Listing 10-3, the main method has to deal with it. As shown in Listing 10-3, the main method deals with it by tossing the IOException again (by having a throws IOException clause of its own). That’s how the throws clause works in Java programs. If a method calls another method and the called method has a throws clause, the calling method must contain code that deals with the exception. To find out more about dealing with exceptions, read Chapter 12. At this point in the book, the astute For Dummies reader may pose a follow- up question or two. “When a main method has a throws clause, someone else has to deal with the exception in that throws clause. But who called the main method? Who deals with the IOException in the throws clause of Listing 10-3?” The answer is that the Java virtual machine (or JVM, the thing that runs all your Java code) called the main method. So the JVM takes care of the IOException in Listing 10-3. If the program has any trouble reading the Hankees.txt file, the responsibility ultimately falls on the JVM. The JVM takes care of things by displaying an error message and then ending the run of your program. How convenient! Making Static (Finding the Team Average) Thinking about the code in Listings 10-1 through 10-3, you decide that you’d like to find the team’s overall batting average. Not a bad idea! The Hankees in Figure 10-1 have an average of about .106, so the team needs some intensive training. While the players are out practicing on the ball field, you have a philosophical hurdle to overcome. 17_9780470371732-ch10.indd 22617_9780470371732-ch10.indd 226 7/6/11 7:02 PM7/6/11 7:02 PM www.it-ebooks.info 227 Chapter 10: Putting Variables and Methods Where They Belong In Listings 10-1 through 10-3, you have three classes: a Player class and two other classes that help display data from the Player class. So in this class morass, where do the variables storing your overall, team-average tally go? ✓ It makes no sense to put tally variables in either of the displaying classes (TeamFrame and ShowTeamFrame). After all, the tally has something or other to do with players, teams, and baseball. The displaying classes are about creating windows, not about playing baseball. ✓ You’re uncomfortable putting an overall team average in an instance of the Player class because an instance of the Player class represents just one player on the team. What business does a single player have storing overall team data? Sure, you could make the code work, but it wouldn’t be an elegant solution to the problem. Finally, you discover the keyword static. Anything that’s declared to be static belongs to the whole class, not to any particular instance of the class. When you create the static field, totalOfAverages, you create just one copy of the field. This copy stays with the entire Players class. No matter how many instances of the Player class you create — one, nine, or none — you have just one totalOfAverages field. And, while you’re at it, you create other static fields (playerCount and decFormat) and static methods (findTeamAverage and findTeamAverageString). To see what I mean, look at Figure 10-5. Figure 10-5: Some static and non-static fields and methods. playerCount totalOfAverages decFormat findTeamAverage findTeamAverageString Barry .101 constructor getName getAv getAvStr The PlayerPlus class instance Harriet .200 constructor getName getAv getAvStr instance Weelie .030 constructor getName getAv getAvStr instance Harry .124 constructor getName getAv getAvStr instance Fishy .075 constructor getName getAv getAvStr instance Mia .111 constructor getName getAv getAvStr instance Jeremy .102 constructor getName getAv getAvStr instance I.M. .001 constructor getName getAv getAvStr instance Hugh .212 constructor getName getAv getAvStr instance Going along with your passion for subclasses, you put code for team-wide tal- lies in a subclass of the Player class. The code is shown in Listing 10-4. 17_9780470371732-ch10.indd 22717_9780470371732-ch10.indd 227 7/6/11 7:02 PM7/6/11 7:02 PM www.it-ebooks.info 228 Part IV: Savvy Java Techniques Listing 10-4: Creating a Team Batting Average import java.text.DecimalFormat; public class PlayerPlus extends Player { private static int playerCount = 0; private static double totalOfAverages = .000; private static DecimalFormat decFormat = new DecimalFormat(); static { decFormat.setMaximumIntegerDigits(0); decFormat.setMaximumFractionDigits(3); decFormat.setMinimumFractionDigits(3); } public PlayerPlus(String name, double average) { super(name, average); playerCount++; totalOfAverages += average; } public static double findTeamAverage() { return totalOfAverages / playerCount; } public static String findTeamAverageString() { return decFormat.format (totalOfAverages / playerCount); } } Why is there so much static? Maybe you’ve noticed — the code in Listing 10-4 is overflowing with the word static. That’s because nearly everything in this code belongs to the entire PlayerPlus class and not to individual instances of the class. That’s good because something like playerCount (the number of players on the team) shouldn’t belong to individual players, and having each PlayerPlus object keep track of its own count would be silly. (“I know how many players I am. I’m just one player!”) If you had nine individual playerCount fields, either each field would store the number 1 (which is useless) or you would have nine different copies of the count, which is wasteful and prone to error. So by making playerCount static, you’re keeping the playerCount in just one place, where it belongs. The same kind of reasoning holds for the totalOfAverages. Eventually, the totalOfAverages field will store the sum of the players’ batting averages. For all nine members of the Hankees, this adds up to .956. It’s not until some- one calls the findTeamAverage or findTeamAverageString method that the computer actually finds the overall Hankee team batting average. 17_9780470371732-ch10.indd 22817_9780470371732-ch10.indd 228 7/6/11 7:02 PM7/6/11 7:02 PM www.it-ebooks.info 229 Chapter 10: Putting Variables and Methods Where They Belong You also want the methods findTeamAverage and findTeamAverage String to be static. Without the word static, there would be nine findTeamAverage methods — one for each instance of the PlayerPlus class. This wouldn’t make much sense. Each instance would have the code to calculate totalOfAverages/playerCount on its own, and each of the nine calculations would yield the very same answer. In general, any task that all the instances have in common (and that yields the same result for each instance) should be coded as a static method. Constructors are never static. Meet the static initializer In Listing 10-4, the decFormat field is static. This makes sense, because decFormat makes totalOfAverages / playerCount look nice, and both fields in the expression totalOfAverages / playerCount are static. Thinking more directly, the code needs only one thing for formatting num- bers. If you have several numbers to format, the same decFormat thing that belongs to the entire class can format each number. Creating a decFormat for each player is not only inelegant, but also wasteful. But declaring decFormat to be static presents a little problem. To set up the formatting, you have to call methods like decFormat.setMaximumInteger Digits(0). You can’t just plop these method calls anywhere in the PlayerPlus class. For example, the following code is bad, invalid, illegal, and otherwise un-Java-like: // THIS IS BAD CODE: public class PlayerPlus extends Player { private static DecimalFormat decFormat = new DecimalFormat(); decFormat.setMaximumIntegerDigits(0); // Bad! decFormat.setMaximumFractionDigits(3); // Bad! decFormat.setMinimumFractionDigits(3); // Bad! Look at the examples from previous chapters. In those examples, I never let a method call just dangle on its own, the way I do in the bad, bad code. In this chapter, in Listing 10-1, I don’t call setMaximumIntegerDigits without putting the method call inside the getAverageString method’s body. This no-dangling-method-calls business isn’t an accident. Java’s rules restrict the places in the code where you can issue calls to methods, and putting a lonely method call on its own immediately inside a class definition is a big no-no. 17_9780470371732-ch10.indd 22917_9780470371732-ch10.indd 229 7/6/11 7:02 PM7/6/11 7:02 PM www.it-ebooks.info 230 Part IV: Savvy Java Techniques So in Listing 10-4, where can you put the necessary setMax and setMin calls? You can put them inside the body of the findTeamAverageString method, much the way I put them inside the getAverageString method in Listing 10-1. But putting those method calls inside the findTeamAverage String method’s body might defeat the purpose of having decFormat be static. After all, a programmer might call findTeamAverageString several times, calling decFormat.setMaximumIntegerDigits(0) each time. But that would be very wasteful. The entire PlayerPlus class has only one decFormat field, and that decFormat field’s MaximumIntegerDigits value is always 0. So don’t keep setting MaximumIntegerDigits(0) over and over again. The best alternative is to take the bad lines in this section’s bad code and put them inside a static initializer. Then they become good lines inside good code. (See Listing 10-4.) A static initializer is a block that’s preceded by the word static. Java executes the static initializer’s statements once for the entire class. That’s exactly what you want for something called “static.” Displaying the overall team average You may be noticing a pattern. When you create code for a class, you gener- ally write two pieces of code. One piece of code defines the class, and the other piece of code uses the class. (The ways to use a class include calling the class’s constructor, referencing the class’s non-private fields, calling the class’s methods, and so on.) Listing 10-4, shown previously, contains code that defines the PlayerPlus class, and Listing 10-5 contains code that uses this PlayerPlus class. Listing 10-5: Using the Code from Listing 10-4 import java.util.Scanner; import java.io.File; import java.io.IOException; import javax.swing.JFrame; import javax.swing.JLabel; import java.awt.GridLayout; @SuppressWarnings(“serial”) public class TeamFrame extends JFrame { public TeamFrame() throws IOException { PlayerPlus player; Scanner keyboard = new Scanner(new File(“Hankees.txt”)); 17_9780470371732-ch10.indd 23017_9780470371732-ch10.indd 230 7/6/11 7:02 PM7/6/11 7:02 PM www.it-ebooks.info 231 Chapter 10: Putting Variables and Methods Where They Belong for (int num = 1; num <= 9; num++) { player = new PlayerPlus(keyboard.nextLine(), keyboard.nextDouble()); keyboard.nextLine(); addPlayerInfo(player); } add(new JLabel()); add(new JLabel(“ ------”)); add(new JLabel(“Team Batting Average:”)); add(new JLabel(PlayerPlus. findTeamAverageString())); setTitle(“The Hankees”); setLayout(new GridLayout(11, 2, 20, 3)); setDefaultCloseOperation(EXIT_ON_CLOSE); pack(); setVisible(true); } void addPlayerInfo(PlayerPlus player) { add(new JLabel(“ “ + player.getName())); add(new JLabel(player.getAverageString())); } } To run the code in Listing 10-5, you need a class with a main method. The ShowTeamFrame class in Listing 10-3 works just fine. Figure 10-6 shows a run of the code from Listing 10-5. This run depends on the availability of the Hankees.txt file from Figure 10-2. The code in Listing 10-5 is almost an exact copy of the code from Listing 10-2. (So close is the copy that if I could afford it, I’d sue myself for theft of intellectual property.) The only thing new in Listing 10-5 is the stuff shown in bold. Figure 10-6: A run of the code in Listing 10-5. 17_9780470371732-ch10.indd 23117_9780470371732-ch10.indd 231 7/6/11 7:02 PM7/6/11 7:02 PM www.it-ebooks.info 232 Part IV: Savvy Java Techniques In Listing 10-5, the GridLayout has two extra rows: one row for spacing and another row for the Hankee team’s average. Each of these rows has two Label objects in it. ✓ The spacing row has a blank label and a label with a dashed line. The blank label is a placeholder. When you add components to a GridLayout, the components are added row by row, starting at the left end of a row and working toward the right end. Without this blank label, the dashed line label would appear at the left end of the row, under Hugh R. DaReader’s name. ✓ The other row has a label displaying the words Team Batting Average, and another label displaying the number .106. The method call that gets the number .106 is interesting. The call looks like this: PlayerPlus.findTeamAverageString() Take a look at that method call. That call has the following form: ClassName.methodName() That’s new and different. In earlier chapters, I say that you normally preface a method call with an object’s name, not a class’s name. So why do I use a class name here? The answer: When you call a static method, you preface the method’s name with the name of the class that contains the method. The same holds true whenever you reference another class’s static field. This makes sense. Remember, the whole class that defines a static field or method owns that field or method. So, to refer to a static field or method, you preface the field or meth- od’s name with the class’s name. When you’re referring to a static field or method, you can cheat and use an object’s name in place of the class name. For instance, in Listing 10-5, with judicious rearranging of some other statements, you can use the expression player.findTeamAverageString(). Static is old hat This section makes a big noise about static fields and methods, but static things have been part of the picture since early in this book. For example, Chapter 3 introduces System.out.println. The name System refers to a class, and out is a static field in that class. That’s why, in Chapter 4 and beyond, I use the static keyword to import the out field: import static java.lang.System.out; In Java, static fields and methods show up all over the place. When they’re declared in someone else’s code, and you’re making use of them in your code, you hardly ever have to worry about them. But when you’re declaring your own fields and methods and must decide whether to make them static, you have to think a little harder. 17_9780470371732-ch10.indd 23217_9780470371732-ch10.indd 232 7/6/11 7:02 PM7/6/11 7:02 PM www.it-ebooks.info 233 Chapter 10: Putting Variables and Methods Where They Belong In this book, my first serious use of the word static is way back in Listing 3-1. I use the static keyword as part of every main method (and lots of main methods are in this book’s listings). So why does main have to be static? Well, remember that non-static things belong to objects, not classes. If the main method isn’t static, you can’t have a main method until you create an object. But, when you start up a Java program, no objects have been created yet. The statements that are executed in the main method start creating objects. So, if the main method isn’t static, you have a big chicken-and-egg problem. Could cause static; handle with care When I first started writing Java, I had recurring dreams about getting a cer- tain error message. The message was non-static variable or method cannot be referenced from a static context. So often did I see this message, so thoroughly was I perplexed, that the memory of this mes- sage became burned into my subconscious existence. These days, I know why I got that error message so often. I can even make the message occur if I want. But I still feel a little shiver whenever I see this message on my screen. Before you can understand why the message occurs and how to fix the prob- lem, you need to get some terminology under your belt. If a field or method isn’t static, it’s called non-static. (Real surprising, hey?) Given that terminol- ogy, there are at least two ways to make the dreaded message appear: ✓ Put Class.nonstaticThing somewhere in your program. ✓ Put nonstaticThing somewhere inside a static method. In either case, you’re getting yourself into trouble. You’re taking something that belongs to an object (the non-static thing) and putting it in a place where no objects are in sight. Take, for instance, the first of the two situations I just described. To see this calamity in action, go back to Listing 10-5. Toward the end of the listing, change player.getName() to Player.getName(). That does the trick. What could Player.getName possibly mean? If anything, the expression Player.getName means “call the getName method that belongs to the entire Player class.” But look back at Listing 10-1. The getName method isn’t static. Each instance of the Player (or PlayerPlus) class has a getName method. None of the getName methods belong to the entire class. So the call Player.getName doesn’t make any sense. (Maybe the computer is pulling punches when it displays the inoffensive cannot be referenced . . . message. Perhaps a harsh nonsensical expression message would be more fitting.) 17_9780470371732-ch10.indd 23317_9780470371732-ch10.indd 233 7/6/11 7:02 PM7/6/11 7:02 PM www.it-ebooks.info 234 Part IV: Savvy Java Techniques For a taste of the second situation (in the bullet list that I give earlier in this section), go back to Listing 10-4. While no one’s looking, quietly remove the word static from the declaration of the decFormat field (near the top of the listing). This removal turns decFormat into a non-static field. Suddenly, each player on the team has a separate decFormat field. Well, things are just hunky-dory until the computer reaches the find- TeamAverageString method. That static method has four decFormat. SuchAndSuch statements in it. Once again, you’re forced to ask what a state- ment of this kind could possibly mean. Method findTeamAverageString belongs to no instance in particular. (The method is static, so the entire PlayerPlus class has one findTeamAverageString method.) But with the way you’ve just butchered the code, plain old decFormat without refer- ence to a particular object has no meaning. So again, you’re referencing the non-static field, decFormat, from inside a static method’s context. For shame, for shame, for shame! Experiments with Variables One summer during my college days, I was sitting on the front porch, loaf- ing around, talking with someone I’d just met. I think her name was Janine. “Where are you from?” I asked. “Mars,” she answered. She paused to see whether I’d ask a follow-up question. As it turned out, Janine was from Mars, Pennsylvania, a small town about 20 miles north of Pittsburgh. Okay, so what’s my point? The point is that the meaning of a name depends on the context. If you’re just north of Pittsburgh and ask, “How do I get to Mars from here?” you may get a sensible, noncha- lant answer. But if you ask the same question standing on a street corner in Manhattan, you’ll probably arouse some suspicion. (Okay, knowing Manhattan, people would probably just ignore you.) Of course, the people who live in Mars, Pennsylvania, are very much aware that their town has an oddball name. Fond memories of teenage years at Mars High School don’t prevent a person from knowing about the big red planet. On a clear evening in August, you can still have the following conver- sation with one of the local residents: You: How do I get to Mars? Local resident: You’re in Mars, pal. What particular part of Mars are you looking for? You: No, I don’t mean Mars, Pennsylvania. I mean the planet Mars. Local resident: Oh, the planet! Well, then, catch the 8:19 train leaving for Cape Canaveral . . . No, wait, that’s the local train. That’d take you through West Virginia. . . . 17_9780470371732-ch10.indd 23417_9780470371732-ch10.indd 234 7/6/11 7:02 PM7/6/11 7:02 PM www.it-ebooks.info 235 Chapter 10: Putting Variables and Methods Where They Belong So the meaning of a name depends on where you’re using the name. Although most English-speaking people think of Mars as a place with a carbon dioxide atmosphere, some folks in Pennsylvania think about all the shopping they can do in Mars. And those folks in Pennsylvania really have two meanings for the name Mars. In Java, those names may look like this: Mars and planets.Mars. Putting a variable in its place Your first experiment is shown in Listings 10-6 and 10-7. The listings’ code highlights the difference between variables that are declared inside and outside methods. Listing 10-6: Two Meanings for Mars import static java.lang.System.out; class EnglishSpeakingWorld { String mars = “ red planet”; void visitPennsylvania() { out.println(“visitPA is running:”); String mars = “ Janine’s home town”; out.println(mars); out.println(this.mars); } } Listing 10-7: Calling the Code of Listing 10-6 import static java.lang.System.out; class GetGoing { public static void main(String args[]) { out.println(“main is running:”); EnglishSpeakingWorld e = new EnglishSpeakingWorld(); //out.println(mars); cannot resolve symbol out.println(e.mars); e.visitPennsylvania(); } } 17_9780470371732-ch10.indd 23517_9780470371732-ch10.indd 235 7/6/11 7:02 PM7/6/11 7:02 PM www.it-ebooks.info 236 Part IV: Savvy Java Techniques Figure 10-7 shows a run of the code in Listings 10-6 and 10-7. Figure 10-8 shows a diagram of the code’s structure. In the GetGoing class, the main method creates an instance of the EnglishSpeakingWorld class. The vari- able e refers to the new instance. The new instance is an object with a vari- able named mars inside it. That mars variable has the value “red planet”. The “red planet” mars variable is a field. Another way to describe that mars field is to call it an instance variable, because that mars variable (the variable whose value is “red planet”) belongs to an instance of the EnglishSpeakingWorld class. In contrast, you can refer to static fields (like the playerCount, totalOfAverages, and decFormat fields in Listing 10-4) as class variables. For example, playerCount in Listing 10-4 is a class variable because one copy of playerCount belongs to the entire PlayerPlus class. Now look at the main method in Listing 10-7. Inside the GetGoing class’s main method, you aren’t permitted to write out.println(mars). In other words, a bare-faced reference to any mars variable is a definite no-no. The mars variable that I mention in the previous paragraph belongs to the EnglishSpeakingWorld object, not the GetGoing class. However, inside the GetGoing class’s main method, you can certainly write e.mars because the e variable refers to your EnglishSpeakingWorld object. That’s nice. Near the bottom of the code, the visitPennsylvania method is called. When you’re inside visitPennsylvania, you have another declaration of a mars variable, whose value is “Janine’s home town”. This particular mars variable is called a method-local variable because it belongs to just one method — the visitPennsylvania method. Figure 10-7: A run of the code in Listings 10-6 and 10-7. So now you have two variables, both with the name mars. One mars variable, a field, has the value “red planet”. The other mars variable, a method- local variable, has the value “Janine’s home town”. In the code, when you use the word mars, to which of the two variables are you referring? 17_9780470371732-ch10.indd 23617_9780470371732-ch10.indd 236 7/6/11 7:02 PM7/6/11 7:02 PM www.it-ebooks.info 237 Chapter 10: Putting Variables and Methods Where They Belong The answer is, when you’re visiting Pennsylvania, the variable with value “Janine’s home town” wins. When in Pennsylvania, think the way the Pennsylvanians think. When you’re executing code inside the visitPennsylvania method, resolve any variable name conflicts by going with method-local variables — variables declared right inside the visitPennsylvania method. Figure 10-8: The structure of the code in Listings 10-6 and 10-7. EnglishSpeakingWorld mars (field) red planet visitPennsylvania mars (method-local variable) Janine's hometown GetGoing e So what if you’re in Pennsylvania and need to refer to that two-mooned celestial object? More precisely, how does code inside the visit Pennsylvania method refer to the field with value “red planet”? The answer is, use this.mars. The word this points to whatever object con- tains all this code (and not to any methods inside the code). That object, an instance of the EnglishSpeakingWorld class, has a big, fat mars field, and that field’s value is “red planet”. So that’s how you can force code to see outside the method it’s in — you use the Java keyword this. For more information on the keyword this, see Chapter 9. Telling a variable where to go Years ago, when I lived in Milwaukee, Wisconsin, I made frequent use of the local bank’s automatic teller machines. Machines of this kind were just begin- ning to become standardized. The local teller machine system was named TYME, which stood for Take Your Money Everywhere. 17_9780470371732-ch10.indd 23717_9780470371732-ch10.indd 237 7/6/11 7:02 PM7/6/11 7:02 PM www.it-ebooks.info 238 Part IV: Savvy Java Techniques I remember traveling by car out to California. At one point, I got hungry and stopped for a meal, but I was out of cash. So I asked a gas station attendant, “Do you know where there’s a TYME machine around here?” So you see, a name that works well in one place could work terribly, or not at all, in another place. In Listings 10-8 and 10-9, I illustrate this point (with more than just an anecdote about teller machines). Listing 10-8: Tale of Atomic City import static java.lang.System.out; class EnglishSpeakingWorld2 { String mars; void visitIdaho() { out.println(“visitID is running:”); mars = “ red planet”; String atomicCity = “ Population: 25”; out.println(mars); out.println(atomicCity); } void visitNewJersey() { out.println(“visitNJ is running:”); out.println(mars); //out.println(atomicCity); // cannot resolve symbol } } Listing 10-9: Calling the Code of Listing 10-8 class GetGoing2 { public static void main(String args[]) { EnglishSpeakingWorld2 e = new EnglishSpeakingWorld2(); e.visitIdaho(); e.visitNewJersey(); } } 17_9780470371732-ch10.indd 23817_9780470371732-ch10.indd 238 7/6/11 7:02 PM7/6/11 7:02 PM www.it-ebooks.info 239 Chapter 10: Putting Variables and Methods Where They Belong Figure 10-9 shows a run of the code in Listings 10-8 and 10-9. Figure 10-10 shows a diagram of the code’s structure. The code for EnglishSpeakingWorld2 has two variables. The mars variable, which isn’t declared inside a method, is a field. The other variable, atomicCity, is a method-local variable and is declared inside the visitIdaho method. Figure 10-9: A run of the code in Listings 10-8 and 10-9. In Listing 10-8, notice where each variable can and can’t be used. When you try to use the atomicCity variable inside the visitNewJersey method, you get an error message. Literally, the message says cannot resolve symbol. Figuratively, the message says, “Hey, buddy, Atomic City is in Idaho, not New Jersey.” Technically, the message says that the method-local vari- able atomicCity is available only in the visitIdaho method because that’s where the variable was declared. So back inside the visitIdaho method, you’re free to use the atomicCity variable as much as you want. After all, the atomicCity variable is declared inside the visitIdaho method. Figure 10-10: The structure of the code in Listings 10-8 and 10-9. EnglishSpeakingWorld2 mars (field) red planet visitIdaho atomicCity (method-local variable) Population: 25 visitNewJersey 17_9780470371732-ch10.indd 23917_9780470371732-ch10.indd 239 7/6/11 7:02 PM7/6/11 7:02 PM www.it-ebooks.info 240 Part IV: Savvy Java Techniques And what about Mars? Have you forgotten about your old friend, that lovely eighty-degrees-below-zero planet? Well, both the visitIdaho and visitNewJersey methods can access the mars variable. That’s because the mars variable is a field. That is, the mars variable is declared in the code for the EnglishSpeakingWorld2 class but not inside any particular method. (In my stories about the names for things, remember that people who live in both states, Idaho and New Jersey, have heard of the planet Mars.) The lifecycle of the mars field has three separate steps: ✓ When the EnglishSpeakingWorld2 class first flashes into existence, the computer sees String mars and creates space for the mars field. ✓ When the visitIdaho method is executed, the method assigns the value “red planet” to the mars field. (The visitIdaho method also prints the value of the mars field.) ✓ When the visitNewJersey method is executed, the method prints the mars value once again. In this way, the mars field’s value is passed from one method to another. Passing Parameters A method can communicate with another part of your Java program in sev- eral ways. One of the ways is through the method’s parameter list. Using a parameter list, you pass on-the-fly information to a method as the method is being called. So imagine that the information you pass to the method is stored in one of your program’s variables. What, if anything, does the method actually do with that variable? The following sections present a few interesting case studies. Pass by value According to my web research, the town of Smackover, Arkansas, has 2,232 people in it. But my research isn’t current. Just yesterday, Dora Kermongoos celebrated a joyous occasion over at Smackover General Hospital — the birth of her healthy, blue-eyed baby girl. (The girl weighs 7 pounds, 4 ounces, and is 21 inches tall.) Now the town’s population has risen to 2,233. Listing 10-10 has a very bad program in it. The program is supposed to add 1 to a variable that stores Smackover’s population, but the program doesn’t work. Take a look at Listing 10-10 and see why. 17_9780470371732-ch10.indd 24017_9780470371732-ch10.indd 240 7/6/11 7:02 PM7/6/11 7:02 PM www.it-ebooks.info 241 Chapter 10: Putting Variables and Methods Where They Belong Listing 10-10: This Program Doesn’t Work class TrackPopulation { public static void main(String args[]) { int smackoverARpop = 2232; birth(smackoverARpop); System.out.println(smackoverARpop); } static void birth(int cityPop) { cityPop++; } } When you run the program in Listing 10-10, the program displays the number 2,232 onscreen. After nine months of planning and anticipation and Dora’s whopping seven hours in labor, the Kermongoos family’s baby girl wasn’t registered in the system. What a shame! The improper use of parameter passing caused the problem. In Java, when you pass a parameter that has one of the eight primitive types to a method, that parameter is passed by value. For a review of Java’s eight primitive types, see Chapter 4. Here’s what this means in plain English: Any changes that the method makes to the value of its parameter don’t affect the values of variables back in the calling code. In Listing 10-10, the birth method can apply the ++ operator to cityPop all it wants — the application of ++ to the cityPop parameter has absolutely no effect on the value of the smackoverARpop variable back in the main method. Technically, what’s happening is the copying of a value. (See Figure 10-11.) When the main method calls the birth method, the value stored in smack- overARpop is copied to another memory location — a location reserved for the cityPop parameter’s value. During the birth method’s execution, 1 is added to the cityPop parameter. But the place where the original 2232 value was stored — the memory location for the smackoverARpop variable — remains unaffected. When you do parameter passing with any of the eight primitive types, the computer uses pass by value. The value stored in the calling code’s variable remains unchanged. This happens even if the calling code’s variable and the called method’s parameter happen to have the exact same name. 17_9780470371732-ch10.indd 24117_9780470371732-ch10.indd 241 7/6/11 7:02 PM7/6/11 7:02 PM www.it-ebooks.info 242 Part IV: Savvy Java Techniques Figure 10-11: Pass by value, under the hood. main smackoverARpop 2232 birth cityPop 2232 2233 Returning a result You must fix the problem that the code in Listing 10-10 poses. After all, a young baby Kermongoos can’t go through life untracked. To record this baby’s exis- tence, you have to add 1 to the value of the smackoverARpop variable. You can do this in plenty of ways, and the way presented in Listing 10-11 isn’t the simplest. Even so, the way shown in Listing 10-11 illustrates a point: Returning a value from a method call can be an acceptable alternative to parameter pass- ing. Look at Listing 10-11 to see what I mean. Listing 10-11: This Program Works class TrackPopulation2 { public static void main(String args[]) { int smackoverARpop = 2232; smackoverARpop = birth(smackoverARpop); System.out.println(smackoverARpop); } static int birth(int cityPop) { return cityPop + 1; } } After running the code in Listing 10-11, the number you see on your computer screen is the correct number, 2,233. 17_9780470371732-ch10.indd 24217_9780470371732-ch10.indd 242 7/6/11 7:02 PM7/6/11 7:02 PM www.it-ebooks.info 243 Chapter 10: Putting Variables and Methods Where They Belong The code in Listing 10-11 has no new features in it (unless you call work- ing correctly a new feature). The most important idea in Listing 10-11 is the return statement, which also appears in Chapter 7. Even so, Listing 10-11 presents a nice contrast to the approach in Listing 10-10, which had to be discarded. Pass by reference In the previous section or two, I take great pains to emphasize a certain point — that when a parameter has one of the eight primitive types, the parameter is passed by value. If you read this, you probably missed the emphasis on the parameter’s having one of the eight primitive types. The emphasis is needed because passing objects (reference types) doesn’t quite work the same way. When you pass an object to a method, the object is passed by reference. What this means to you is that statements in the called method can change any values that are stored in the object’s variables. Those changes do affect the values that are seen by whatever code called the method. Listings 10-12 and 10-13 illustrate the point. Listing 10-12: What Is a City? class City { int population; } Listing 10-13: Passing an Object to a Method class TrackPopulation3 { public static void main(String args[]) { City smackoverAR = new City(); smackoverAR.population = 2232; birth(smackoverAR); System.out.println(smackoverAR.population); } static void birth(City aCity) { aCity.population++; } } 17_9780470371732-ch10.indd 24317_9780470371732-ch10.indd 243 7/6/11 7:02 PM7/6/11 7:02 PM www.it-ebooks.info 244 Part IV: Savvy Java Techniques When you run the code in Listings 10-12 and 10-13, the output that you get is the number 2,233. That’s good because the code has things like ++ and the word birth in it. The deal is, adding 1 to aCity.population inside the birth method actually changes the value of smackoverAR.population as it’s known in the main method. To see how the birth method changes the value of smackoverAR. population, look at Figure 10-12. When you pass an object to a method, the computer doesn’t make a copy of the entire object. Instead, the computer makes a copy of a reference to that object. (Think of it the way it’s shown in Figure 10-12. The computer makes a copy of an arrow that points to the object.) Figure 10-12: Pass by reference, under the hood. main smackoverAR birth aCity population 2232 2233 (An instance of the City class) In Figure 10-12, you see just one instance of the City class, with a population variable inside it. Now keep your eye on that object as you read the following steps: 1. Just before the birth method is called, the smackoverAR variable refers to that object — the instance of the City class. 2. When the birth method is called and smackoverAR is passed to the birth method’s aCity parameter, the computer copies the reference from smackoverAR to aCity. Now aCity refers to that same object — the instance of the City class. 3. When the statement aCity.population++ is executed inside the birth method, the computer adds 1 to the object’s population field. Now the program’s one and only City instance has 2233 stored in its population field. 17_9780470371732-ch10.indd 24417_9780470371732-ch10.indd 244 7/6/11 7:02 PM7/6/11 7:02 PM www.it-ebooks.info 245 Chapter 10: Putting Variables and Methods Where They Belong 4. The flow of execution goes back to the main method. The value of smackoverAR.population is printed. But smackoverAR refers to that one instance of the City class. So smackoverAR.population has the value 2233. The Kermongoos family is so proud. Returning an object from a method Believe it or not, the previous sections on parameter passing left one nook and cranny of Java methods unexplored. When you call a method, the method can return something right back to the calling code. In previous chapters and sections, I return primitive values, such as int values, or nothing (otherwise known as void). In this section, I return a whole object. It’s an object of type City from Listing 10-12. The code that makes this happen is in Listing 10-14. Listing 10-14: Here, Have a City class TrackPopulation4 { public static void main(String args[]) { City smackoverAR = new City(); smackoverAR.population = 2232; smackoverAR = doBirth(smackoverAR); System.out.println(smackoverAR.population); } static City doBirth(City aCity) { City myCity = new City(); myCity.population = aCity.population + 1; return myCity; } } If you run the code in Listing 10-14, you get the number 2,233. That’s good. The code works by telling the doBirth method to create another City instance. In the new instance, the value of population is 2333. (See Figure 10-13.) After the doBirth method is executed, that City instance is returned to the main method. Then, back in the main method, that instance (the one that doBirth returns) is assigned to the smackoverAR variable. (See Figure 10-14.) Now smackoverAR refers to a brand-new City instance — an instance whose population is 2,233. 17_9780470371732-ch10.indd 24517_9780470371732-ch10.indd 245 7/6/11 7:02 PM7/6/11 7:02 PM www.it-ebooks.info 246 Part IV: Savvy Java Techniques Figure 10-13: The doBirth method creates a City instance. main smackoverAR population 2232 doBirth aCity myCity population 2233 Figure 10-14: The new City instance is assigned to the smackoverAR variable. main smackoverAR doBirth myCity population 2233 In Listing 10-14, notice the type consistency in the calling and returning of the doBirth method: ✓ The smackoverAR variable has type City. The smackoverAR variable is passed to the aCity parameter, which is also of type City. ✓ The myCity variable is of type City. The myCity variable is sent back in the doBirth method’s return statement. That’s consistent, because the doBirth method’s header begins with the promise static City doBirth(blah, blah, blah... — the promise to return an object of type City. ✓ The doBirth method returns an object of type City. Back in the main method, the object that the call to doBirth returns is assigned to the smackoverAR variable, and (you guessed it) the smackoverAR variable is of type City. 17_9780470371732-ch10.indd 24617_9780470371732-ch10.indd 246 7/6/11 7:02 PM7/6/11 7:02 PM www.it-ebooks.info 247 Chapter 10: Putting Variables and Methods Where They Belong Aside from being very harmonious, all this type agreement is absolutely necessary. If you write a program in which your types don’t agree with one another, the compiler spits out an unsympathetic incompatible types message. Epilogue Dora Kermongoos and her newborn baby daughter are safe, healthy, and resting happily in their Smackover, Arkansas, home. 17_9780470371732-ch10.indd 24717_9780470371732-ch10.indd 247 7/6/11 7:02 PM7/6/11 7:02 PM www.it-ebooks.info 248 Part IV: Savvy Java Techniques 17_9780470371732-ch10.indd 24817_9780470371732-ch10.indd 248 7/6/11 7:02 PM7/6/11 7:02 PM www.it-ebooks.info Chapter 11 Using Arrays and Collections to Juggle Values In This Chapter ▶ Dealing with several values at once ▶ Creating values as you get a program running ▶ Impressing other programmers with fancy generic types Welcome to the Java Motel! No haughty bellhops, no overpriced room service, none of the usual silly puns. Just a clean double room that’s a darn good value! Getting Your Ducks All in a Row The Java Motel, with its ten comfortable rooms, sits in a quiet place off the main highway. Aside from a small, separate office, the motel is just one long row of ground floor rooms. Each room is easily accessible from the spacious front parking lot. Oddly enough, the motel’s rooms are numbered 0 through 9. I could say that the numbering is a fluke — something to do with the builder’s original design plan. But the truth is that starting with 0 makes the examples in this chapter easier to write. Anyway, you’re trying to keep track of the number of guests in each room. Because you have ten rooms, you may think about declaring ten variables: int guestsInRoomNum0, guestsInRoomNum1, guestsInRoomNum2, guestsInRoomNum3, guestsInRoomNum4, guestsInRoomNum5, guestsInRoomNum6, guestsInRoomNum7, guestsInRoomNum8, guestsInRoomNum9; 18_9780470371732-ch11.indd 24918_9780470371732-ch11.indd 249 7/6/11 7:02 PM7/6/11 7:02 PM www.it-ebooks.info 250 Part IV: Savvy Java Techniques Doing it this way may seem a bit inefficient — but inefficiency isn’t the only thing wrong with this code. Even more problematic is the fact that you can’t loop through these variables. To read a value for each variable, you have to copy the nextInt method ten times. guestsInRoomNum0 = diskScanner.nextInt(); guestsInRoomNum1 = diskScanner.nextInt(); guestsInRoomNum2 = diskScanner.nextInt(); ... and so on. Surely a better way exists. That better way involves an array. An array is a row of values, like the row of rooms in a one-floor motel. To picture the array, just picture the Java Motel: ✓ First, picture the rooms, lined up next to one another. ✓ Next, picture the same rooms with their front walls missing. Inside each room you can see a certain number of guests. ✓ If you can, forget that the two guests in Room 9 are putting piles of bills into a big briefcase. Ignore the fact that the guests in Room 6 haven’t moved away from the TV set in a day and a half. Instead of all these details, just see numbers. In each room, see a number representing the count of guests in that room. (If freeform visualization isn’t your strong point, look at Figure 11-1.) Figure 11-1: An abstract snapshot of rooms in the Java Motel. A component whose index is 6, and whose value is 4 The value 4 The index 6 1 0 4 1 2 2 0 3 2 4 1 5 4 6 3 7 0 8 2 9 In the lingo of this chapter, the entire row of rooms is called an array. Each room in the array is called a component of the array (also known as an array element). Each component has two numbers associated with it: 18_9780470371732-ch11.indd 25018_9780470371732-ch11.indd 250 7/6/11 7:02 PM7/6/11 7:02 PM www.it-ebooks.info 251 Chapter 11: Using Arrays and Collections to Juggle Values ✓ The room number (a number from 0 to 9), which is called an index of the array ✓ A number of guests, which is a value stored in a component of the array Using an array saves you from all the repetitive nonsense in the sample code shown at the beginning of this section. For instance, to declare an array with ten values in it, you can write one fairly short statement: int guests[] = new int[10]; If you’re especially verbose, you can expand this statement so that it becomes two separate statements: int guests[]; guests = new int[10]; In either of these code snippets, notice the use of the number 10. This number tells the computer to make the guests array have ten components. Each component of the array has a name of its own. The starting component is named guests[0], the next is named guests[1], and so on. The last of the ten components is named guests[9]. In creating an array, you always specify the number of components. The array’s indices start with 0 and end with the number that’s one less than the total number of components. The snippets that I show you give you two ways to create an array. The first way uses one line. The second way uses two lines. If you take the single line route, you can put that line inside or outside a method. The choice is yours. On the other hand, if you use two separate lines, the second line, guests = new int[10], should be inside a method. In an array declaration, you can put the square brackets before or after the variable name. In other words, you can write int guests[] or int[] guests. The computer creates the same guests variable no matter which form you use. Creating an array in two easy steps Look once again at the two lines that you can use to create an array: int guests[]; guests = new int[10]; Each line serves its own distinct purpose: 18_9780470371732-ch11.indd 25118_9780470371732-ch11.indd 251 7/6/11 7:02 PM7/6/11 7:02 PM www.it-ebooks.info 252 Part IV: Savvy Java Techniques ✓ int guests[]: This first line is a declaration. The declaration reserves the array name (a name like guests) for use in the rest of the program. In the Java Motel metaphor, this line says, “I plan to build a motel here and put a certain number of guests in each room.” (See Figure 11-2.) Never mind what the declaration int guests[] actually does. It’s more important to notice what the declaration int guests[] doesn’t do. The declaration doesn’t reserve ten memory locations. Indeed, a declaration like int guests[] doesn’t really create an array. All the declaration does is set up the guests variable. At that point in the code, the guests variable still doesn’t refer to a real array. (In other words, the motel has a name, but the motel hasn’t been built yet.) ✓ guests = new int[10]: This second line is an assignment statement. The assignment statement reserves space in the computer’s memory for ten int values. In terms of real estate, this line says, “I’ve finally built the motel. Go ahead and put guests in each room.” (Again, see Figure 11-2.) Figure 11-2: Two steps in creating an array. guests guests[0]guests[1]guests[2]guests[3]guests[4]guests[5]guests[6]guests[7]guests[8]guests[9] int guests[]; guests guests = new int[10]; Storing values After you’ve created an array, you can put values into the array’s compo- nents. For instance, you would like to store the fact that Room 6 contains 4 guests. To put the value 4 in the component with index 6, you write guests[6] = 4. Now business starts to pick up. A big bus pulls up to the motel. On the side of the bus is a sign that says “Noah’s Ark.” Out of the bus come 25 couples, each walking, stomping, flying, hopping, or slithering to the motel’s small office. Only 10 of the couples can stay at the Java Motel, but that’s okay because you can send the other 15 couples down the road to the old C-Side Resort and Motor Lodge. 18_9780470371732-ch11.indd 25218_9780470371732-ch11.indd 252 7/6/11 7:02 PM7/6/11 7:02 PM www.it-ebooks.info 253 Chapter 11: Using Arrays and Collections to Juggle Values Anyway, to register 10 couples into the Java Motel, you put a couple (2 guests) in each of your 10 rooms. Having created an array, you can take advantage of the array’s indexing and write a for loop, like this: for (int roomNum = 0; roomNum < 10; roomNum++) { guests[roomNum] = 2; } This loop takes the place of ten assignment statements. Notice how the loop’s counter goes from 0 to 9. Compare this with Figure 11-2, and remem- ber that the indices of an array go from 0 to one less than the number of components in the array. However, given the way the world works, your guests won’t always arrive in neat pairs, and you’ll have to fill each room with a different number of guests. You probably store information about rooms and guests in a database. If you do, you can still loop through an array, gathering numbers of guests as you go. The code to perform such a task may look like this: resultset = statement.executeQuery(“select GUESTS from RoomData”); for (int roomNum = 0; roomNum < 10; roomNum++) { resultset.next(); guests[roomNum] = resultset.getInt(“GUESTS”); } But because this book doesn’t cover databases until Chapter 16 you may be better off reading numbers of guests from a plain text file. A sample file named GuestList.txt is shown in Figure 11-3. After you’ve made a file, you can call on the Scanner class to get values from the file. The code is shown in Listing 11-1, and the resulting output is in Figure 11-4. This book’s website has tips for readers who need to create data files. This includes instructions for Windows, Linux, and Macintosh environments. Figure 11-3: The GuestList.txt file. 18_9780470371732-ch11.indd 25318_9780470371732-ch11.indd 253 7/6/11 7:02 PM7/6/11 7:02 PM www.it-ebooks.info 254 Part IV: Savvy Java Techniques Listing 11-1: Filling an Array with Values import static java.lang.System.out; import java.util.Scanner; import java.io.File; import java.io.IOException; class ShowGuests { public static void main(String args[]) throws IOException { int guests[] = new int[10]; Scanner diskScanner = new Scanner(new File(“GuestList.txt”)); for(int roomNum = 0; roomNum < 10; roomNum++) { guests[roomNum] = diskScanner.nextInt(); } out.println(“Room\tGuests”); for(int roomNum = 0; roomNum < 10; roomNum++) { out.print(roomNum); out.print(“\t”); out.println(guests[roomNum]); } } } Figure 11-4: Running the code from Listing 11-1. The code in Listing 11-1 has two for loops. The first loop reads numbers of guests, and the second loop writes numbers of guests. Every array has a built-in length field. An array’s length is the number of com- ponents in the array. So, in Listing 11-1, if you print the value of guests. length, you get 10. 18_9780470371732-ch11.indd 25418_9780470371732-ch11.indd 254 7/6/11 7:02 PM7/6/11 7:02 PM www.it-ebooks.info 255 Chapter 11: Using Arrays and Collections to Juggle Values Tab stops and other special things In Listing 11-1, some calls to print and println use the \t escape sequence. It’s called an escape sequence because you escape from display- ing the letter t on the screen. Instead, the characters \t stand for a tab. The computer moves forward to the next tab stop before printing any more char- acters. Java has a few of these handy escape sequences. Some of them are shown in Table 11-1. Table 11-1 Escape Sequences Sequence Meaning \b backspace \t horizontal tab \n line feed \f form feed \r carriage return \” double quote “ \’ single quote ‘ \\ backslash \ Using an array initializer Besides what you see in Listing 11-1, you have another way to fill an array in Java — with an array initializer. When you use an array initializer, you don’t even have to tell the computer how many components the array has. The computer figures this out for you. Listing 11-2 shows a new version of the code to fill an array. The program’s output is the same as the output of Listing 11-1. (It’s the stuff shown in Figure 11-4.) The only difference between Listings 11-1 and 11-2 is the bold text in Listing 11-2. That bold doodad is an array initializer. 18_9780470371732-ch11.indd 25518_9780470371732-ch11.indd 255 7/6/11 7:02 PM7/6/11 7:02 PM www.it-ebooks.info 256 Part IV: Savvy Java Techniques Listing 11-2: Using an Array Initializer import static java.lang.System.out; class ShowGuests { public static void main(String args[]) { int guests[] = {1, 4, 2, 0, 2, 1, 4, 3, 0, 2}; out.println(“Room\tGuests”); for (int roomNum = 0; roomNum < 10; roomNum++) { out.print(roomNum); out.print(“\t”); out.println(guests[roomNum]); } } } An array initializer can contain expressions as well as literals. In plain English, this means that you can put all kinds of things between the commas in the initializer. For instance, an initializer like {1 + 3, keyboard.nextInt(), 2, 0, 2, 1, 4, 3, 0, 2} works just fine. Stepping through an array with the enhanced for loop Java has an enhanced for loop — a for loop that doesn’t use counters or indices. Listing 11-3 shows you how to do it. The material in this section applies to Java 5.0, Java 6, JDK 7, or whatever higher version number comes along in the next few years. But this section’s material doesn’t work with older versions of Java — versions such as 1.3, 1.4, and so on. For a bit more about Java’s version numbers, see Chapter 2. Listing 11-3: Get a Load o’ that for Loop! import static java.lang.System.out; class ShowGuests { public static void main(String args[]) { int guests[] = {1, 4, 2, 0, 2, 1, 4, 3, 0, 2}; int roomNum = 0; 18_9780470371732-ch11.indd 25618_9780470371732-ch11.indd 256 7/6/11 7:02 PM7/6/11 7:02 PM www.it-ebooks.info 257 Chapter 11: Using Arrays and Collections to Juggle Values out.println(“Room\tGuests”); for (int numGuests : guests) { out.print(roomNum++); out.print(“\t”); out.println(numGuests); } } } Listings 11-1 and 11-3 have the same output. It’s in Figure 11-4. If you look at the loop in Listing 11-3, you see the same old pattern. Just like the loops in Listing 6-5, this example’s loop has three parts: for (variable-type variable-name : range-of-values) The first two parts are variable-type and variable-name. The loop in Listing 11-3 defines a variable named numGuests, and numGuests has type int. During each loop iteration, the variable numGuests takes on a new value. Look at Figure 11-4 to see these values. The initial value is 1. The next value is 4. After that comes 2. And so on. Where is the loop finding all these numbers? The answer lies in the loop’s range-of-values. In Listing 11-3, the loop’s range-of-values is guests. So, during the initial loop iteration, the value of numGuests is guests[0] (which is 1). During the next iteration, the value of numGuests is guests[1] (which is 4). After that comes guests[2] (which is 2). And so on. Java’s enhanced for loop requires a word of caution. Each time through the loop, the variable that steps through the range of values stores a copy of the value in the original range. The variable does not point to the range itself. So for example, if you add an assignment statement that changes the value of numGuests in Listing 11-3, this statement has no effect on any of the values stored in the guests array. To drive this point home, imagine that business is bad and I’ve filled my hotel’s guests array with zeros. Then I execute the following code: for (int numGuests : guests) { numGuests += 1; out.print(numGuests + “ “); } out.println(); for (int numGuests : guests) { out.print(numGuests + “ “); } 18_9780470371732-ch11.indd 25718_9780470371732-ch11.indd 257 7/6/11 7:02 PM7/6/11 7:02 PM www.it-ebooks.info 258 Part IV: Savvy Java Techniques The numGuests variable takes on values stored in the guests array. But the numGuests += 1 statement doesn’t change the values stored in this guests array. The code’s output looks like this: 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 Searching You’re sitting behind the desk at the Java Motel. Look! Here comes a party of five. These people want a room, so you need software that checks whether a room is vacant. If one is, the software modifies the GuestList.txt file (refer to Figure 11-3) by replacing the number 0 with the number 5. As luck would have it, the software is right on your hard drive. The software is shown in Listing 11-4. Listing 11-4: Do You Have a Room? import static java.lang.System.out; import java.util.Scanner; import java.io.File; import java.io.IOException; import java.io.PrintStream; class FindVacancy { public static void main(String args[]) throws IOException { Scanner keyboard = new Scanner(System.in); Scanner diskScanner = new Scanner(new File(“GuestList.txt”)); int guests[] = new int[10]; int roomNum; for (roomNum = 0; roomNum < 10; roomNum++) { guests[roomNum] = diskScanner.nextInt(); } roomNum = 0; while (roomNum < 10 && guests[roomNum] != 0) { roomNum++; } if (roomNum == 10) { out.println(“Sorry, no v cancy”); } else { out.print(“How many people for room “); out.print(roomNum); out.print(“? “); guests[roomNum] = keyboard.nextInt(); 18_9780470371732-ch11.indd 25818_9780470371732-ch11.indd 258 7/6/11 7:02 PM7/6/11 7:02 PM www.it-ebooks.info 259 Chapter 11: Using Arrays and Collections to Juggle Values PrintStream listOut = new PrintStream(“GuestList.txt”); for (roomNum = 0; roomNum < 10; roomNum++) { listOut.print(guests[roomNum]); listOut.print(“ “); } } } } Figures 11-5 through 11-7 show the running of the code in Listing 11-4. Back in Figure 11-3, the motel starts with two vacant rooms — Rooms 3 and 8. (Remember, the rooms start with Room 0.) The first time that you run the code in Listing 11-4, the program tells you that Room 3 is vacant and puts five people into the room. The second time you run the code, the program finds the remaining vacant room (Room 8) and puts a party of ten in the room. (What a party!) The third time you run the code, you don’t have any more vacant rooms. When the program discovers this, it displays the message Sorry, no v cancy, omitting at least one letter in the tradition of all motel neon signs. A run of Listing 11-4’s code writes a brand-new GuestList.txt file. This can be confusing because each Java IDE has its own way of displaying the GuestList.txt file’s content. Some IDEs don’t automatically display the newest GuestList.txt file, so after running Listing 11-4’s code, you may not immediately see a change. (For example, in Figure 11-5, Room 3 is empty. But after a run of the code, Figure 11-6 shows Room 3 having five guests.) Even if you don’t see a change, consecutive runs of Listing 11-4’s code change the GuestList.txt file. Poke around within your favorite IDE to find out how to make the IDE refresh the GuestList.txt file’s display. Figure 11-5: Filling a vacancy. Figure 11-6: Filling the last vacant room. 18_9780470371732-ch11.indd 25918_9780470371732-ch11.indd 259 7/6/11 7:02 PM7/6/11 7:02 PM www.it-ebooks.info 260 Part IV: Savvy Java Techniques The code in Listing 11-4 uses tricks from other chapters and sections of this book. The code’s only brand-new feature is the use of PrintStream to write to a disk file. Think about any example in this book that calls System.out. print, out.println, or their variants. What’s really going on when you call one of these methods? Figure 11-7: Sorry, Bud. No rooms. The thing called System.out is an object. The object is defined in the Java API. In fact, System.out is an instance of a class named java. io.PrintStream (or just PrintStream to its close friends). Now each object created from the PrintStream class has methods named print and println. Just as each Account object in Listing 7-3 has a display method, and just as the DecimalFormat object in Listing 10-1 has a format method, so the PrintStream object named out has print and println methods. When you call System.out.println, you’re calling a method that belongs to a PrintStream instance. Okay, so what of it? Well, System.out always stands for some text area on your computer screen. If you create your own PrintStream object and you make that object refer to a disk file, that PrintStream object refers to the disk file. When you call that object’s print method, you write text to a file on your hard drive. So in Listing 11-4, when you say PrintStream listOut = new PrintStream(“GuestList.txt”); listOut.print(guests[roomNum]); listOut.print(“ “); you’re telling Java to write text to a file on your hard drive — the GuestList.txt file. That’s how you update the count of guests staying in the hotel. When you call listOut.print for the number of guests in Room 3, you may print the number 5. So, between Figures 11-5 and 11-6, a number in the GuestList.txt file changes from 0 to 5. Then in Figure 11-6, you run the program a second time. When the program gets data from the newly written 18_9780470371732-ch11.indd 26018_9780470371732-ch11.indd 260 7/6/11 7:02 PM7/6/11 7:02 PM www.it-ebooks.info 261 Chapter 11: Using Arrays and Collections to Juggle Values GuestList.txt file, Room 3 is no longer vacant. So this time, the program suggests Room 8. Like many other methods and constructors of its kind, the PrintStream con- structor doesn’t pussyfoot around with files. If it can’t find a GuestList.txt file, the constructor creates one and prepares to write values into it. But, if a GuestList.txt file already exists, the constructor clobbers the existing file and prepares to write to a new, empty GuestList.txt file. If you don’t like it when files are clobbered, take precautions before calling the PrintStream constructor. This is more an observation than a tip. Say that you want to read data from a file named Employees.txt. To do this, you make a scanner. You call new Scanner(new File(“Employees.txt”)). If you accidentally call new Scanner(“Employees.txt”) without the new File part, the call doesn’t connect to your Employees.txt file. But notice how you prepare to write data to a file. You make a PrintStream instance by calling new PrintStream(“GuestList.txt”). You don’t use new File anywhere in the call. If you goof and accidentally include new File, the Java compiler becomes angry, jumps out, and bites you. In Listing 11-4, the condition roomNum < 10 && guests[roomNum] != 0 can be really tricky. If you move things around and write guests[roomNum] != 0 && roomNum < 10, you can get yourself into lots of trouble. For details, see this book’s website. Arrays of Objects The Java Motel is open for business, now with improved guest registration software! The people who brought you this chapter’s first section are always scratching their heads, looking for the best ways to improve their services. Now, with some ideas from object-oriented programming, they’ve started thinking in terms of a Room class. “And what,” you ask, “would a Room instance look like?” That’s easy. A Room instance has three properties — the number of guests in the room, the room rate, and a smoking/nonsmoking stamp. Figure 11-8 illustrates the situation. Listing 11-5 shows the code that describes the Room class. As promised, each instance of the Room class has three fields: the guests, rate, and smoking fields. (A false value for the boolean field, smoking, indicates a nonsmok- ing room.) In addition, the entire Room class has a static field named cur- rency. This currency object makes room rates look like dollar amounts. To find out what static means, see Chapter 10. 18_9780470371732-ch11.indd 26118_9780470371732-ch11.indd 261 7/6/11 7:02 PM7/6/11 7:02 PM www.it-ebooks.info 262 Part IV: Savvy Java Techniques Figure 11-8: Another abstract snapshot of rooms in the Java Motel. 1 0 4 1 2 2 0 3 2 4 1 5 4 6 3 7 0 8 2 60.00 60.00 60.00 60.00 80.00 80.00 80.00 80.00 100.00100.00 9 Listing 11-5: So This is What a Room Looks Like! import static java.lang.System.out; import java.util.Scanner; import java.text.NumberFormat; public class Room { private int guests; private double rate; private boolean smoking; private static NumberFormat currency = NumberFormat.getCurrencyInstance(); public void readRoom(Scanner diskScanner) { guests = diskScanner.nextInt(); rate = diskScanner.nextDouble(); smoking = diskScanner.nextBoolean(); } public void writeRoom() { out.print(guests); out.print(“\t”); out.print(currency.format(rate)); out.print(“\t”); out.println(smoking ? “yes” : “no”); } } Listing 11-5 has a few interesting quirks, but I’d rather not describe them until after you see all the code in action. That’s why, at this point, I move right on to the code that calls the Listing 11-5 code. After you read about arrays of rooms (shown in Listing 11-6), check out my description of the Listing 11-5 quirks. This warning is a deliberate repeat of an idea from Chapter 4, Chapter 7, and from who-knows-what-other chapter: You should be very careful when you use type double or type float to store money values. Calculations with double or float can be inaccurate. For more information (and more finger wagging) see Chapters 4 and 7. 18_9780470371732-ch11.indd 26218_9780470371732-ch11.indd 262 7/6/11 7:02 PM7/6/11 7:02 PM www.it-ebooks.info 263 Chapter 11: Using Arrays and Collections to Juggle Values This tip has absolutely nothing to do with Java. If you’re the kind of person who prefers a smoking room (with boolean field smoking = true in Listing 11-5), find someone you like — someone who can take three consecutive days off work. Have that person sit with you and comfort you for 72 straight hours while you refrain from smoking. You might become temporarily insane while the nicotine leaves your body, but eventually you’ll be okay. And your friend will feel like a real hero. Using the Room class So now you need an array of rooms. The code to create such a thing is in Listing 11-6. The code reads data from the RoomList.txt file. (Figure 11-9 shows the contents of the RoomList.txt file.) Figure 11-10 shows a run of the code in Listing 11-6. Listing 11-6: Would You Like to See a Room? import static java.lang.System.out; import java.util.Scanner; import java.io.File; import java.io.IOException; class ShowRooms { public static void main(String args[]) throws IOException { Room rooms[]; rooms = new Room[10]; Scanner diskScanner = new Scanner(new File(“RoomList.txt”)); for (int roomNum = 0; roomNum < 10; roomNum++) { rooms[roomNum] = new Room(); rooms[roomNum].readRoom(diskScanner); } out.println(“Room\tGuests\tRate\tSmoking?”); for (int roomNum = 0; roomNum < 10; roomNum++) { out.print(roomNum); out.print(“\t”); rooms[roomNum].writeRoom(); } } } 18_9780470371732-ch11.indd 26318_9780470371732-ch11.indd 263 7/6/11 7:02 PM7/6/11 7:02 PM www.it-ebooks.info 264 Part IV: Savvy Java Techniques Say what you want about the code in Listing 11-6. As far as I’m concerned, only one issue in the whole listing should concern you. And what, you ask, is that issue? Well, to create an array of objects — as opposed to an array made up of primitive values — you have to do three things: make the array vari- able, make the array itself, and then construct each individual object in the array. This is different from creating an array of int values or an array con- taining any other primitive type values. When you create an array of primi- tive type values, you do only the first two of these three things. To help make sense of all this, follow along in Listing 11-6 and Figure 11-11 as you read the following points: ✓ Room rooms[];: This declaration creates a rooms variable. This vari- able is destined to refer to an array (but doesn’t yet refer to anything at all). ✓ rooms = new Room[10];: This statement reserves ten slots of storage in the computer’s memory. The statement also makes the rooms vari- able refer to the group of storage slots. Each slot is destined to refer to an object (but doesn’t yet refer to anything at all). ✓ rooms[roomNum] = new Room();: This statement is inside a for loop. The statement is executed once for each of the ten room num- bers. For example, the first time through the loop, this statement says rooms[0] = new Room(). That first time around, the statement makes the slot rooms[0] refer to an actual object (an instance of the Room class). Figure 11-9: A file of Room data. 18_9780470371732-ch11.indd 26418_9780470371732-ch11.indd 264 7/6/11 7:02 PM7/6/11 7:02 PM www.it-ebooks.info 265 Chapter 11: Using Arrays and Collections to Juggle Values Figure 11-10: A run of the code in Listing 11-6. Figure 11-11: Steps in creating an array of objects. rooms [0] = readRoom(roomList); rooms[0]rooms[1]rooms[2]rooms[3]rooms[4]rooms[5]rooms[6]rooms[7]rooms[8]rooms[9] rooms 1 60.00 rooms [0] = new Room(); rooms[0]rooms[1]rooms[2]rooms[3]rooms[4]rooms[5]rooms[6]rooms[7]rooms[8]rooms[9] rooms rooms[0]rooms[1]rooms[2]rooms[3]rooms[4]rooms[5]rooms[6]rooms[7]rooms[8]rooms[9] rooms rooms = new Room[10]; rooms AB CD Room rooms[]; Although it’s technically not considered a step in array making, you still have to fill each object’s fields with values. For instance, the first time through the loop, the readRoom call says rooms[1].readRoom(diskScanner), which means, “Read data from the RoomList.txt file into the rooms[1] object’s fields (the guests, rate, and smoking fields).” Each time through the loop, the program creates a new object and reads data into that new object’s fields. You can squeeze the steps together just as you do when creating arrays of primitive values. For instance, you can do the first two steps in one fell swoop, like this: Room rooms[] = new Room[10]; 18_9780470371732-ch11.indd 26518_9780470371732-ch11.indd 265 7/6/11 7:02 PM7/6/11 7:02 PM www.it-ebooks.info 266 Part IV: Savvy Java Techniques You can also use an array initializer. (For an introduction to array initializers, see the section, “Using an array initializer,” earlier in this chapter.) Yet another way to beautify your numbers You can make numbers look nice in plenty of ways. If you take a peek at some earlier chapters, for example, you can see that Listing 7-7 uses printf, and Listing 10-1 uses a DecimalFormat. But in Listing 11-5, I display a currency amount. I use the NumberFormat class with its getCurrencyInstance method. If you compare the formatting statements in Listings 10-1 and 11-5, you don’t see much difference. ✓ One listing uses a constructor; the other listing calls getCurrency Instance. The getCurrencyInstance method is a good example of what’s called a factory method. A factory method is a convenient tool for creating commonly used objects. People always need code that displays dollar amounts. So the getCurrencyInstance method cre- ates a dollar format without forcing you to write new DecimalFormat (“$###0.00;($###0.00)”). Like a constructor, a factory method returns a brand-new object. But unlike a constructor, a factory method has no special status. When you create a factory method, you can name it anything you want. When you call a factory method, you don’t use the keyword new. ✓ One listing uses DecimalFormat; the other listing uses NumberFormat. A decimal number is a certain kind of number. (In fact, a decimal number is a number written in the base-10 system.) Accordingly, the DecimalFormat class is a subclass of the NumberFormat class. The DecimalFormat methods are more specific, so for most purposes, I use DecimalFormat. But it’s harder to use the DecimalFormat class’s getCurrencyInstance method. So for pro- grams that involve money, I tend to use NumberFormat. ✓ Both listings use format methods. In the end, you just write something like currency.format(rate) or decFormat.format(average). After that, Java does the work for you. From Chapter 4 onward, I issue gentle warnings against using types such as double and float for storing currency values. For the most accurate cur- rency calculations, use int, long or best of all, BigDecimal. 18_9780470371732-ch11.indd 26618_9780470371732-ch11.indd 266 7/6/11 7:02 PM7/6/11 7:02 PM www.it-ebooks.info 267 Chapter 11: Using Arrays and Collections to Juggle Values You can read more about the dangers of double types, float types, and currency values, see Chapter 5. The conditional operator Listing 11-5 uses an interesting doodad called the conditional operator. This conditional operator takes three expressions and returns the value of just one of them. It’s like a mini if statement. When you use the conditional operator, it looks something like this: conditionToBeTested ? expression1 : expression2 The computer evaluates the conditionToBeTested condition. If the condi- tion is true, the computer returns the value of expression1. But, if the con- dition is false, the computer returns the value of expression2. So, in the code smoking ? “yes” : “no” the computer checks whether smoking has the value true. If so, the whole three-part expression stands for the first string, “yes”. If not, the whole expression stands for the second string, “no”. In Listing 11-5, the call to out.println causes either “yes” or “no” to display. Which string gets displayed depends on whether smoking has the value true or false. Command Line Arguments Once upon a time, most programmers used a text-based development inter- face. To run the Displayer example in Chapter 3, they didn’t select Run from a menu in a fancy integrated development environment. Instead they typed a command in a plain-looking window, usually with white text on a black background. Figure 11-12 illustrates the point. In Figure 11-12, I type the words java Displayer, and the computer responds with my Java program’s output (the words You’ll love Java!). 18_9780470371732-ch11.indd 26718_9780470371732-ch11.indd 267 7/6/11 7:02 PM7/6/11 7:02 PM www.it-ebooks.info 268 Part IV: Savvy Java Techniques Figure 11-12: How dull! The plain-looking window goes by the various names, depending on the kind of operating system that you use. In Windows, a text window of this kind is a command prompt window. On a Macintosh and in Linux, this window is the terminal. Some versions of Linux and UNIX call this window a shell. Anyway, back in ancient times, you could write a program that sucked up extra information when you typed the command to launch the program. Figure 11-13 shows you how this worked. Figure 11-13: When you launch Make Random NumsFile, you type some extra information. In Figure 11-13, the programmer types java MakeRandomNumsFile to run the MakeRandomNumsFile program. But the programmer follows java MakeRandomNumsFile with two extra pieces of information; namely, MyNumberedFile.txt and 5. When the MakeRandomNumsFile program runs, the program sucks up two extra pieces of information and uses them to do whatever the program has to do. In Figure 11-13, the program sucks up MyNumberedFile.txt 5, but on another occasion the programmer might type SomeStuff 28 or BunchONumbers 2000. The extra information can be different each time you run the program. So the next question is, “How does a Java program know that it’s supposed to snarf up extra information each time it runs?” Since you first started working with Java, you’ve been seeing this String args[] business in the header of every main method. Well, it’s high time you found out what that’s all about. The parameter args[] is an array of String values. These String values are called command line arguments. 18_9780470371732-ch11.indd 26818_9780470371732-ch11.indd 268 7/6/11 7:02 PM7/6/11 7:02 PM www.it-ebooks.info 269 Chapter 11: Using Arrays and Collections to Juggle Values Using command line arguments in a Java program Listing 11-7 shows you how to use command line arguments in your code. Listing 11-7: Generate a File of Numbers import java.util.Random; import java.io.PrintStream; import java.io.IOException; class MakeRandomNumsFile { public static void main(String args[]) throws IOException { Random generator = new Random(); if (args.length < 2) { System.out.println (“Usage: MakeRandomNumsFile filename number”); System.exit(1); } PrintStream printOut = new PrintStream(args[0]); int numLines = Integer.parseInt(args[1]); for (int count = 1; count <= numLines; count++) { printOut.println(generator.nextInt(10) + 1); } } } If a particular program expects some command line arguments, you can’t start the program running the same way you’d start most of the other programs in this book. The way you feed command line arguments to a program depends on the IDE that you’re using — Eclipse, NetBeans, or whatever. That’s why this book’s website has instructions for feeding arguments to programs using various IDEs. When the code in Listing 11-7 begins running, the args array gets its values. In the main method of Listing 11-7, the array component args[0] automati- cally takes on the value “MyNumberedFile.txt”, and args[1] automati- cally becomes “5”. So the program’s assignment statements end up having the following meaning: 18_9780470371732-ch11.indd 26918_9780470371732-ch11.indd 269 7/6/11 7:02 PM7/6/11 7:02 PM www.it-ebooks.info 270 Part IV: Savvy Java Techniques PrintStream printOut = new PrintStream(“MyNumberedFile. txt”); int numLines = Integer.parseInt(“5”); The program creates a file named MyNumberedFile.txt and sets num- Lines to 5. So later in the code, the program randomly generates five values and puts those values into MyNumberedFile.txt. One run of the program gives me the file shown in Figure 11-14. Figure 11-14: A file from a run of the code in Listing 11-7. After running the code in Listing 11-7, where can you find the new file (MyNumberedFile.txt) on your hard drive? The answer depends on a lot of different things, so I don’t want to commit to one particular answer. If you use an IDE with programs divided into projects, then the new file is some- where in the project’s folder. One way or another, you can change Listing 11-7 to specify a full path name — a name like “c:\\MyNumberedFile.txt”. In Windows, file path names contain backslash characters. And in Java, when you want to indicate a backslash inside a double-quoted String literal, you use a double backslash instead. That’s why “c:\\MyNumberedFile. txt” contains two backslashes. In contrast, file paths in the Linux and Macintosh operating systems contain forward slashes. To indicate a for- ward slash in a Java String, use one forward slash. To refer to a file in your Macintosh Documents directory, you might write “/Users/YourUserName/ Documents/MyNumberedFile.txt”. Notice how each command line argument in Listing 11-7 is a String value. When you look at args[1], you don’t see the number 5 — you see the string “5” with a digit character in it. Unfortunately, you can’t use that “5” to do any counting. To get an int value from “5”, you have to apply the parseInt method. (Again, see Listing 11-7.) The parseInt method lives inside a class named Integer. So, to call par- seInt, you preface the name parseInt with the word Integer. The Integer class has all kinds of handy methods for doing things with int values. 18_9780470371732-ch11.indd 27018_9780470371732-ch11.indd 270 7/6/11 7:02 PM7/6/11 7:02 PM www.it-ebooks.info 271 Chapter 11: Using Arrays and Collections to Juggle Values In Java, Integer is the name of a class, and int is the name of a primitive (simple) type. The two things are related, but they’re not the same. The Integer class has methods and other tools for dealing with int values. Checking for the right number of command line arguments What happens if the user makes a mistake? What if the user forgets to type the number 5 on the first line in Figure 11-13? Then the computer assigns “MyNumberedFile.txt” to args[0], but it doesn’t assign anything to args[1]. This is bad. If the computer ever reaches the statement int numLines = Integer.parseInt(args[1]); the program crashes with an unfriendly ArrayIndexOutOfBoundsException. So, what do you do about this? In Listing 11-7, you check the length of the args array. You compare args.length with 2. If the args array has fewer than two components, you display a message on the screen and exit from the program. Figure 11-15 shows the resulting output. Figure 11-15: The code in Listing 11-7 tells you how to run it. Despite the checking of args.length in Listing 11-7, the code still isn’t crash- proof. If the user types five instead of 5, the program takes a nosedive with a NumberFormatException. The second command line argument can’t be a word. The argument has to be a number (and a whole number at that). I can add statements to Listing 11-7 to make the code more bulletproof, but check- ing for the NumberFormatException is better done in Chapter 12. 18_9780470371732-ch11.indd 27118_9780470371732-ch11.indd 271 7/6/11 7:02 PM7/6/11 7:02 PM www.it-ebooks.info 272 Part IV: Savvy Java Techniques When you’re working with command line arguments, you can enter a String value with a blank space in it. Just enclose the value in double quote marks. For instance, you can run the code of Listing 11-7 with arguments “My Big Fat File.txt” 7. The sun is about to set on this book’s discussion of arrays. The next section deals with something slightly different. But before you leave the subject of arrays, think about this: An array is a row of things, and not every kind of thing fits into just one row. Take the first few examples in this chapter involv- ing the motel. The motel rooms, numbered 0 through 9, are in one big line. But what if you move up in the world? You buy a big hotel with 50 floors and with 100 rooms on each floor. Then the data is square shaped. We have 50 rows, and each row contains 100 items. Sure, you can think of the rooms as if they’re all in one big row, but why should you have to do that? How about having a two-dimensional array? It’s a square-shaped array in which each compo- nent has two indices — a row number and a column number. Alas, I have no space in this book to show you a two-dimensional array (and I can’t afford a big hotel’s prices anyway). But if you visit this book’s website, you can read all about it. Using Java Collections Arrays are nice, but arrays have some serious limitations. Imagine that you store customer names in some predetermined order. Your code contains an array, and the array has space for 100 names. String name[] = new String[100]; for (int i = 0; i < 100; i++) { name[i] = new String(); } All is well until, one day, customer number 101 shows up. As your program runs, you enter data for customer 101, hoping desperately that the array with 100 components can expand to fit your growing needs. No such luck. Arrays don’t expand. Your program crashes with an ArrayIndexOutOfBoundsException. “In my next life, I’ll create arrays of length 1,000,” you say to yourself. And when your next life rolls around, you do just that. String name[] = new String[1000]; for (int i = 0; i < 1000; i++) { name[i] = new String(); } 18_9780470371732-ch11.indd 27218_9780470371732-ch11.indd 272 7/6/11 7:02 PM7/6/11 7:02 PM www.it-ebooks.info 273 Chapter 11: Using Arrays and Collections to Juggle Values But during your next life, an economic recession occurs. Instead of having 101 customers, you have only 3 customers. Now you’re wasting space for 1,000 names when space for 3 names would do. And what if no economic recession occurs? You’re sailing along with your array of size 1,000, using a tidy 825 spaces in the array. The components with indices 0 through 824 are being used, and the components with indices 825 through 999 are waiting quietly to be filled. One day, a brand-new customer shows up. Because your customers are stored in order (alphabetically by last name, numerically by Social Security number, whatever), you want to squeeze this customer into the correct com- ponent of your array. The trouble is that this customer belongs very early on in the array, at the component with index 7. What happens then? You take the name in component number 824 and move it to component 825. Then you take the name in component 823 and move it to component 824. Take the name in component 822 and move it to component 823. You keep doing this until you’ve moved the name in component 7. Then you put the new customer’s name into component 7. What a pain! Sure, the computer doesn’t complain. (If the computer has feelings, it probably likes this kind of busy work.) But as you move around all these names, you waste processing time, you waste power, and you waste all kinds of resources. “In my next life, I’ll leave three empty components between every two names.” And of course, your business expands. Eventually you find that three aren’t enough. Collection classes to the rescue The issues in the previous few paragraphs aren’t new. Computer scientists have been working on these issues for a long time. They haven’t discovered any magic one-size-fits-all solution, but they’ve discovered some clever tricks. The Java API has a bunch of classes known as collection classes. Each col- lection class has methods for storing bunches of values. And each collection class’s methods use some clever tricks. For you, the bottom line is as fol- lows: Certain collection classes deal as efficiently as possible with the issues raised in the previous few paragraphs. If you have to deal with such issues when writing code, you can use these collection classes and call the classes’ methods. Instead of fretting about a customer whose name belongs in posi- tion 7, you can just call a class’s add method. The method inserts the name at a position of your choice and deals reasonably with whatever ripple effects have to take place. In the best circumstances, the insertion is very efficient. In the worst circumstances, you can rest assured that the code does every- thing the best way it can. 18_9780470371732-ch11.indd 27318_9780470371732-ch11.indd 273 7/6/11 7:02 PM7/6/11 7:02 PM www.it-ebooks.info 274 Part IV: Savvy Java Techniques Using an ArrayList One of the most versatile of Java’s collection classes is the ArrayList. Listing 11-8 shows you how it works. Listing 11-8: Working with a Java Collection import static java.lang.System.out; import java.util.Scanner; import java.io.File; import java.io.IOException; import java.util.ArrayList; class ShowNames { public static void main(String args[]) throws IOException { ArrayList people = new ArrayList(); Scanner diskScanner = new Scanner(new File(“names.txt”)); while (diskScanner.hasNext()) { people.add(diskScanner.nextLine()); } people.remove(0); people.add(2, “Jim Newton”); for (String name : people) { out.println(name); } } } Figure 11-16 shows you a sample names.txt file. The code in Listing 11-8 reads that names.txt file and prints the stuff in Figure 11-17. Figure 11-16: Several names in a file. 18_9780470371732-ch11.indd 27418_9780470371732-ch11.indd 274 7/6/11 7:02 PM7/6/11 7:02 PM www.it-ebooks.info 275 Chapter 11: Using Arrays and Collections to Juggle Values Figure 11-17: The code in Listing 11-8 changes some of the names. All the interesting things happen when you execute the remove and add methods. The variable named people refers to an ArrayList object. When you call that object’s remove method people.remove(0); you eliminate a value from the list. In this case, you eliminate whatever value is in the list’s initial position (the position numbered 0). So in Listing 11-8, the call to remove takes the name Barry Burd out of the list. That leaves only eight names in the list, but then the next statement, people.add(2, “Jim Newton”); inserts a name into position number 2. (After Barry is removed, position number 2 is the position occupied by Harry Spoonswagler, so Harry moves to position 3, and Jim Newton becomes the number 2 man.) Notice that an ArrayList object has two different add methods. The method that adds Jim Newton has two parameters: a position number and a value to be added. Another add method people.add(diskScanner.nextLine()); takes only one parameter. This statement takes whatever name it finds on a line of the input file and appends that name to the end of the list. (The add method with only one parameter always appends its value to what’s cur- rently the end of the ArrayList object.) The last few lines of Listing 11-8 contain an enhanced for loop. Like the loop in Listing 11-3, the enhanced loop in Listing 11-8 has the following form: for (variable-type variable-name : range-of-values) 18_9780470371732-ch11.indd 27518_9780470371732-ch11.indd 275 7/6/11 7:02 PM7/6/11 7:02 PM www.it-ebooks.info 276 Part IV: Savvy Java Techniques All about generics One of the original design goals for Java was to keep the language as simple as possible. The language’s developer took some unnecessarily complicated features of C++ and tossed them out the window. The result was a language that was elegant and sleek. Some people said the language was too sleek. So after several years of discussion and squabbling, Java became a bit more complicated. By the year 2004, Java had enum types, enhanced for loops, static import, and some other interesting new fea- tures. But the most talked-about new feature was the introduction of generics. ArrayList people = new ArrayList(); The use of anything like was new in Java 5.0. In old-style Java, you’d write ArrayList people = new ArrayList(); In those days, an ArrayList could store almost anything you wanted to put in it — a number, an Account, a Room, a String — anything. The ArrayList class was very versatile, but with this versatility came some headaches. If you could put anything into an ArrayList, you couldn’t easily predict what you would get out of an ArrayList. In particular, you couldn’t easily write code that assumed you had stored certain types of values in the ArrayList. Here’s an example: ArrayList things = new ArrayList(); things.add(new Account()); Account myAccount = things. get(0); //DON’T USE THIS. IT’S BAD CODE. In the third line, the call to get(0) grabs the earliest value in the things collection. The call to get(0) is okay, but then the compiler chokes on the attempted assignment to my- Account. You get a message on the third line saying that whatever you get from the things list can’t be stuffed into the myAccount vari- able. You get this message because, by the time the compiler reaches the third line, it has for- gotten that the item added on the second line was of type Account! The introduction of generics fixes this problem: ArrayList things = new ArrayList(); things.add(new Account()); Account myAccount = things. get(0); //USE THIS CODE INSTEAD. IT’S GOOD CODE. Adding in two places tells the compiler that things stores Account instances — nothing else. So, in the third line in the preceding code, you get a value from the things collection. Then, because things stores only Account objects, you can make myAccount refer to that new value. Java 5.0 added generics to Java. But soon after the birth of Java 5.0, programmers noticed how clumsy the code for generics can be. After all, you can create generics within generics. An ArrayList can contain a bunch of arrays, each of which can be an ArrayList. So you can write ArrayList[]> mess = new ArrayList[]>(); 18_9780470371732-ch11.indd 27618_9780470371732-ch11.indd 276 7/6/11 7:02 PM7/6/11 7:02 PM www.it-ebooks.info 277 Chapter 11: Using Arrays and Collections to Juggle Values In Listing 11-8, the variable-type is String, the variable-name is name, and the range-of-values includes the things stored in the people collection. During an iteration of the loop, name refers to one of the String values stored in people. (So if the people collection contains nine values, then the for loop goes through nine iterations.) During each iteration, the statement inside the loop displays a name on the screen. Using generics (hot stuff!) Look again at Listing 11-8 and notice the funky ArrayList declaration: ArrayList people = new ArrayList(); Starting with Java 5.0, each collection class is generified. That ugly-sounding word means that every collection declaration should contain some angle- bracketed stuff, such as . The thing that’s sandwiched between < and > tells Java what kinds of values the new collection may contain. For example, in Listing 11-8, the words ArrayList people tell Java that people is a bunch of strings. That is, the people list contains String objects (not Room objects, not Account objects, not Employee objects, nothing other than String objects). All the repetition in that mess declaration gives me a headache! To avoid this ugli- ness, Java 7 has a diamond operator <>. The diamond operator tells Java to reuse what- ever insanely complicated stuff you put in the previous part of the generic declaration. In this example, the <> tells Java to reuse []>, even though you write []> only once. Here’s how the streamlined Java 7 code looks: ArrayList[]> mess = new ArrayList<>(); In Java 7, you can write either of these mess declarations — the original, nasty declaration with two occurrences of ArrayList[], or the streamlined (only mildly nasty) declara- tion with the diamond operator and only one ArrayList[] occurrence. Yes, the streamlined code is still complicated. But without all the ArrayList[] repetition, the streamlined code is less cumber- some. The Java 7 diamond operator takes away one chance for you to copy something incor- rectly and have a big error in your code. 18_9780470371732-ch11.indd 27718_9780470371732-ch11.indd 277 7/6/11 7:02 PM7/6/11 7:02 PM www.it-ebooks.info 278 Part IV: Savvy Java Techniques Most of this section’s material applies to Java 5.0, Java 6, Java 7, or whatever higher version number comes along in the next few years. You can’t use gener- ics in any version of Java before Java 5.0. For more about generics, see the sidebar. And for more about Java’s version numbers, see Chapter 2. In Listing 11-8 the words ArrayList people say that the people variable can refer only to a collection of String values. So from that point on, any reference to an item from the people collection is treated exclu- sively as a String. If you write people.add(new Room()); then the compiler coughs up your code and spits it out because a Room (cre- ated in Listing 11-5) isn’t the same as a String. (This coughing and spitting happens even if the compiler has access to the Room class’s code — the code in Listing 11-5.) But the statement people.add(“George Gow”); is just fine. Because “George Gow” has type String, the compiler smiles happily. Java 7 has a cool feature allowing you to abbreviate generic declarations. In Listing 11-8, you can write ArrayList people = new ArrayList<>() without repeating the word String a second time in the declaration. The <> symbol without any words inside it is called a diamond operator. The diamond operator saves you from having to rewrite stuff like over and over again. Testing for the presence of more data Here’s a pleasant surprise. When you write a program like the one shown previously in Listing 11-8, you don’t have to know how many names are in the input file. Having to know the number of names may defeat the purpose of using the easily expandable ArrayList class. Instead of looping until you read exactly nine names, you can loop until you run out of data. The Scanner class has several nice methods like hasNextInt, hasNext- Double, and plain old hasNext. Each of these methods checks for more input data. If there’s more data, the method returns true. Otherwise, the method returns false. 18_9780470371732-ch11.indd 27818_9780470371732-ch11.indd 278 7/6/11 7:02 PM7/6/11 7:02 PM www.it-ebooks.info 279 Chapter 11: Using Arrays and Collections to Juggle Values Listing 11-8 uses the general purpose hasNext method. This hasNext method returns true as long as there’s anything more to read from the pro- gram’s input. So after the program scoops up that last Hugh R. DaReader line in Figure 11-16, the subsequent hasNext call returns false. This false condition ends execution of the while loop and plummets the computer toward the remainder of the Listing 11-8 code. 18_9780470371732-ch11.indd 27918_9780470371732-ch11.indd 279 7/6/11 7:02 PM7/6/11 7:02 PM www.it-ebooks.info 280 Part IV: Savvy Java Techniques 18_9780470371732-ch11.indd 28018_9780470371732-ch11.indd 280 7/6/11 7:02 PM7/6/11 7:02 PM www.it-ebooks.info Chapter 12 Looking Good When Things Take Unexpected Turns In This Chapter ▶ Recovering from bad input and other nasty situations ▶ Making your code (more or less) crash proof ▶ Defining your own exception class September 9, 1945: A moth flies into one of the relays of the Harvard Mark II computer and gums up the works. This becomes the first recorded case of a real computer bug. April 19, 1957: Herbert Bright, manager of the data processing center at Westinghouse in Pittsburgh, receives an unmarked deck of computer punch cards in the mail (which is like getting an unlabeled CD-ROM in the mail today). Mr. Bright guesses that this deck comes from the development team for FORTRAN — the first computer programming language. He’s been waiting a few years for this software. (No web downloads were available at the time.) Armed with nothing but this good guess, Bright writes a small FORTRAN program and tries to compile it on his IBM 704. (The IBM 704 lives in its own specially built, 2,000-square-foot room. With vacuum tubes instead of transis- tors, the machine has a whopping 32K of RAM. The operating system has to be loaded from tape before the running of each program, and a typical pro- gram takes between two and four hours to run.) After the usual waiting time, Bright’s attempt to compile a FORTRAN program comes back with a single error — a missing comma in one of the statements. Bright corrects the error, and the program runs like a charm. July 22, 1962: Mariner I, the first U.S. spacecraft aimed at another planet, is destroyed when it behaves badly four minutes after launch. The bad behav- ior is attributed to a missing bar (like a hyphen) in the formula for the rock- et’s velocity. 19_9780470371732-ch12.indd 28119_9780470371732-ch12.indd 281 7/6/11 7:02 PM7/6/11 7:02 PM www.it-ebooks.info 282 Part IV: Savvy Java Techniques Around the same time, orbit computation software at NASA is found to con- tain the incorrect statement DO 10 I=1.10 (instead of the correct DO 10 I=1,10). In modern notation, this is like writing do10i = 1.10 in place of for (int i=1; i<=10; i++). The change from a comma to a period turns a loop into an assignment statement. January 1, 2000: The Year 2000 Problem wreaks havoc on the modern world. Any historically accurate facts in these notes were borrowed from the follow- ing sources: the Computer Folklore newsgroup (alt.folklore.computers, which you can access through http://groups.google.com), the Free On-line Dictionary of Computing (http://foldoc.org), the “Looking Back” column in Computer magazine (www.computer.org/computer), and the web pages of the IEEE (www.computer.org/history). Handling Exceptions You’re taking inventory. This means counting item after item, box after box, and marking the numbers of such things on log sheets, in little handheld gizmos, and into forms on computer keyboards. A particular part of the project involves entering the number of boxes that you find on the Big Dusty Boxes That Haven’t Been Opened Since Year One shelf. Rather than break the company’s decades-old habit, you decide not to open any of these boxes. You arbitrarily assign the value $3.25 to each box. Listing 12-1 shows the software to handle this bit of inventory. The software has a flaw, which is revealed in Figure 12-1. When the user enters a whole number value, things are okay. But when the user enters something else (like the number 3.5), the program comes crashing to the ground. Surely some- thing can be done about this. Computers are stupid, but they’re not so stupid that they should fail royally when a user enters an improper value. Listing 12-1: Counting Boxes import static java.lang.System.out; import java.util.Scanner; import java.text.NumberFormat; class InventoryA { public static void main(String args[]) { final double boxPrice = 3.25; Scanner keyboard = new Scanner(System.in); NumberFormat currency = NumberFormat.getCurrencyInstance(); 19_9780470371732-ch12.indd 28219_9780470371732-ch12.indd 282 7/6/11 7:02 PM7/6/11 7:02 PM www.it-ebooks.info 283 Chapter 12: Looking Good When Things Take Unexpected Turns out.print(“How many boxes do we have? “); String numBoxesIn = keyboard.next(); int numBoxes = Integer.parseInt(numBoxesIn); out.print(“The value is “); out.println(currency.format(numBoxes * boxPrice)); } } Figure 12-1: Three sepa- rate runs of the code in Listing 12-1. The key to fixing a program bug is examining the message that appears when the program crashes. The inventory program’s message says java.lang.NumberFormatException. That means a class named NumberFormatException is in the java.lang API package. Somehow, the call to Integer.parseInt brought this NumberFormatException class out of hiding. For a brief explanation of the Integer.parseInt method, see Chapter 11. Well, here’s what’s going on. The Java programming language has a mecha- nism called exception handling. With exception handling, a program can detect that things are about to go wrong and respond by creating a brand- new object. In the official terminology, the program is said to be throwing an exception. That new object, an instance of the Exception class, is passed like a hot potato from one piece of code to another until some piece of code decides to catch the exception. When the exception is caught, the program executes some recovery code, buries the exception, and moves on to the next normal statement as if nothing had ever happened. The process is illustrated in Figure 12-2. The whole thing is done with the aid of several Java keywords. These key- words are as follows: ✓ throw: Creates a new exception object. ✓ throws: Passes the buck from a method up to whatever code called the method. 19_9780470371732-ch12.indd 28319_9780470371732-ch12.indd 283 7/6/11 7:02 PM7/6/11 7:02 PM www.it-ebooks.info 284 Part IV: Savvy Java Techniques ✓ try: Encloses code that has the potential to create a new exception object. In the usual scenario, the code inside a try clause contains calls to methods whose code can create one or more exceptions. ✓ catch: Deals with the exception, buries it, and then moves on. So, the truth is out. Through some chain of events like the one shown in Figure 12-2, the method Integer.parseInt can throw a NumberFormatException. When you call Integer.parseInt, this NumberFormatException is passed on to you. The Java API (Application Programming Interface) documentation for the parseInt method says, “Throws: NumberFormatException — if the string does not contain a parsable integer.” Once in a while, reading the documenta- tion actually pays. If you call yourself a hero, you’d better catch the exception so that all the other code can get on with its regular business. Listing 12-2 shows the catch- ing of an exception. Figure 12-2: Throwing, passing, and catching an exception. void method1() { try { method2(); } catch (Exception e) { } } void method2() throws Exception { method3(); } void method3() throws Exception { method4(); } void method4() throws Exception { throw new Exception(); } 19_9780470371732-ch12.indd 28419_9780470371732-ch12.indd 284 7/6/11 7:02 PM7/6/11 7:02 PM www.it-ebooks.info 285 Chapter 12: Looking Good When Things Take Unexpected Turns Listing 12-2: A Hero Counts Boxes import static java.lang.System.out; import java.util.Scanner; import java.text.NumberFormat; class InventoryB { public static void main(String args[]) { final double boxPrice = 3.25; Scanner keyboard = new Scanner(System.in); NumberFormat currency = NumberFormat.getCurrencyInstance(); out.print(“How many boxes do we have? “); String numBoxesIn = keyboard.next(); try { int numBoxes = Integer.parseInt(numBoxesIn); out.print(“The value is “); out.println( currency.format(numBoxes * boxPrice)); } catch (NumberFormatException e) { out.println(“That’s not a number.”); } } } Figure 12-3 shows three runs of the code from Listing 12-2. When a misguided user types three instead of 3, the program maintains its cool by display- ing That’s not a number. The trick is to enclose the call to Integer. parseInt inside a try clause. If you do this, the computer watches for exceptions when any statement inside the try clause is executed. If an exception is thrown, the computer jumps from inside the try clause to a catch clause below it. In Listing 12-2, the computer jumps directly to the catch (NumberFormatException e) clause. The computer executes the println statement inside the clause and then marches on with normal pro- cessing. (If there were statements in Listing 12-2 after the end of the catch clause, the computer would go on and execute them.) Figure 12-3: Three runs of the code in Listing 12-2. 19_9780470371732-ch12.indd 28519_9780470371732-ch12.indd 285 7/6/11 7:02 PM7/6/11 7:02 PM www.it-ebooks.info 286 Part IV: Savvy Java Techniques An entire try-catch assembly — complete with a try clause, catch clause, and what have you — is called a try statement. Sometimes, for emphasis, I call it a try-catch statement. The parameter in a catch clause Take a look at the catch clause in Listing 12-2 and pay particular attention to the words (NumberFormatException e). This looks a lot like a method’s parameter list, doesn’t it? In fact, every catch clause is like a little mini- method with its own parameter list. The parameter list always has an exception type name and then a parameter. In Listing 12-2, I don’t do anything with the catch clause’s e parameter, but I certainly could if I wanted to. Remember, the exception that’s thrown is an object — an instance of the NumberFormatException class. When an exception is caught, the computer makes the catch clause’s parameter refer to that exception object. In other words, the name e stores a bunch of infor- mation about the exception. To take advantage of this, you can call some of the exception object’s methods. } catch (NumberFormatException e) { out.println(“Message: ***” + e.getMessage() + “***”); e.printStackTrace(); } With this new catch clause, a run of the inventory program may look like the run shown in Figure 12-4. When you call getMessage, you fetch some detail about the exception. (In Figure 12-4, the detail is Message: ***For input string: “three”***.) When you call printStackTrace, you get some additional information; namely, a display showing the methods that were running at the moment when the exception was thrown. (In Figure 12-4, the display includes Integer.parseInt and the main method.) Both get- Message and printStackTrace present information to help you find the source of the program’s difficulties. Figure 12-4: Calling an exception object’s methods. 19_9780470371732-ch12.indd 28619_9780470371732-ch12.indd 286 7/6/11 7:02 PM7/6/11 7:02 PM www.it-ebooks.info 287 Chapter 12: Looking Good When Things Take Unexpected Turns When you mix System.out.println calls with printStackTrace calls, the order in which Java displays the information is not predictable. For example, in Figure 12-4, the text Message: ***For input string: “three”*** may appear before or after the stack trace. If the ordering of this output matters to you, change out.println(“Message: ***” to System.err. println(“Message: ***”. Exception types So what else can go wrong today? Are there other kinds of exceptions — things that don’t come from the NumberFormatException class? Sure, plenty of different exception types are out there. You can even create one of your own. You wanna try? If so, look at Listings 12-3 and 12-4. Listing 12-3: Making Your Own Kind of Exception @SuppressWarnings(“serial”) class OutOfRangeException extends Exception { } Listing 12-4: Using Your Custom Made Exception import static java.lang.System.out; import java.util.Scanner; import java.text.NumberFormat; class InventoryC { public static void main(String args[]) { final double boxPrice = 3.25; Scanner keyboard = new Scanner(System.in); NumberFormat currency = NumberFormat.getCurrencyInstance(); out.print(“How many boxes do we have? “); String numBoxesIn = keyboard.next(); try { int numBoxes = Integer.parseInt(numBoxesIn); if (numBoxes < 0) { throw new OutOfRangeException(); } (continued) 19_9780470371732-ch12.indd 28719_9780470371732-ch12.indd 287 7/6/11 7:02 PM7/6/11 7:02 PM www.it-ebooks.info 288 Part IV: Savvy Java Techniques Listing 12-4 (continued) out.print(“The value is “); out.println( currency.format(numBoxes * boxPrice)); } catch (NumberFormatException e) { out.println(“That’s not a number.”); } catch (OutOfRangeException e) { out.print(numBoxesIn); out.println(“? That’s impossible!”); } } } Listings 12-3 and 12-4 remedy a problem that cropped up in Figure 12-3. Look at the last of the three runs in Figure 12-3. The user reports that the shelves have –25 boxes, and the computer takes this value without blinking an eye. The truth is that you would need a black hole (or some other exotic space- time warping phenomenon) to have a negative number of boxes on any shelf in your warehouse. So the program should get upset if the user enters a nega- tive number of boxes, which is what the code in Listing 12-4 does. To see the upset code, look at Figure 12-5. Figure 12-5: Three runs of the code from Listings 12-3 and 12-4. The code in Listing 12-3 declares a new kind of exception class — OutOfRangeException. In many situations, typing a negative number would be just fine, so OutOfRangeException isn’t built in to the Java API. However, in the inventory program, a negative number should be flagged as an anomaly. The OutOfRangeException class in Listing 12-3 wins the award for the shortest self-contained piece of code in the book. The class’s code is just a declaration line and an empty pair of braces. The code’s operative phrase is extends Exception. Being a subclass of the Java API Exception class allows any instance of the OutOfRangeException class to be thrown. Back in Listing 12-4, a new OutOfRangeException instance is thrown. When this happens, the catch clause (OutOfRangeException e) catches the instance. The clause echoes the user’s input and displays the message That’s impossible! 19_9780470371732-ch12.indd 28819_9780470371732-ch12.indd 288 7/6/11 7:02 PM7/6/11 7:02 PM www.it-ebooks.info 289 Chapter 12: Looking Good When Things Take Unexpected Turns The text @SuppressWarnings(“serial”) in Listing 12-3 is a Java annota- tion. For an introduction to annotations, see Chapter 8. For a few words about the SuppressWarnings annotation, see Chapter 9. Who’s going to catch the exception? Take one more look at Listing 12-4. Notice that more than one catch clause can accompany a single try clause. When an exception is thrown inside a try clause, the computer starts going down the accompanying list of catch clauses. The computer starts at whatever catch clause comes immediately after the try clause and works its way down the program’s text. For each catch clause, the computer asks itself, “Is the exception that was just thrown an instance of the class in this clause’s parameter list?” ✓ If not, the computer skips this catch clause and moves on to the next catch clause in line. ✓ If so, the computer executes this catch clause and then skips past all the other catch clauses that come with this try clause. The computer goes on and executes whatever statements come after the whole try- catch statement. For some concrete examples, see Listings 12-5 and 12-6. Listing 12-5: Yet Another Exception @SuppressWarnings(“serial”) class NumberTooLargeException extends OutOfRangeException { } Listing 12-6: Where Does the Buck Stop? import static java.lang.System.out; import java.util.Scanner; import java.text.NumberFormat; class InventoryD { public static void main(String args[]) { final double boxPrice = 3.25; Scanner keyboard = new Scanner(System.in); NumberFormat currency = NumberFormat.getCurrencyInstance(); (continued) 19_9780470371732-ch12.indd 28919_9780470371732-ch12.indd 289 7/6/11 7:02 PM7/6/11 7:02 PM www.it-ebooks.info 290 Part IV: Savvy Java Techniques Listing 12-6 (continued) out.print(“How many boxes do we have? “); String numBoxesIn = keyboard.next(); try { int numBoxes = Integer.parseInt(numBoxesIn); if (numBoxes < 0) { throw new OutOfRangeException(); } if (numBoxes > 1000) { throw new NumberTooLargeException(); } out.print(“The value is “); out.println( currency.format(numBoxes * boxPrice)); } catch (NumberFormatException e) { out.println(“That’s not a number.”); } catch (OutOfRangeException e) { out.print(numBoxesIn); out.println(“? That’s impossible!”); } catch (Exception e) { out.print(“Something went wrong, “); out.print(“but I’m clueless about what “); out.println(“it actually was.”); } out.println(“That’s that.”); } } To run the code in Listings 12-5 and 12-6, you need one additional Java program file. You need the OutOfRangeException class in Listing 12-3. Listing 12-6 addresses the scenario in which you have limited shelf space. You don’t have room for more than 1,000 boxes, but once in a while, the program asks how many boxes you have, and somebody enters the number 100000 by accident. In cases like this, Listing 12-6 does a quick reality check. Any number of boxes over 1,000 is tossed out as being unrealistic. 19_9780470371732-ch12.indd 29019_9780470371732-ch12.indd 290 7/6/11 7:02 PM7/6/11 7:02 PM www.it-ebooks.info 291 Chapter 12: Looking Good When Things Take Unexpected Turns Listing 12-6 watches for a NumberTooLargeException, but to make life more interesting, Listing 12-6 doesn’t have a catch clause for the NumberTooLargeException. In spite of this, everything still works out just fine. It’s fine because NumberTooLargeException is declared to be a subclass of OutOfRangeException, and Listing 12-6 has a catch clause for the OutOfRangeException. You see, because NumberTooLargeException is a subclass of OutOfRangeException, any instance of NumberTooLargeException is just a special kind of OutOfRangeException. So in Listing 12-6, the com- puter may start looking for a clause to catch a NumberTooLargeException. When the computer stumbles upon the OutOfRangeException catch clause, the computer says, “Okay, I’ve found a match. I’ll execute the state- ments in this catch clause.” To keep from having to write this whole story over and over again, I intro- duce some new terminology. I say that the catch clause with parameter OutOfRangeException matches the NumberTooLargeException that’s been thrown. I call this catch clause a matching catch clause. The following bullets describe different things that the user may do and how the computer responds. As you read through the bullets, you can follow along by looking at the runs shown in Figure 12-6. Figure 12-6: Four runs of the code from Listing 12-6. ✓ The user enters an ordinary whole number, like the number 3. All the statements in the try clause are executed. Then the computer skips past all the catch clauses and executes the code that comes immedi- ately after all the catch clauses. (See Figure 12-7.) ✓ The user enters something that’s not a whole number, like the word fish. The code throws a NumberFormatException. The computer skips past the remaining statements in the try clause. The computer executes the statements inside the first catch clause — the clause whose parameter is of type NumberFormatException. Then the computer skips past the second and third catch clauses and executes the code that comes immediately after all the catch clauses. (See Figure 12-8.) 19_9780470371732-ch12.indd 29119_9780470371732-ch12.indd 291 7/6/11 7:02 PM7/6/11 7:02 PM www.it-ebooks.info 292 Part IV: Savvy Java Techniques Figure 12-7: No excep- tion is thrown. try { //Normal processing (throw no exception) } catch (NumberFormatException e) { out.println("That's not a number."); } catch (OutOfRangeException e) { out.print(numBoxesIn); out.println("? That's impossible!"); } catch (Exception e) { out.print("Something went wrong, "); out.print("but I'm clueless about what "); out.println("it actually was."); } out.println("That's that."); Figure 12-8: A Number Format Exception is thrown. try { throw new NumberFormatException (); } catch (NumberFormatException e) { out.println("That's not a number."); } catch (OutOfRangeException e) { out.print(numBoxesIn); out.println("? That's impossible!"); } catch (Exception e) { out.print("Something went wrong, "); out.print("but I'm clueless about what "); out.println("it actually was."); } out.println("That's that."); 19_9780470371732-ch12.indd 29219_9780470371732-ch12.indd 292 7/6/11 7:02 PM7/6/11 7:02 PM www.it-ebooks.info 293 Chapter 12: Looking Good When Things Take Unexpected Turns ✓ The user enters a negative number, like the number –25. The code throws an OutOfRangeException. The computer skips past the remaining statements in the try clause. The computer even skips past the statements in the first catch clause. (After all, an OutOfRangeException isn’t any kind of a NumberFormatException. The catch clause with parameter NumberFormatException isn’t a match for this OutOfRangeException.) The computer executes the statements inside the second catch clause — the clause whose param- eter is of type OutOfRangeException. Then the computer skips past the third catch clause and executes the code that comes immediately after all the catch clauses. (See Figure 12-9.) Figure 12-9: An OutOf Range Exception is thrown. try { throw new OutOfRangeException (); } catch (NumberFormatException e) { out.println("That's not a number."); } catch (OutOfRangeException e) { out.print(numBoxesIn); out.println("? That's impossible!"); } catch (Exception e) { out.print("Something went wrong, "); out.print("but I'm clueless about what "); out.println("it actually was."); } out.println("That's that."); ✓ The user enters an unrealistically large number, like the number 1001. The code throws a NumberTooLargeException. The com- puter skips past the remaining statements in the try clause. The computer even skips past the statements in the first catch clause. (After all, a NumberTooLargeException isn’t any kind of NumberFormatException.) But, according to the code in Listing 12-5, NumberTooLargeException is a subclass of OutOfRangeException. When the computer reaches the second catch clause, the computer says, “Hmm! A NumberTooLargeException is a kind of OutOfRangeException. I’ll execute the statements in this catch clause — the clause with param- eter of type OutOfRangeException.” In other words, it’s a match. 19_9780470371732-ch12.indd 29319_9780470371732-ch12.indd 293 7/6/11 7:02 PM7/6/11 7:02 PM www.it-ebooks.info 294 Part IV: Savvy Java Techniques So, the computer executes the statements inside the second catch clause. Then the computer skips the third catch clause and executes the code that comes immediately after all the catch clauses. (See Figure 12-10.) Figure 12-10: A Number TooLarge Exception is thrown. try { throw new NumberTooLargeException (); } catch (NumberFormatException e) { out.println("That's not a number."); } catch (OutOfRangeException e) { out.print(numBoxesIn); out.println("? That's impossible!"); } catch (Exception e) { out.print("Something went wrong, "); out.print("but I'm clueless about what "); out.println("it actually was."); } out.println("That's that."); ✓ Something else, something very unpredictable, happens (I don’t know what). With my unending urge to experiment, I reached into the try clause of Listing 12-6 and added a statement that throws an IOException. No reason — I just wanted to see what would happen. When the code threw an IOException, the computer skipped past the remaining statements in the try clause. Then the computer skipped past the statements in the first and second catch clauses. When the computer reached the third catch clause, I could hear the computer say, “Hmm! An IOException is a kind of Exception. I’ve found a matching catch clause — a clause with a parameter of type Exception. I’ll execute the statements in this catch clause.” So, the computer executed the statements inside the third catch clause. Then the computer executed the code that comes immediately after all the catch clauses. (See Figure 12-11.) 19_9780470371732-ch12.indd 29419_9780470371732-ch12.indd 294 7/6/11 7:02 PM7/6/11 7:02 PM www.it-ebooks.info 295 Chapter 12: Looking Good When Things Take Unexpected Turns Figure 12-11: An IOException is thrown. try { throw new IOException (); } catch (NumberFormatException e) { out.println("That's not a number."); } catch (OutOfRangeException e) { out.print(numBoxesIn); out.println("? That's impossible!"); } catch (Exception e) { out.print("Something went wrong, "); out.print("but I'm clueless about what "); out.println("it actually was."); } out.println("That's that."); When the computer looks for a matching catch clause, the computer latches on to the topmost clause that fits one of the following descriptions: ✓ The clause’s parameter type is the same as the type of the exception that was thrown. ✓ The clause’s parameter type is a superclass of the exception’s type. If a better match appears farther down the list of catch clauses, that’s just too bad. For instance, imagine that you added a catch clause with a parameter of type NumberTooLargeException to the code in Listing 12-6. Imagine, also, that you put this new catch clause after the catch clause with parameter of type OutOfRangeException. Then, because NumberTooLargeException is a subclass of the OutOfRangeException class, the code in your new NumberTooLargeException clause would never be executed. That’s just the way the cookie crumbles. Java 7 and the multi-catch clause Starting with Java 7, you can catch more than one kind of exception in a single catch clause. For example, in a particular inventory pro- gram, you might not want to distinguish between the throwing of a NumberFormatException and your own OutOfRangeException. In that case, you can rewrite part of Listing 12-6 as follows: 19_9780470371732-ch12.indd 29519_9780470371732-ch12.indd 295 7/6/11 7:02 PM7/6/11 7:02 PM www.it-ebooks.info 296 Part IV: Savvy Java Techniques try { int numBoxes = Integer.parseInt(numBoxesIn); if (numBoxes < 0) { throw new OutOfRangeException(); } if (numBoxes > 1000) { throw new NumberTooLargeException(); } out.print(“The value is “); out.println( currency.format(numBoxes * boxPrice)); } catch (NumberFormatException | OutOfRangeException e) { out.print(numBoxesIn); out.println(“? That’s impossible!”); } catch (Exception e) { out.print(“Something went wrong, “); out.print(“but I’m clueless about what “); out.println(“it actually was.”); } The pipe symbol, |, tells Java 7 to catch either a NumberFormatException or an OutOfRangeException. If you throw an exception of either type, the program displays the value of numBoxesIn followed by the text ? That’s impossible! If you throw an exception that is neither a NumberFormatException nor an OutOfRangeException, the program jumps to the last catch clause and displays Something went wrong, but I’m clueless . . . Throwing caution to the wind Are you one of those obsessive-compulsive types? Do you like to catch every possible exception before the exception can possibly crash your program? Well, watch out. Java doesn’t let you become paranoid. You can’t catch an exception if the exception has no chance of being thrown. Consider the following code. The code has a very innocent i++ statement inside a try clause. That’s fair enough. But then the code’s catch clause is pretending to catch an IOException. 19_9780470371732-ch12.indd 29619_9780470371732-ch12.indd 296 7/6/11 7:02 PM7/6/11 7:02 PM www.it-ebooks.info 297 Chapter 12: Looking Good When Things Take Unexpected Turns // Bad code! try { i++; } catch (IOException e) { e.printStackTrace(); } Who is this catch clause trying to impress? A statement like i++ doesn’t do any input or output. The code inside the try clause can’t possibly throw an IOException. So the compiler comes back and says, “Hey, catch clause. Get real. Get off your high horse.” Well, to be a bit more precise, the com- piler’s reprimand reads as follows: exception java.io.IOException is never thrown in body of corresponding try statement Doing useful things So far, each example in this chapter catches an exception, prints a “bad input” message, and then closes up shop. Wouldn’t it be nice to see a pro- gram that actually carries on after an exception has been caught? Well, it’s time for something nice. Listing 12-7 has a try-catch statement inside a loop. The loop keeps running until the user types something sensible. Listing 12-7: Keep Pluggin’ Along import static java.lang.System.out; import java.util.Scanner; import java.text.NumberFormat; class InventoryLoop { public static void main(String args[]) { final double boxPrice = 3.25; boolean gotGoodInput = false; Scanner keyboard = new Scanner(System.in); NumberFormat currency = NumberFormat.getCurrencyInstance(); do { out.print(“How many boxes do we have? “); String numBoxesIn = keyboard.next(); (continued) 19_9780470371732-ch12.indd 29719_9780470371732-ch12.indd 297 7/6/11 7:02 PM7/6/11 7:02 PM www.it-ebooks.info 298 Part IV: Savvy Java Techniques Listing 12-7 (continued) try { int numBoxes = Integer.parseInt(numBoxesIn); out.print(“The value is “); out.println (currency.format(numBoxes * boxPrice)); gotGoodInput = true; } catch (NumberFormatException e) { out.println(); out.println(“That’s not a number.”); } } while (!gotGoodInput); out.println(“That’s that.”); } } Figure 12-12 shows a run of the code from Listing 12-7. In the first three attempts, the user types just about everything except a valid whole number. At last, the fourth attempt is a success. The user types 3, and the computer leaves the loop. Figure 12-12: A run of the code in Listing 12-7. Our friends, the good exceptions A rumor is going around that Java exceptions always come from unwanted, erroneous situations. Although there’s some truth to this rumor, the rumor isn’t entirely accurate. Occasionally, an exception arises from a normal, expected occurrence. Take, for instance, the detection of the end of a file. The following code makes a copy of a file: try { while (true) { dataOut.writeByte(dataIn.readByte()); } } catch (EOFException e) { numFilesCopied = 1; } 19_9780470371732-ch12.indd 29819_9780470371732-ch12.indd 298 7/6/11 7:02 PM7/6/11 7:02 PM www.it-ebooks.info 299 Chapter 12: Looking Good When Things Take Unexpected Turns To copy bytes from dataIn to dataOut, you just go into a while loop. With its true condition, the while loop is seemingly endless. But eventually, you reach the end of the dataIn file. When this happens, the readByte method throws an EOFException (an end-of-file exception). The throwing of this exception sends the computer out of the try clause and out of the while loop. From there, you do whatever you want to do in the catch clause and then proceed with normal processing. Handle an Exception or Pass the Buck So you’re getting to know Java, hey? What? You say you’re all the way up to Chapter 12? I’m impressed. You must be a hard worker. But remember, all work and no play. . . . So, how about taking a break? A little nap could do you a world of good. Is ten seconds okay? Or is that too long? Better make it five seconds. Listing 12-8 has a program that’s supposed to pause its execution for five seconds. The problem is that the program in Listing 12-8 is incorrect. Take a look at Listing 12-8 for a minute, and then I’ll tell you what’s wrong with it. Listing 12-8: An Incorrect Program /* * This code does not compile. */ import static java.lang.System.out; class NoSleepForTheWeary { public static void main(String args[]) { out.print(“Excuse me while I nap “); out.println(“for just five seconds...”); takeANap(); out.println(“Ah, that was refreshing.”); } static void takeANap() { Thread.sleep(5000); } } 19_9780470371732-ch12.indd 29919_9780470371732-ch12.indd 299 7/6/11 7:02 PM7/6/11 7:02 PM www.it-ebooks.info 300 Part IV: Savvy Java Techniques The strategy in Listing 12-8 isn’t bad. The idea is to call the sleep method, which is defined in the Java API. This sleep method belongs to the API Thread class. When you call the sleep method, the number that you feed it is a number of milliseconds. So, Thread.sleep(5000) means pause for five seconds. The problem is that the code inside the sleep method can throw an excep- tion. This kind of exception is an instance of the InterruptedException class. When you try to compile the code in Listing 12-8, you get a message such as unreported exception java.lang.InterruptedException; must be caught or declared to be thrown Maybe the message reads Unhandled exception type InterruptedException One way or another, the message is unwelcome. For the purpose of understanding exceptions in general, you don’t need to know exactly what an InterruptedException is. All you really have to know is that a call to Thread.sleep can throw one of these InterruptedException objects. But if you’re really curious, an InterruptedException is thrown when some code interrupts some other code’s sleep. Imagine that you have two pieces of code running at the same time. One piece of code calls the Thread.sleep method. At the same time, another piece of code calls the interrupt method. By call- ing the interrupt method, the second piece of code brings the first code’s Thread.sleep method to a screeching halt. The Thread.sleep method responds by spitting out an InterruptedException. Now, the Java programming language has two different kinds of exceptions. They’re called checked and unchecked exceptions: ✓ The potential throwing of a checked exception must be acknowledged in the code. ✓ The potential throwing of an unchecked exception doesn’t need to be acknowledged in the code. An InterruptedException is one of Java’s checked exception types. When you call a method that has the potential to throw an InterruptedException, you need to acknowledge that exception in the code. 19_9780470371732-ch12.indd 30019_9780470371732-ch12.indd 300 7/6/11 7:02 PM7/6/11 7:02 PM www.it-ebooks.info 301 Chapter 12: Looking Good When Things Take Unexpected Turns Now, when I say that an exception is acknowledged in the code, what do I really mean? // The author wishes to thank that InterruptedException, // without which this code could not have been written. No, that’s not what it means to be acknowledged in the code. Acknowledging an exception in the code means one of two things: ✓ The statements (including method calls) that can throw the exception are inside a try clause. That try clause has a catch clause with a matching exception type in its parameter list. ✓ The statements (including method calls) that can throw the exception are inside a method that has a throws clause in its header. The throws clause contains a matching exception type. If you’re confused by the wording of these two bullets, don’t worry. The next two listings illustrate the points made in the bullets. In Listing 12-9, the method call that can throw an InterruptedException is inside a try clause. That try clause has a catch clause with exception type InterruptedException. Listing 12-9: Acknowledging with a try-catch Statement import static java.lang.System.out; class GoodNightsSleepA { public static void main(String args[]) { out.print(“Excuse me while I nap “); out.println(“for just five seconds...”); takeANap(); out.println(“Ah, that was refreshing.”); } static void takeANap() { try { Thread.sleep(5000); } catch (InterruptedException e) { out.println(“Hey, who woke me up?”); } } } 19_9780470371732-ch12.indd 30119_9780470371732-ch12.indd 301 7/6/11 7:02 PM7/6/11 7:02 PM www.it-ebooks.info 302 Part IV: Savvy Java Techniques It’s my custom, at this point in a section, to remind you that a run of Listing Such-and-Such is shown in Figure So-and-So. But the problem here is that Figure 12-13 doesn’t do justice to the code in Listing 12-9. When you run the program in Listing 12-9, the computer displays Excuse me while I nap for just five seconds, pauses for five seconds, and then displays Ah, that was refreshing. The code works because the call to the sleep method, which can throw an InterruptedException, is inside a try clause. That try clause has a catch clause whose exception is of type InterruptedException. Figure 12-13: There’s a five-second pause before the “Ah” line. So much for acknowledging an exception with a try-catch statement. You can acknowledge an exception another way, shown in Listing 12-10. Listing 12-10: Acknowledging with throws import static java.lang.System.out; class GoodNightsSleepB { public static void main(String args[]) { out.print(“Excuse me while I nap “); out.println(“for just five seconds...”); try { takeANap(); } catch (InterruptedException e) { out.println(“Hey, who woke me up?”); } out.println(“Ah, that was refreshing.”); } static void takeANap() throws InterruptedException { Thread.sleep(5000); } } 19_9780470371732-ch12.indd 30219_9780470371732-ch12.indd 302 7/6/11 7:02 PM7/6/11 7:02 PM www.it-ebooks.info 303 Chapter 12: Looking Good When Things Take Unexpected Turns To see a run of the code in Listing 12-10, refer to Figure 12-13. Once again, Figure 12-13 fails to capture the true essence of the run, but that’s okay. Just remember that in Figure 12-13, the computer pauses for five seconds before it displays Ah, that was refreshing. The important part of Listing 12-10 is in the takeANap method’s header. That header ends with throws InterruptedException. By announcing that it throws an InterruptedException, method takeANap passes the buck. What this throws clause really says is, “I realize that a statement inside this method has the potential to throw an InterruptedException, but I’m not acknowledging the exception in a try-catch statement. Java compiler, please don’t bug me about this. Instead of having a try-catch statement, I’m passing the responsibility for acknowledging the exception to the main method (the method that called the takeANap method).” Indeed, in the main method, the call to takeANap is inside a try clause. That try clause has a catch clause with a parameter of type InterruptedException. So everything is okay. Method takeANap passes the responsibility to the main method, and the main method accepts the responsibility with an appropriate try-catch statement. Everybody’s happy. Even the Java compiler is happy. To better understand the throws clause, imagine a volleyball game in which the volleyball is an exception. When a player on the other team serves, that player is throwing the exception. The ball crosses the net and comes right to you. If you pound the ball back across the net, you’re catching the exception. But if you pass the ball to another player, you’re using the throws clause. In essence, you’re saying, “Here, other player. You deal with this exception.” A statement in a method can throw an exception that’s not matched by a catch clause. This includes situations in which the statement throwing the exception isn’t even inside a try block. When this happens, execution of the program jumps out of the method that contains the offending statement. Execution jumps back to whatever code called the method in the first place. A method can name more than one exception type in its throws clause. Just use commas to separate the names of the exception types, as in the following example: throws InterruptedException, IOException, ArithmeticException The Java API has hundreds of exception types. Several of them are sub- classes of the RuntimeException class. Anything that’s a subclass of RuntimeException (or a sub-subclass, sub-sub-subclass, and so on) is unchecked. Any exception that’s not a descendent of RuntimeException 19_9780470371732-ch12.indd 30319_9780470371732-ch12.indd 303 7/6/11 7:02 PM7/6/11 7:02 PM www.it-ebooks.info 304 Part IV: Savvy Java Techniques is checked. The unchecked exceptions include things that would be hard for the computer to predict. Such things include the NumberFormatException (of Listings 12-2, 12-4, and others), the ArithmeticException, the IndexOutOfBoundsException, the infamous NullPointerException, and many others. When you write Java code, much of your code is suscep- tible to these exceptions, but enclosing the code in try clauses (or passing the buck with throws clauses) is completely optional. The Java API also has its share of checked exceptions. The computer can readily detect exceptions of this kind. So Java insists that, for an exception of this kind, any potential exception-throwing statement is acknowledged with either a try statement or a throws clause. Java’s checked excep- tions include the InterruptedException (Listings 12-9 and 12-10), the IOException, the SQLException, and a gang of other interesting exceptions. Finishing the Job with a finally Clause Once upon a time, I was a young fellow, living with my parents in Philadelphia, just starting to drive a car. I was heading toward a friend’s house and thinking about who knows what when another car came from nowhere and bashed my car’s passenger door. This kind of thing is called a RunARedLightException. Anyway, both cars were still drivable, and we were right in the middle of a busy intersection. To avoid causing a traffic jam, we both pulled over to the nearest curb. I fumbled for my driver’s license (which had a very young picture of me on it), and opened the door to get out of my car. And that’s when the second accident happened. As I was getting out of my car, a city bus was coming by. The bus hit me and rolled me against my car a few times. This kind of thing is called a DealWithLawyersException. The truth is that everything came out just fine. I was bruised but not bat- tered. My parents paid for the damage to the car, so I never suffered any financial consequences. (I managed to pass on the financial burden by putting the RunARedLightException into my throws clause.) This incident helps to explain why I think the way I do about exception handling. In particular, I wonder, “What happens if, while the computer is recovering from one exception, a second exception is thrown?” After all, the statements inside a catch clause aren’t immune to calamities. 19_9780470371732-ch12.indd 30419_9780470371732-ch12.indd 304 7/6/11 7:02 PM7/6/11 7:02 PM www.it-ebooks.info 305 Chapter 12: Looking Good When Things Take Unexpected Turns Well, the answer to this question is anything but simple. For starters, you can put a try statement inside a catch clause. This protects you against unexpected, potentially embarrassing incidents that can crop up during the execution of the catch clause. But when you start worrying about cascading exceptions, you open up a very slimy can of worms. The number of scenarios is large, and things can become complicated very quickly. One not-too-complicated thing that you can do is to create a finally clause. Like a catch clause, a finally clause comes after a try clause. The big dif- ference is that the statements in a finally clause are executed whether or not an exception is thrown. The idea is, “No matter what happens, good or bad, execute the statements inside this finally clause.” Listing 12-11 has an example. Listing 12-11: Jumping Around import static java.lang.System.out; class DemoFinally { public static void main(String args[]) { try { doSomething(); } catch (Exception e) { out.println(“Exception caught in main.”); } } static void doSomething() { try { out.println(0 / 0); } catch (Exception e) { out.println( “Exception caught in doSomething.”); out.println(0 / 0); } finally { out.println(“I’ll get printed.”); } out.println(“I won’t get printed.”); } } Normally, when I think about a try statement, I think about the computer recovering from an unpleasant situation. The recovery takes place inside a catch clause, and then the computer marches on to whatever statements come after the try statement. Well, if something goes wrong during execu- tion of a catch clause, this picture can start looking different. 19_9780470371732-ch12.indd 30519_9780470371732-ch12.indd 305 7/6/11 7:02 PM7/6/11 7:02 PM www.it-ebooks.info 306 Part IV: Savvy Java Techniques Listing 12-11 gets a workout in Figure 12-14. First, the main method calls doSomething. Then, the stupid doSomething method goes out of its way to cause trouble. The doSomething method divides 0 by 0, which is illegal and undoable in anyone’s programming language. This foolish action by the doSomething method throws an ArithmeticException, which is caught by the try statement’s one and only catch clause. Figure 12-14: Running the code from Listing 12-11. Inside the catch clause, that lowlife doSomething method divides 0 by 0 again. This time, the statement that does the division isn’t inside a protective try clause. That’s okay, because an ArithmeticException isn’t checked. (It’s one of those RuntimeException subclasses. It’s an exception that doesn’t have to be acknowledged in a try or a throws clause. For details, see the previous section.) Well, checked or not, the throwing of another ArithmeticException causes control to jump out of the doSomething method. But, before leav- ing the doSomething method, the computer executes the try statement’s last will and testament — namely, the statements inside the finally clause. That’s why, in Figure 12-14, you see the words I’ll get printed. Interestingly enough, you don’t see the words I won’t get printed in Figure 12-14. Because the catch clause’s execution throws its own uncaught exception, the computer never makes it down past the try- catch-finally statement. So, the computer goes back to where it left off in the main method. Back in the main method, word of the doSomething method’s ArithmeticException mishaps causes execution to jump into a catch clause. The computer prints Exception caught in main, and then this terrible nightmare of a run is finished. Close Those Files! In the year 4839, the inhabitants of Earth will open a time capsule contain- ing Java For Dummies. They’ll notice that several of the book’s examples possess a fatal flaw. “In Chapter 8, Barry reads from a disk file named 19_9780470371732-ch12.indd 30619_9780470371732-ch12.indd 306 7/6/11 7:02 PM7/6/11 7:02 PM www.it-ebooks.info 307 Chapter 12: Looking Good When Things Take Unexpected Turns EmployeeInfo.txt. His DoPayroll program grabs ahold of this resource (this file that normally lives outside of his DoPayroll program). But his DoPayroll program never releases the resource. In early third millennium terminology, Barry opens a file in the beginning of his program, but doesn’t close the file later in the program.” Barry did this because he didn’t want to burden his readers with details about closing files. For many simple examples, Java closes a program’s files automatically when the program stops running. But in the year 2978, a reader follows Barry’s example and fails to explicitly close files. This oversight causes the Great Robot Blight of 2980, which leads to the failure of the post- post-post-industrial economy and the eventual cancellation of American Idol. “So Barry Burd is responsible for all our problems,” say the Earth’s inhabit- ants in 4839. “Let’s not remove him from his cryogenic freezer.” How to close a file In hopes of seeing the year 4840, I add one line to the code in Listing 8-2. The listing already contains the following statement: Scanner diskScanner = new Scanner(new File(“EmployeeInfo.txt”)); So at the end of the program’s main method, I add diskScanner.close(); Of course, I can add this call to the close method at any point in the pro- gram. My best strategy is to call close immediately after my last use of the EmployeeInfo.txt file. At this point in the book, the people of 4839 will probably say “Barry added this file-closing business as an afterthought. Closing files has nothing to do with the rest of Chapter 12.” But the people of 4839 will be wrong. A try statement with resources The trouble with an ordinary call to the close method is that things can go wrong before Java reaches the close call. Listing 12-12 is almost identical to Listing 8-2. Listing 12-12 has only one additional statement. 19_9780470371732-ch12.indd 30719_9780470371732-ch12.indd 307 7/6/11 7:02 PM7/6/11 7:02 PM www.it-ebooks.info 308 Part IV: Savvy Java Techniques Listing 12-12: Close the File? import java.util.Scanner; import java.io.File; import java.io.IOException; class DoPayroll { public static void main(String args[]) throws IOException { Scanner diskScanner = new Scanner(new File(“EmployeeInfo.txt”)); for (int empNum = 1; empNum <= 3; empNum++) { payOneEmployee(diskScanner); } diskScanner.close(); } static void payOneEmployee(Scanner aScanner) { Employee anEmployee = new Employee(); anEmployee.setName(aScanner.nextLine()); anEmployee.setJobTitle(aScanner.nextLine()); anEmployee.cutCheck(aScanner.nextDouble()); aScanner.nextLine(); } } Listing 12-12 looks nice, but looks are deceiving. If something goes wrong in the middle of executing payOneEmployee, then the program ends abruptly with a stack trace and a big kaboom. The program never reaches the call to diskScanner.close(), and Barry is still in the cryogenic freezer. I can enclose some statements inside a try statement, and I can even add a finally clause, but when my program uses several resources (many files, a database and a file, or whatever) the buildup of try statements becomes very complicated. I can make try statements within catch clauses and all kinds of crazy combinations. But Java 7 has a better way to solve the prob- lem. In Java 7, I can create a try-with-resources statement. Listing 12-13 shows you how. Listing 12-13: Barry’s Redemption import java.util.Scanner; import java.io.File; import java.io.IOException; 19_9780470371732-ch12.indd 30819_9780470371732-ch12.indd 308 7/6/11 7:02 PM7/6/11 7:02 PM www.it-ebooks.info 309 Chapter 12: Looking Good When Things Take Unexpected Turns class DoPayroll { public static void main(String args[]) throws IOException { try (Scanner diskScanner = new Scanner(new File(“EmployeeInfo.txt”))) { for (int empNum = 1; empNum <= 3; empNum++) { payOneEmployee(diskScanner); } } } static void payOneEmployee(Scanner aScanner) { Employee anEmployee = new Employee(); anEmployee.setName(aScanner.nextLine()); anEmployee.setJobTitle(aScanner.nextLine()); anEmployee.cutCheck(aScanner.nextDouble()); aScanner.nextLine(); } } In Listing 12-13, the declaration of diskScanner is in parentheses after the word try. The parenthesized declaration tells Java 7 to close the diskScan- ner automatically after execution of the statements in the try clause. You can declare several resources inside one try statement’s parentheses. When you do, Java 7 closes all the resources automatically after execution of the try clause’s statements. You can add catch clauses and a finally clause if you want. You can access all kinds of resources (files, databases, connec- tions to servers, and others) and have peace of mind knowing that Java will sever the connections automatically. Life is good. 19_9780470371732-ch12.indd 30919_9780470371732-ch12.indd 309 7/6/11 7:02 PM7/6/11 7:02 PM www.it-ebooks.info 310 Part IV: Savvy Java Techniques 19_9780470371732-ch12.indd 31019_9780470371732-ch12.indd 310 7/6/11 7:02 PM7/6/11 7:02 PM www.it-ebooks.info Chapter 13 Sharing Names among the Parts of a Java Program In This Chapter ▶ Hiding names from other classes ▶ Exposing names to other classes ▶ Tweaking your code to find the right middle ground Speaking of private fields and methods (and I do speak about these things in this chapter). . . . I’m eating lunch with some friends of mine at work. “They can read your e-mail,” says one fellow. Another chimes in, “They know every single website that you visit. They know what products you buy, what you eat for dinner, what you wear, what you think. They even know your deepest, darkest secrets. Why, I wouldn’t be surprised if they know when you’re going to die.” A third voice enters the fray. “It’s getting to the point where you can’t blow your nose without someone taking a record of it. I visited a website a few weeks ago, and the page wished me a Happy Birthday. How did they know it was me, and how did they remember that it was my birthday?” “Yeah,” says the first guy. “I have a tag on my car that lets me sail through toll booths. It senses that I’m going through and puts the charge on my credit card automatically. So every month, I get a list from the company showing where I’ve been and when I was there. I’m amazed it doesn’t say who I was visiting and what I did when I got there.” I think quietly to myself. I think about saying, “That’s just a bunch of baloney. Personally, I’d be flattered if my employer, the government, or some big com- pany thought so much of me that they tracked my every move. I have enough trouble getting people’s attention when I really want it. And most agencies 20_9780470371732-ch13.indd 31120_9780470371732-ch13.indd 311 7/6/11 7:01 PM7/6/11 7:01 PM www.it-ebooks.info 312 Part IV: Savvy Java Techniques that keep logs of all my purchasing and viewing habits can’t even spell my name right when they send me junk mail. ‘Hello, this is a courtesy call for Larry Burg. Is Mr. Burg at home?’ Spying on people is really boring. I can just see the headline on the front page of The Times: ‘Author of Java For Dummies Wears His Undershirt Inside Out!’ Big deal!” So I think for a few seconds, and then I say, “They’re out to get us. TV cameras! That’s the next big thing — TV cameras everywhere.” Access Modifiers If you’ve read this far into Java For Dummies, 5th Edition, you probably know one thing: Object-oriented programming is big on hiding details. Programmers who write one piece of code shouldn’t tinker with the details inside another programmer’s code. It’s not a matter of security and secrecy. It’s a matter of modularity. When you hide details, you keep the intricacies inside one piece of code from being twisted and broken by another piece of code. Your code comes in nice, discrete, manageable lumps. You keep com- plexity to a minimum. You make fewer mistakes. You save money. You help promote world peace. Other chapters have plenty of examples of the use of private fields. When a field is declared private, it’s hidden from all outside meddling. This hiding enhances modularity, minimizes complexity, and so on. Elsewhere in the annals of Java For Dummies, 5th Edition, are examples of things that are declared public. Just like a public celebrity, a field that’s declared public is left wide open. Plenty of people probably know what kind of toothpaste Elvis used, and any programmer can reference a public field, even a field that’s not named Elvis. In Java, the words public and private are called access modifiers. No doubt you’ve seen fields and methods without access modifiers in their declara- tions. A method or field of this kind is said to have default access. Many exam- ples in this book use default access without making a big fuss about it. That’s okay in some chapters, but not in this chapter. In this chapter, I describe the nitty-gritty details about default access. And you can find out about yet another access modifier that isn’t used in any example before this chapter. (At least, I don’t remember using it in any ear- lier examples.) It’s the protected access modifier. Yes, this chapter covers some of the slimy, grimy facts about protected access. 20_9780470371732-ch13.indd 31220_9780470371732-ch13.indd 312 7/6/11 7:01 PM7/6/11 7:01 PM www.it-ebooks.info 313 Chapter 13: Sharing Names among the Parts of a Java Program Classes, Access, and Multipart Programs With this topic, you can become all tangled up in terminology, so you need to get some basics out of the way. (Most of the terminology that you need comes from Chapter 10, but it’s worth reviewing at the start of this chapter.) Here’s a fake piece of Java code: class MyClass { int myField; //a field // (a member) void myMethod() { //a method (another member) int myOtherField; //a method-local variable // (NOT a member) } } The comments on the right side of the code tell the whole story. Two kinds of variables exist here — fields and method-local variables. This chapter isn’t about method-local variables. It’s about methods and fields. Believe me, carrying around the phrase “methods and fields” wherever you go isn’t easy. It’s much better to give these things one name and be done with it. That’s why both methods and fields are called members of a class. Members versus classes At this point, you make an important distinction. Think about Java’s public keyword. As you may already know from earlier chapters, you can put public in front of a member. For example, you can write public static void main(String args[]) { or public amountInAccount = 50.22; These uses of the public keyword come as no big surprise. What you may not already know is that you can put the public keyword in front of a class. For example, you can write public class Drawing { // Your code goes here } 20_9780470371732-ch13.indd 31320_9780470371732-ch13.indd 313 7/6/11 7:01 PM7/6/11 7:01 PM www.it-ebooks.info 314 Part IV: Savvy Java Techniques In Java, the public keyword has two slightly different meanings — one meaning for members and another meaning for classes. Most of this chapter deals with the meaning of public (and other such keywords) for members. The last part of this chapter (appropriately titled “Access Modifiers for Java Classes”) deals with the meaning for classes. Access modifiers for members Sure, this section is about members. But that doesn’t mean that you can ignore Java classes. Members or not, the Java class is still where all the action takes place. Each field is declared in a particular class, belongs to that class, and is a member of that class. The same is true of methods. Each method is declared in a particular class, belongs to that class, and is a member of that class. Can you use a certain member name in a particular place in your code? To begin answering the question, check whether that place is inside or outside of the member’s class: ✓ If the member is private, only code that’s inside the member’s class can refer directly to that member’s name. class SomeClass { private int myField = 10; } class SomeOtherClass { public static void main(String args[]) { SomeClass someObject = new SomeClass(); //This doesn’t work: System.out.println(someObject.myField); } } ✓ If the member is public, any code can refer directly to that member’s name. class SomeClass { public int myField = 10; } class SomeOtherClass { public static void main(String args[]) { SomeClass someObject = new SomeClass(); //This works: System.out.println(someObject.myField); } } 20_9780470371732-ch13.indd 31420_9780470371732-ch13.indd 314 7/6/11 7:01 PM7/6/11 7:01 PM www.it-ebooks.info 315 Chapter 13: Sharing Names among the Parts of a Java Program Figures 13-1 through 13-3 illustrate the ideas in a slightly different way. Figure 13-1: Several classes and their subclasses. class1 classA classX class2 classB classY class3 classC classZ extends class1 extends classA extends classX extends class2 extends classB extends classY Figure 13-2: The range of code in which a public field or method can be used (shaded). class1 classA classX class2 classB public field classY class3 classC classZ extends class1 extends classA extends classX extends class2 extends classB extends classY 20_9780470371732-ch13.indd 31520_9780470371732-ch13.indd 315 7/6/11 7:01 PM7/6/11 7:01 PM www.it-ebooks.info 316 Part IV: Savvy Java Techniques Figure 13-3: The range of code in which a private field or method can be used (shaded). class1 classA classX class2 classB private field classY class3 classC classZ extends class1 extends classA extends classX extends class2 extends classB extends classY Putting a drawing on a frame To make this business about access modifiers clear, you need an example or two. In this chapter’s first example, almost everything is public. With public access, you don’t have to worry about who can use what. The code for this first example comes in several parts. The first part, which is in Listing 13-1, displays an ArtFrame. On the face of the ArtFrame is a Drawing. If all the right pieces are in place, running the code of Listing 13-1 displays a window like the one shown in Figure 13-4. Listing 13-1: Displaying a Frame import com.burdbrain.drawings.Drawing; import com.burdbrain.frames.ArtFrame; class ShowFrame { public static void main(String args[]) { ArtFrame artFrame = new ArtFrame(new Drawing()); artFrame.setSize(200, 100); artFrame.setVisible(true); } } 20_9780470371732-ch13.indd 31620_9780470371732-ch13.indd 316 7/6/11 7:01 PM7/6/11 7:01 PM www.it-ebooks.info 317 Chapter 13: Sharing Names among the Parts of a Java Program Figure 13-4: An ArtFrame. The code in Listing 13-1 creates a new ArtFrame instance. You may suspect that ArtFrame is a subclass of a Java frame class, and that’s certainly the case. Chapter 9 says that Java frames are, by default, invisible. So, in Listing 13-1, to make the ArtFrame instance visible, you call the setVisible method. Now notice that Listing 13-1 starts with two import declarations. The first import declaration allows you to abbreviate the name Drawing from the com.burdbrain.drawings package. The second import declaration allows you to abbreviate the name ArtFrame from com.burdbrain.frames. For a review of import declarations, see Chapter 4. The detective in you may be thinking, “He must have written more code (code that I don’t see here) and put that code in packages that he named com.burdbrain.drawings and com.burdbrain.frames.” And, indeed, you are correct. To make Listing 13-1 work, I create something called a Drawing, and I’m putting all my drawings in the com.burdbrain.drawings package. I also need an ArtFrame class, and I’m putting all such classes in my com.burdbrain.frames package. So, really, what’s a Drawing? Well, if you’re so anxious to know, look at Listing 13-2. Listing 13-2: The Drawing Class package com.burdbrain.drawings; import java.awt.Graphics; public class Drawing { public int x = 40, y = 40, width = 40, height = 40; public void paint(Graphics g) { g.drawOval(x, y, width, height); } } 20_9780470371732-ch13.indd 31720_9780470371732-ch13.indd 317 7/6/11 7:01 PM7/6/11 7:01 PM www.it-ebooks.info 318 Part IV: Savvy Java Techniques The code for the Drawing class is pretty slim. It contains a few int fields and a paint method. That’s all. Well, when I create my classes, I try to keep ’em lean. Anyway, here are some notes about my Drawing class: ✓ At the top of the code is a package declaration. Lo and behold! I’ve made my Drawing class belong to a package — the com.burdbrain. drawings package. I didn’t pull this package name out of the air. The convention (handed down by the people who created Java) says that you start a package name by reversing the parts of your domain name, so I reversed burdbrain.com. Then, you add one or more descriptive names, separated by dots. I added the name drawings because I intend to put all my drawing goodies in this package. ✓ The Drawing class is public. A public class is vulnerable to intrusion from the outside. So in general, I avoid plastering the public key- word in front of any old class. But in Listing 13-2, I have to declare my Drawing class to be public. If I don’t, classes that aren’t in the com. burdbrain.drawings package can’t use the goodies in Listing 13-2. In particular, the line ArtFrame artFrame = new ArtFrame(new Drawing()); in Listing 13-1 is illegal unless the Drawing class is public. For more information on public and nonpublic classes, see the section entitled “Access Modifiers for Java Classes,” later in this chapter. ✓ The code has a paint method. This paint method uses a standard Java trick for making things appear onscreen. The parameter g in Listing 13-2 is called a graphics buffer. To make things appear, all you do is draw on this graphics buffer, and the buffer is eventually rendered on the computer screen. Here’s a little more detail: In Listing 13-2, the paint method takes a g parameter. This g parameter refers to an instance of the java.awt. Graphics class. Because a Graphics instance is a buffer, the things that you put onto this buffer are eventually displayed on the screen. Like all instances of the java.awt.Graphics class, this buffer has several drawing methods — one of them being drawOval. When you call drawOval, you specify a starting position (x pixels from the left edge of the frame and y pixels from the top of the frame). You also specify an oval size by putting numbers of pixels in the width and height parameters. Calling the drawOval method puts a little round thing into the Graphics buffer. That Graphics buffer, round thing and all, is displayed onscreen. 20_9780470371732-ch13.indd 31820_9780470371732-ch13.indd 318 7/6/11 7:01 PM7/6/11 7:01 PM www.it-ebooks.info 319 Chapter 13: Sharing Names among the Parts of a Java Program Directory structure The code in Listing 13-2 belongs to the com.burdbrain.drawings package. When you put a class into a package, you have to create a directory structure that mirrors the name of the package. To house code that’s in the com.burdbrain.drawings package, you have to have three directories: a com directory, a subdirectory of com named burdbrain, and a subdirectory of burdbrain named drawings. The overall directory structure is shown in Figure 13-5. If you don’t have your code in the appropriate directories, you get a repul- sive and disgusting NoClassDefFoundError. Believe me, this error is never fun to get. When you see this error, you don’t have any clues to help you figure out where the missing class is or where the compiler expects to find it. If you stay calm, you can figure out all this stuff on your own. If you panic, you’ll be poking around for hours. As a seasoned Java programmer, I can remember plenty of scraped knuckles that came from this heinous NoClassDefFoundError. Figure 13-5: The files and directories in your project. The directory that houses this project’s code ShowFrame (Listing 13-1) in unnamed package Drawing (Listing 13-2) in package com.burdbrain.drawings ArtFrame (Listing 13-3) in package com.burdbrain.frames com burdbrain drawings frames 20_9780470371732-ch13.indd 31920_9780470371732-ch13.indd 319 7/6/11 7:01 PM7/6/11 7:01 PM www.it-ebooks.info 320 Part IV: Savvy Java Techniques Making a frame This chapter’s first three listings develop one multipart example. This section has the last of three pieces in that example. This last piece isn’t crucial for the understanding of access modifiers, which is the main topic of this chap- ter. So, if you want to skip past the explanation of Listing 13-3, you can do so without losing the chapter’s thread. On the other hand, if you want to know more about the Java Swing classes, read on. Listing 13-3: The ArtFrame Class package com.burdbrain.frames; import java.awt.Graphics; import javax.swing.JFrame; import com.burdbrain.drawings.Drawing; Looking for files in all the right places You try to compile the program in Listing 13-1. The Java compiler pokes through the code and stumbles upon some missing pieces. First there’s this thing called an ArtFrame. Then you have this Drawing business. Listing 13-1 defines a class named ShowFrame, not ArtFrame or Drawing. So where does the compiler go for information about the ArtFrame and Drawing classes? If you stop to think about it, the problem can be daunting. Should the compiler go search- ing all over your hard drive for files named ArtFrame.java or Drawing.class? How large is your new hard drive? 500GB? 750GB? 6,000,000GB? And what about refer- ences to files on network drives? The search space is potentially unlimited. What if the com- piler eventually resolves all these issues? Then you try to run your code, and the Java virtual machine (JVM) starts searching all over again. (For info on the Java virtual machine, see Chapter 2.) To tame this problem, Java defines some- thing called a CLASSPATH. The CLASSPATH is a list of places where the compiler and the JVM look for code. There are several ways to set a CLASSPATH. Some programmers create a new CLASSPATH each time they run a Java program. Others create a system- wide CLASSPATH variable. (If you’re famil- iar with the PATH variable on Windows and UNIX computers, you may already know how this stuff works.) One way or another, the compiler and the JVM need a list of places to look for code. Without such a list, these Java tools don’t look anywhere. They don’t find classes like ArtFrame or Drawing. You get a cannot find symbol message or a NoClassDefFoundError message, and you’re very unhappy. 20_9780470371732-ch13.indd 32020_9780470371732-ch13.indd 320 7/6/11 7:01 PM7/6/11 7:01 PM www.it-ebooks.info 321 Chapter 13: Sharing Names among the Parts of a Java Program public class ArtFrame extends JFrame { private static final long serialVersionUID = 1L; Drawing drawing; public ArtFrame(Drawing drawing) { this.drawing = drawing; setTitle(“Abstract Art”); setDefaultCloseOperation(EXIT_ON_CLOSE); } public void paint(Graphics g) { drawing.paint(g); } } Listing 13-3 has all the gadgetry that you need for putting a drawing on a Java frame. The code uses several names from the Java API (Application Programming Interface). I explain most of these names in Chapters 9 and 10. The only new name in Listing 13-3 is the word paint. The paint method in Listing 13-3 defers to another paint method — the paint method belonging to a Drawing object. The ArtFrame object creates a floating window on your computer screen. What’s drawn in that floating window depends on whatever Drawing object was passed to the ArtFrame constructor. If you trace the flow of Listings 13-1 through 13-3, you may notice something peculiar. The paint method in Listing 13-3 never seems to be called. Well, for many of Java’s window-making components, you just declare a paint method and let the method sit there quietly in the code. When the program runs, the computer calls the paint method automatically. That’s what happens with javax.swing.JFrame objects. In Listing 13-3, the frame’s paint method is called from behind the scenes. Then, the frame’s paint method calls the Drawing object’s paint method, which in turn, draws an oval on the frame. That’s how you get the stuff you see in Figure 13-4. Sneaking Away from the Original Code Your preferred software vendor, Burd Brain Consulting, has sold you two files — Drawing.class and ArtFrame.class. As a customer, you can’t see the code inside the files Drawing.java and ArtFrame.java. So, you have to live with whatever happens to be inside these two files. (If only you’d 20_9780470371732-ch13.indd 32120_9780470371732-ch13.indd 321 7/6/11 7:01 PM7/6/11 7:01 PM www.it-ebooks.info 322 Part IV: Savvy Java Techniques purchased a copy of Java For Dummies, 5th Edition, which has the code for these files in Listings 13-2 and 13-3!) Anyway, you want to tweak the way the oval looks in Figure 13-4 so that it’s a bit wider. To do this, you create a sub- class of the Drawing class — DrawingWide — and put it in Listing 13-4. Listing 13-4: A Subclass of the Drawing Class import java.awt.Graphics; import com.burdbrain.drawings.Drawing; public class DrawingWide extends Drawing { int width = 100, height = 30; public void paint(Graphics g) { g.drawOval(x, y, width, height); } } To make use of the code in Listing 13-4, you remember to change one of the lines in Listing 13-1. You change the line to ArtFrame artFrame = new ArtFrame(new DrawingWide()); In Listing 13-1 you can also remove the com.burdbrain.drawings. Drawing import declaration because you no longer need it. Listing 13-4 defines a subclass of the original Drawing class. In that subclass, you override the original class’s width and height fields and the original class’s paint method. The frame that you get is shown in Figure 13-6. Figure 13-6: Another art frame. In passing, you may notice that the code in Listing 13-4 doesn’t start with a package declaration. This means that your whole collection of files comes from the following three packages: ✓ The com.burdbrain.drawings package. The original Drawing class from Listing 13-2 is in this package. 20_9780470371732-ch13.indd 32220_9780470371732-ch13.indd 322 7/6/11 7:01 PM7/6/11 7:01 PM www.it-ebooks.info 323 Chapter 13: Sharing Names among the Parts of a Java Program ✓ The com.burdbrain.frames package. The ArtFrame class from Listing 13-3 is in this package. ✓ An ever-present, unnamed package. In Java, when you don’t start a file with a package declaration, all the code in that file goes into one big, unnamed package. Listings 13-1 and 13-4 are in the same unnamed pack- age. In fact, most of the listings from the first 12 chapters of this book are in Java’s unnamed package. At this point, your project has two drawing classes — the original Drawing class and your new DrawingWide class. Similar as these classes may be, they live in two separate packages. That’s not surprising. The Drawing class, developed by your friends at Burd Brain Consulting, lives in a package whose name starts with com.burdbrain. But you developed DrawingWide on your own, so you shouldn’t put it in a com.burdbrain package. The most sensible thing to do is to put it in one of your own packages, such as com.myhomedomain.drawings; but putting your class in the unnamed package will do for now. One way or another, your DrawingWide subclass compiles and runs as planned. You go home, beaming with the confidence of having written useful, working code. Default access If you’re reading these paragraphs in order, you know that the last example ends very happily. The code in Listing 13-4 runs like a charm. Everyone, including my wonderful editor, Paul Levesque, is happy. But, wait! Do you ever wonder what life would be like if you hadn’t chosen that particular career, dated that certain someone, or read that certain For Dummies book? In this section, I roll back the clock a bit to show you what would have happened if one word had been omitted from the code in Listing 13-2. Dealing with different versions of a program can give you vertigo, so I start this discussion by describing what you have. First, you have a Drawing class. In this class, the fields aren’t declared to be public and have the default access. The Drawing class lives in the com.burdbrain.drawings pack- age. (See Listing 13-5.) 20_9780470371732-ch13.indd 32320_9780470371732-ch13.indd 323 7/6/11 7:01 PM7/6/11 7:01 PM www.it-ebooks.info 324 Part IV: Savvy Java Techniques Listing 13-5: Fields with Default Access package com.burdbrain.drawings; import java.awt.Graphics; public class Drawing { int x = 40, y = 40, width = 40, height = 40; public void paint(Graphics g) { g.drawOval(x, y, width, height); } } Next, you have a DrawingWide subclass (copied, for your convenience, in Listing 13-6). The DrawingWide class is in Java’s unnamed package. Listing 13-6: A Failed Attempt to Create a Subclass import com.burdbrain.drawings.*; import java.awt.Graphics; public class DrawingWide extends Drawing { int width = 100, height = 30; public void paint(Graphics g) { g.drawOval(x, y, width, height); } } The trouble is that the whole thing falls apart at the seams. The code in Listing 13-6 doesn’t compile. Instead, you get the following error messages: x is not public in com.burdbrain.drawings.Drawing; cannot be accessed from outside package y is not public in com.burdbrain.drawings.Drawing; cannot be accessed from outside package The code doesn’t compile, because a field that has default access can’t be directly referenced outside its package — not even by a subclass of the class containing the field. The same holds true for any methods that have default access. A class’s fields and methods are called members of the class. The rules for access — default and otherwise — apply to all members of classes. The access rules that I describe in this chapter don’t apply to method- local variables. A method-local variable can be accessed only within its own method. 20_9780470371732-ch13.indd 32420_9780470371732-ch13.indd 324 7/6/11 7:01 PM7/6/11 7:01 PM www.it-ebooks.info 325 Chapter 13: Sharing Names among the Parts of a Java Program For the rundown on method-local variables, see Chapter 10. In Java, the default access for a member of a class is package-wide access. A member declared without the word public, private, or protected in front of it is accessible in the package in which its class resides. Figures 13-7 and 13-8 illustrate the point. The names of packages, with all their dots and subparts, can be slightly mis- leading. For instance, when you write a program that responds to button clicks, you normally import classes from two separate packages. On one line, you may have import java.awt.*;. On another line, you may have import java.awt.event.*;. Importing all classes from the java. awt package doesn’t automatically import classes from the java.awt. event package. Figure 13-7: Packages cut across subclass hierarchies. class1 classA classX class2 classB classY class3 Legend: classC classZ extends class1 extends classA extends classX extends class2 extends classB extends classY Another package A package Yet another package Figure 13-8: The range of code in which a default field or method can be used (shaded). class1 classA classX class2 classB classY class3 classC classZ extends class1 extends classA extends classX extends class2 extends classB extends classY field Legend: Another package A package Yet another package 20_9780470371732-ch13.indd 32520_9780470371732-ch13.indd 325 7/6/11 7:01 PM7/6/11 7:01 PM www.it-ebooks.info 326 Part IV: Savvy Java Techniques Crawling back into the package I love getting things in the mail. At worst, it’s junk mail that I can throw right into the trash. At best, it’s something I can use, a new toy, or something somebody sent especially for me. Well, today is my lucky day. Somebody from Burd Brain Consulting sent a subclass of the Drawing class. It’s essentially the same as the code in Listing 13-6. The only difference is that this new DrawingWideBB class lives inside the com.burdbrain.drawings package. The code is shown in Listing 13-7. To run this code, I have to modify Listing 13-1 with the line ArtFrame artFrame = new ArtFrame(new DrawingWideBB()); Listing 13-7: Yes, Virginia, This Is a Subclass package com.burdbrain.drawings; import java.awt.Graphics; public class DrawingWideBB extends Drawing { int width = 100, height = 30; public void paint(Graphics g) { g.drawOval(x, y, width, height); } } When you run Listing 13-7 alongside the Drawing class in Listing 13-5, everything works just fine. The reason? It’s because Drawing and DrawingWideBB are in the same package. Look back at Figure 13-8 and notice the shaded region that spans across an entire package. The code in the DrawingWideBB class has every right to use the x and y fields, which are defined with default access in the Drawing class, because Drawing and DrawingWideBB are in the same package. To use the DrawingWideBB class in Listing 13-7, you make two changes in Listing 13-1. Change the first import declaration to import com.burd- brain.drawings.DrawingWideBB. Also, change the ArtFrame object’s constructor call to new ArtFrame(new DrawingWideBB(). Protected Access When I was first getting to know Java, I thought the word protected meant nice and secure, or something like that. “Wow, that field is protected. It must be hard to get at.” Well, this notion turned out to be wrong. In Java, a member 20_9780470371732-ch13.indd 32620_9780470371732-ch13.indd 326 7/6/11 7:01 PM7/6/11 7:01 PM www.it-ebooks.info 327 Chapter 13: Sharing Names among the Parts of a Java Program that’s protected is less hidden, less secure, and easier to use than one that has default access. The concept is rather strange. Think of protected access this way. You start with a field that has default access (a field without the word public, private, or protected in its declara- tion). That field can be accessed only inside the package in which it lives. Now add the word protected to the front of the field’s declaration. Suddenly, classes outside that field’s package have some access to the field. You can now reference the field from a subclass (of the class in which the field is declared). You can also reference the field from a sub-subclass, a sub- sub-subclass, and so on. Any descendent class will do. For an example, see Listings 13-8 and 13-9. Listing 13-8: Protected Fields package com.burdbrain.drawings; import java.awt.Graphics; public class Drawing { protected int x = 40, y = 40, width = 40, height = 40; public void paint(Graphics g) { g.drawOval(x, y, width, height); } } Listing 13-9: The Subclass from the Blue Lagoon, Part II import java.awt.Graphics; import com.burdbrain.drawings.Drawing; public class DrawingWide extends Drawing { int width = 100, height = 30; public void paint(Graphics g) { g.drawOval(x, y, width, height); } } Listing 13-8 defines the Drawing class. Listing 13-9 defines DrawingWide, which is a subclass of the Drawing class. In the Drawing class, the x, y, width, and height fields are protected. The DrawingWide class has its own width and height fields, but DrawingWide references the x and y fields that are defined in the parent Drawing class. 20_9780470371732-ch13.indd 32720_9780470371732-ch13.indd 327 7/6/11 7:01 PM7/6/11 7:01 PM www.it-ebooks.info 328 Part IV: Savvy Java Techniques That’s okay even though DrawingWide isn’t in the same package as its parent Drawing class. (The Drawing class is in the com.burdbrain. drawings package; the DrawingWide class is in Java’s great, unnamed pack- age.) It’s okay because the x and y fields are protected in the Drawing class. Compare Figures 13-8 and 13-9. Notice the extra bit of shading in Figure 13-9. A subclass can access a protected member of a class, even if that subclass belongs to some other package. Figure 13-9: The range of code in which a protected field or method can be used (shaded). Legend: Another package A package Yet another package class1 classA classX class2 classB classY class3 classC classZ extends class1 extends classA extends classX extends class2 extends classB extends classY protected field Do you work with a team of programmers? Do people from outside your team use their own team’s package names? If so, when they use your code, they may make subclasses of the classes that you’ve defined. This is where protected access comes in handy. Use protected access when you want people from outside your team to make direct references to your code’s fields or methods. Putting non-subclasses in the same package Those people from Burd Brain Consulting are sending you one piece of soft- ware after another. This time, they’ve sent an alternative to the ShowFrame class — the class in Listing 13-1. This new ShowFrameWideBB class displays a wider oval (how exciting!), but it does this without creating a subclass of the old Drawing class. Instead, the new ShowFrameWideBB code creates a Drawing instance and then changes the value of the instance’s width and height fields. The code is shown in Listing 13-10. 20_9780470371732-ch13.indd 32820_9780470371732-ch13.indd 328 7/6/11 7:01 PM7/6/11 7:01 PM www.it-ebooks.info 329 Chapter 13: Sharing Names among the Parts of a Java Program Listing 13-10: Drawing a Wider Oval package com.burdbrain.drawings; import com.burdbrain.frames.ArtFrame; class ShowFrameWideBB { public static void main(String args[]) { Drawing drawing = new Drawing(); drawing.width = 100; drawing.height = 30; ArtFrame artFrame = new ArtFrame(drawing); artFrame.setSize(200, 100); artFrame.setVisible(true); } } So, here’s the story. This ShowFrameWideBB class in Listing 13-10 is in the same package as the Drawing class (the com.burdbrain.drawings pack- age). But ShowFrameWideBB isn’t a subclass of the Drawing class. Now imagine compiling ShowFrameWideBB with the Drawing class that’s shown in Listing 13-8 — the class with all those protected fields. What happens? Well, everything goes smoothly because a protected member is available in two (somewhat unrelated) places. Look again at Figure 13-9. A protected member is available to subclasses outside the package, but the member is also available to code (subclasses or not) within the member’s package. Listing 13-10 has a main method, which is inside a class, which is in turn inside the com.burdbrain.drawings package. With most Integrated Development Environments (IDEs), you don’t think twice about running a main method that’s in a named package. But if you run programs from the command line, you may need to type a fully qualified class name. For example, to run the code in Listing 13-10, you type java com.burdbrain.drawings. ShowFrameWideBB. The real story about protected access is one step more complicated than the story that I describe in this section. The Java Language Specification mentions a hair-splitting point about code being responsible for an object’s implementa- tion. When you’re first figuring out how to program in Java, don’t worry about this point. Wait until you’ve written many Java programs. Then, when you stumble upon a variable has protected access error message, you can start worrying. Better yet, skip the worrying and take a careful look at the protected access section in the Java Language Specification. 20_9780470371732-ch13.indd 32920_9780470371732-ch13.indd 329 7/6/11 7:01 PM7/6/11 7:01 PM www.it-ebooks.info 330 Part IV: Savvy Java Techniques For info about the Java Language Specification, visit Chapter 3. Access Modifiers for Java Classes Maybe the things that you read about access modifiers for members make you a tad dizzy. After all, member access in Java is a very complicated subject with lots of plot twists and cliffhangers. Well, the dizziness is over. Compared with the saga for fields and methods, the access story for classes is rather simple. A class can be either public or nonpublic. If you see something like public class Drawing you’re looking at the declaration of a public class. But, if you see plain old class ShowFrame the class that’s being declared isn’t public. Public classes If a class is public, you can refer to the class from anywhere in your code. Of course, some restrictions apply. You must obey all the rules in this chapter’s “Directory structure” section. You must also refer to a packaged class prop- erly. For example, in Listing 13-1, you can write import com.burdbrain.drawings.Drawing; import com.burdbrain.frames.ArtFrame; ... ArtFrame artFrame = new ArtFrame(new Drawing()); or you can do without the import declarations and write com.burdbrain.frames.ArtFrame artFrame = new com.burdbrain.frames.ArtFrame (new com.burdbrain.drawings.Drawing()); One way or another, your code must acknowledge that the ArtFrame and Drawing classes are in named packages. 20_9780470371732-ch13.indd 33020_9780470371732-ch13.indd 330 7/6/11 7:01 PM7/6/11 7:01 PM www.it-ebooks.info 331 Chapter 13: Sharing Names among the Parts of a Java Program Nonpublic classes If a class isn’t public, you can refer to the class only from code within the class’s package. I tried it. First, I went back to Listing 13-2 and deleted the word public. I turned public class Drawing into plain old class Drawing, like this: package com.burdbrain.drawings; import java.awt.Graphics; class Drawing { public int x = 40, y = 40, width = 40, height = 40; public void paint(Graphics g) { g.drawOval(x, y, width, height); } } Then I compiled the code in Listing 13-7. Everything was peachy because Listing 13-7 contains the following lines: package com.burdbrain.drawings; public class DrawingWideBB extends Drawing Because both pieces of code are in the same com.burdbrain.drawings package, access from DrawingWideBB back to the nonpublic Drawing class was no problem at all. But then I tried to compile the code in Listing 13-3. The code in Listing 13-3 begins with package com.burdbrain.frames; That code isn’t in the com.burdbrain.drawings package. So when the computer reached the line Drawing drawing; from Listing 13-3, the computer went poof! To be more precise, the computer displayed this message: 20_9780470371732-ch13.indd 33120_9780470371732-ch13.indd 331 7/6/11 7:01 PM7/6/11 7:01 PM www.it-ebooks.info 332 Part IV: Savvy Java Techniques com.burdbrain.drawings.Drawing is not public in com.burdbrain.drawings; cannot be accessed from outside package Well, I guess I got what was coming to me. Things are never as simple as they seem. The rules that I describe in this sec- tion apply to almost every class in this book. But Java has fancy things called inner classes, and inner classes follow a different set of rules. Fortunately, a typical novice programmer has little contact with inner classes. The only inner classes in this book are in Chapter 14 (and a few inner classes disguised as enum types). So for now, you can live very happily with the rules that I describe in this section. 20_9780470371732-ch13.indd 33220_9780470371732-ch13.indd 332 7/6/11 7:01 PM7/6/11 7:01 PM www.it-ebooks.info Chapter 14 Responding to Keystrokes and Mouse Clicks In This Chapter ▶ Creating code to handle mouse clicks (and other such events) ▶ Writing and using a Java interface In the late 1980s, I bought my first mouse. I paid $100 and, because I didn’t really need a mouse, I checked with my wife before buying it. (At the time, my computer ran a hybrid text/windowed environment. Anything that I could do with a mouse, I could just as easily do with the Alt key.) Now it’s the 21st century. The last ten mice that I got were free. Ordinary ones just fall into my lap somehow. A few exotic mice were on sale at the local computer superstore. One cost $10 and came with a $10 rebate. As I write this chapter, I’m using the most recent addition to my collection — an official For Dummies mouse. This yellow and white beauty has a little com- partment filled with water. Instead of a snowy Atlantic City scene, the water surrounds a tiny Dummies Man charm. It’s so cute. It was a present from the folks at Wiley Publishing. Go On . . . Click That Button In previous chapters, I create windows that don’t do much. A typical window displays some information but doesn’t have any interactive elements. Well, the time has come to change all that. This chapter’s first example is a window with a button on it. When the user clicks the button, darn it, something hap- pens. The code is shown in Listing 14-1, and the main method that calls the code in Listing 14-1 is in Listing 14-2. 21_9780470371732-ch14.indd 33321_9780470371732-ch14.indd 333 7/6/11 7:01 PM7/6/11 7:01 PM www.it-ebooks.info 334 Part IV: Savvy Java Techniques Listing 14-1: A Guessing Game import java.awt.FlowLayout; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.util.Random; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JTextField; class GameFrame extends JFrame implements ActionListener { private static final long serialVersionUID = 1L; int randomNumber = new Random().nextInt(10) + 1; int numGuesses = 0; JTextField textField = new JTextField(5); JButton button = new JButton(“Guess”); JLabel label = new JLabel(numGuesses + “ guesses”); public GameFrame() { setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); setLayout(new FlowLayout()); add(textField); add(button); add(label); button.addActionListener(this); pack(); setVisible(true); } @Override public void actionPerformed(ActionEvent e) { String textFieldText = textField.getText(); if (Integer.parseInt(textFieldText)==randomNumber) { button.setEnabled(false); textField.setText(textField.getText() + “ Yes!”); textField.setEnabled(false); } else { textField.setText(“”); textField.requestFocus(); } numGuesses++; String guessWord = (numGuesses == 1) ? “ guess” : “ guesses”; label.setText(numGuesses + guessWord); } } 21_9780470371732-ch14.indd 33421_9780470371732-ch14.indd 334 7/6/11 7:01 PM7/6/11 7:01 PM www.it-ebooks.info 335 Chapter 14: Responding to Keystrokes and Mouse Clicks Listing 14-2: Starting the Guessing Game class ShowGameFrame { public static void main(String args[]) { new GameFrame(); } } Some snapshots from a run of this section’s code are shown in Figures 14-1 and 14-2. In a window, the user plays a guessing game. Behind the scenes, the program chooses a secret number (a number from 1 to 10). Then the program displays a text field and a button. The user types a number in the text field and clicks the button. One of two things happens next: ✓ If the number that the user types in isn’t the same as the secret number, the computer posts the number of guesses made so far. The user gets to make another guess. ✓ If the number that the user types in is the same as the secret number, the text field displays Yes!. Meanwhile, the game is over, so both the text field and the button become disabled. Both components have that gray, washed-out look, and neither component responds to keystrokes or mouse clicks. Figure 14-1: An incorrect guess. Figure 14-2: The correct guess. In Listing 14-1, the code to create the frame, the button, and the text field isn’t earth-shattering. I did similar things in Chapters 9 and 10. The JTextField class is new in this chapter, but a text field isn’t much different from a button or a label. Like so many other components, the JTextField class is defined in the javax.swing package. When you create a new JTextField instance, you can specify a number of columns. In Listing 14-1, I create a text field that’s five columns wide. 21_9780470371732-ch14.indd 33521_9780470371732-ch14.indd 335 7/6/11 7:01 PM7/6/11 7:01 PM www.it-ebooks.info 336 Part IV: Savvy Java Techniques Listing 14-1 uses a fancy operator to decide between the singular guess and the plural guesses. If you’re not familiar with this use of the question mark and colon, see Chapter 11. Events and event handling The big news in Listing 14-1, shown in the preceding section, is the handling of the user’s button click. When you’re working in a graphical user interface (GUI), anything the user does (like pressing a key, moving the mouse, click- ing the mouse, or whatever) is called an event. The code that responds to the user’s press, movement, or click is called event-handling code. Listing 14-1 deals with the button-click event with three parts of its code: ✓ The top of the GameFrame class declaration says that this class implements ActionListener. ✓ The constructor for the GameFrame class adds this to the button’s list of action listeners. ✓ The code for the GameFrame class has an actionPerformed method. Taken together, all three of these tricks make the GameFrame class handle button clicks. To understand how it works, you have to know about some- thing called an interface, which I discuss in the following section. The Java interface You may have noticed that, in Java, you never get a class to extend more than one parent class. In other words, you never say class DontDoThis extends FirstClass, SecondClass A class can have only one parent class, and that’s fine when you want your new class to be like a frame. But what if you want your new class to be like a frame and a button-click-listening thing? Can your new class be like both things? Yes, it can be. Java has this thing called an interface. An interface is like a class, but it’s different. (So, what else is new? A cow is like a planet, but it’s quite a bit different. Cows moo; planets hang in space.) Anyway, when you hear the word interface, you can start by thinking of a class. Then, in your head, note the following things: 21_9780470371732-ch14.indd 33621_9780470371732-ch14.indd 336 7/6/11 7:01 PM7/6/11 7:01 PM www.it-ebooks.info 337 Chapter 14: Responding to Keystrokes and Mouse Clicks ✓ A class can extend only one parent class, but a class can implement more than one interface. For instance, if you want GameFrame to listen for keystrokes as well as button clicks, you can say class GameFrame extends JFrame implements ActionListener, ItemListener ✓ An interface’s methods have no bodies of their own. Here’s a copy of the API code for the ActionListener interface: package java.awt.event; import java.util.EventListener; public interface ActionListener extends EventListener { public void actionPerformed(ActionEvent e); } I’ve removed the code’s comments, but I’ve avoided messing with the API code in any significant ways. In this code, the actionPerformed method has no body — no curly braces and no statements to execute. In place of a body, there’s just a semicolon. A method with no body, like the method defined in the ActionListener interface, is called an abstract method. ✓ When you implement an interface, you provide bodies for all the interface’s methods. That’s why an actionPerformed method appears in Listing 14-1. By announcing that it will implement the ActionListener interface, the code in Listing 14-1 agrees that it will give meaning to the interface’s actionPerformed method. In this situation, giving meaning means declaring an actionPerformed method with curly braces, a body, and maybe some statements to execute. When you announce that you’re going to implement an interface, the Java compiler takes this announcement seriously. Later on in the code, if you fail to give meaning to any of the interface’s methods, the compiler yells at you. If you’re really lazy, you can quickly find out what methods need to be declared in your interface-implementing code. Try to compile the code, and the compiler lists all the methods that you should have declared but didn’t. 21_9780470371732-ch14.indd 33721_9780470371732-ch14.indd 337 7/6/11 7:01 PM7/6/11 7:01 PM www.it-ebooks.info 338 Part IV: Savvy Java Techniques Chapter 8 introduces the use of @Override — a Java annotation. Normally, you use @Override to signal the replacement of a method that’s already been declared in a superclass. But from Java 6 onward, you can also use @ Override to signal an interface method’s implementation. That’s what I do in Listing 14-1. Threads of execution Here’s a well-kept secret: Java programs are multithreaded, which means that several things are going on at once whenever you run a Java program. Sure, the computer is executing the code that you’ve written, but it’s executing other code as well (code that you didn’t write and don’t see). All this code is being executed at the same time. While the computer executes your main method’s statements, one after another, the computer takes time out, sneaks away briefly, and executes statements from some other, unseen methods. For most simple Java programs, these other methods are ones that are defined as part of the Java virtual machine (JVM). For instance, Java has an event-handling thread. While your code runs, the event-handling thread’s code runs in the background. The event-handling thread’s code listens for mouse clicks and takes appropriate action whenever a user clicks the mouse. Figure 14-3 illustrates how this works. Figure 14-3: Two Java threads. Your code’s thread setLayout(new FlowLayout()); add(textField); add(button); add(label); button.addActionListener(this); pack(); setVisible(true); The event handling thread Did the user click the mouse? . . Did the user click the mouse? . . Did the user click the mouse? Yes? Okay, then. I’ll call the actionPerformed method. When the user clicks the button, the event-handling thread says, “Okay, the button was clicked. So, what should I do about that?” And the answer is, “Call some actionPerformed methods.” It’s as if the event-handling thread has code that looks like this: 21_9780470371732-ch14.indd 33821_9780470371732-ch14.indd 338 7/6/11 7:01 PM7/6/11 7:01 PM www.it-ebooks.info 339 Chapter 14: Responding to Keystrokes and Mouse Clicks if (buttonJustGotClicked()) { object1.actionPerformed(infoAboutTheClick); object2.actionPerformed(infoAboutTheClick); object3.actionPerformed(infoAboutTheClick); } Of course, behind every answer is yet another question. In this situation, the follow-up question is, “Where does the event-handling thread find action- Performed methods to call?” And there’s another question: “What if you don’t want the event-handling thread to call certain actionPerformed methods that are lurking in your code?” Well, that’s why you call the addActionListener method. In Listing 14-1, the call button.addActionListener(this); tells the event-handling thread, “Put this code’s actionPerformed method on your list of methods to be called. Call this code’s actionPerformed method whenever the button is clicked.” So, that’s how it works. To have the computer call an actionPerformed method, you register the method with Java’s event-handling thread. You do this registration by calling addActionListener. The addActionListener method belongs to the object whose clicks (and other events) you’re waiting for. In Listing 14-1, you’re waiting for the button object to be clicked, and the addActionListener method belongs to that button object. The keyword this In Chapters 9 and 10, the keyword this gives you access to instance vari- ables from the code inside a method. So, what does the this keyword really mean? Well, compare it with the English phrase “state your name.” I, (state your name), do solemnly swear, to uphold the constitution of the Philadelphia Central High School Photography Society. . . . The phrase “state your name” is a placeholder. It’s a space in which each person puts his or her own name. I, Bob, do solemnly swear. . . . I, Fred, do solemnly swear. . . . 21_9780470371732-ch14.indd 33921_9780470371732-ch14.indd 339 7/6/11 7:01 PM7/6/11 7:01 PM www.it-ebooks.info 340 Part IV: Savvy Java Techniques Think of the pledge (“I . . . do solemnly swear . . .”) as a piece of code in a Java class. In that piece of code is the placeholder phrase, “state your name.” Whenever an instance of the class (a person) executes the code (that is, takes the pledge), the instance fills in its own name in place of the phrase “state your name.” The this keyword works the same way. It sits inside the code that defines the GameFrame class. Whenever an instance of GameFrame is constructed, the instance calls addActionListener(this). In that call, the this key- word stands for the instance itself. button.addActionListener(thisGameFrameInstance); By calling button.addActionListener(this), the GameFrame instance is saying, “Add my actionPerformed method to the list of methods that are called whenever the button is clicked.” And indeed, the GameFrame instance has an actionPerformed method. The GameFrame has to have an actionPerformed method because the GameFrame class implements the ActionListener interface. It’s funny how that all fits together. Inside the actionPerformed method The actionPerformed method in Listing 14-1 uses a bunch of tricks from the Java API. Here’s a brief list of those tricks: ✓ Every instance of JTextField (and of JLabel) has its own getter and setter methods, including getText and setText. Calling getText fetches whatever string of characters is in the component. Calling set- Text changes the characters that are in the component. In Listing 14-1, judicious use of getText and setText pulls a number out of the text field and replaces the number with either nothing (the empty string “”), or the number, followed by the word Yes! ✓ Every component in the javax.swing package (JTextField, JButton, or whatever) has a setEnabled method. When you call setEnabled(false), the component gets that limp, gray, washed-out look and can no longer receive button clicks or keystrokes. ✓ Every component in the javax.swing package has a requestFocus method. When you call requestFocus, the component gets the privi- lege of receiving the user’s next input. For example, in Listing 14-1, the call textField.requestFocus() says “even though the user may have just clicked the button, put a cursor in the text field. That way, the user can type another guess in the text field without clicking the text field first.” 21_9780470371732-ch14.indd 34021_9780470371732-ch14.indd 340 7/6/11 7:01 PM7/6/11 7:01 PM www.it-ebooks.info 341 Chapter 14: Responding to Keystrokes and Mouse Clicks You can perform a test to make sure that the object referred to by the button variable is really the thing that was clicked. Just write if (e.getSource() == button). If your code has two buttons, button1 and button2, you can test to find out which button was clicked. You can write if (e.get- Source() == button1) and if (e.getSource() == button2). The serialVersionUID Chapter 9 introduces the SuppressWarnings annotation to avoid dealing with something called a serialVersionUID. A serialVersionUID is a number that helps Java avoid version conflicts when you send an object from one place to another. For example, you can send the state of your JFrame object to another computer’s screen. Then the other computer can check the frame’s version number to make sure that no funny business is taking place. In Chapter 9, I side-step the serialVersionUID issue by telling Java to ignore any warnings about missing serial version numbers. But in Listing 14-1, I take a bolder approach. I give my JFrame object a real serialVersionUID. This is my first version of GameFrame, so I give this GameFrame the version number 1. (Actually, I give this GameFrame the number 1L, meaning the long value 1. See Chapter 4.) So when would you bother to change a class’s serialVersionUID number? If version number 1 is nice, is version number 2 even better? The answer is complicated but the bottom line is, don’t change the serialVersion UID number unless you make incompatible changes to the class’s code. By “incompatible changes,” I mean changes that make it impossible for the receiving computer’s existing code to handle your newly created objects. For more details about the serialVersionUID and what constitutes an incompatible code change, see http://download.oracle.com/ javase/6/docs/platform/serialization/spec/version. html#6678. Responding to Things Other Than Button Clicks When you know how to respond to one kind of event, responding to other kinds of events is easy. Listings 14-3 and 14-4 display a window that converts between U.S. and U.K. currencies. The code in these listings responds to many kinds of events. Figures 14-4, 14-5, and 14-6 show some pictures of the code in action. 21_9780470371732-ch14.indd 34121_9780470371732-ch14.indd 341 7/6/11 7:01 PM7/6/11 7:01 PM www.it-ebooks.info 342 Part IV: Savvy Java Techniques Listing 14-3: Displaying the Local Currency import java.awt.Color; import java.awt.FlowLayout; import java.awt.event.ItemEvent; import java.awt.event.ItemListener; import java.awt.event.KeyEvent; import java.awt.event.KeyListener; import java.awt.event.MouseEvent; import java.awt.event.MouseListener; import java.text.NumberFormat; import java.util.Locale; import javax.swing.JComboBox; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JTextField; class MoneyFrame extends JFrame implements KeyListener, ItemListener, MouseListener { private static final long serialVersionUID = 1L; JLabel fromCurrencyLabel = new JLabel(“ “); JTextField textField = new JTextField(5); JLabel label = new JLabel(“ “); JComboBox combo = new JComboBox(); NumberFormat currencyUS = NumberFormat.getCurrencyInstance(); NumberFormat currencyUK = NumberFormat.getCurrencyInstance(Locale.UK); public MoneyFrame() { setLayout(new FlowLayout()); add(fromCurrencyLabel); add(textField); combo.addItem(“US to UK”); combo.addItem(“UK to US”); add(label); add(combo); textField.addKeyListener(this); combo.addItemListener(this); label.addMouseListener(this); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); setSize(300, 100); setVisible(true); } 21_9780470371732-ch14.indd 34221_9780470371732-ch14.indd 342 7/6/11 7:01 PM7/6/11 7:01 PM www.it-ebooks.info 343 Chapter 14: Responding to Keystrokes and Mouse Clicks void setTextOnLabel() { String amountString = “”; String fromCurrency = “”; try { double amount = Double.parseDouble(textField.getText()); if(combo.getSelectedItem().equals(“US to UK”)) { amountString = “ = “ + currencyUK.format(amount * 0.61214); fromCurrency = “$”; } if(combo.getSelectedItem().equals(“UK to US”)) { amountString = “ = “ + currencyUS.format(amount * 1.63361); fromCurrency = “\u00A3”; } } catch (NumberFormatException e) { } label.setText(amountString); fromCurrencyLabel.setText(fromCurrency); } @Override public void keyReleased(KeyEvent k) { setTextOnLabel(); } @Override public void keyPressed(KeyEvent k) { } @Override public void keyTyped(KeyEvent k) { } @Override public void itemStateChanged(ItemEvent i) { setTextOnLabel(); } @Override public void mouseEntered(MouseEvent m) { label.setForeground(Color.red); } (continued) 21_9780470371732-ch14.indd 34321_9780470371732-ch14.indd 343 7/6/11 7:01 PM7/6/11 7:01 PM www.it-ebooks.info 344 Part IV: Savvy Java Techniques Listing 14-3 (continued) @Override public void mouseExited(MouseEvent m) { label.setForeground(Color.black); } @Override public void mouseClicked(MouseEvent m) { } @Override public void mousePressed(MouseEvent m) { } @Override public void mouseReleased(MouseEvent m) { } } Listing 14-4: Calling the Code in Listing 14-3 class ShowMoneyFrame { public static void main(String args[]) { new MoneyFrame(); } } Figure 14-4: U.S. to U.K. currency. Figure 14-5: Using the combo box. Figure 14-6: U.K. to U.S. currency. 21_9780470371732-ch14.indd 34421_9780470371732-ch14.indd 344 7/6/11 7:01 PM7/6/11 7:01 PM www.it-ebooks.info 345 Chapter 14: Responding to Keystrokes and Mouse Clicks Okay, so Listing 14-3 is a little long. Even so, the outline of the code in Listing 14-3 isn’t too bad. Here’s what the outline looks like: class MoneyFrame extends JFrame implements KeyListener, ItemListener, MouseListener { variable declarations constructor for the MoneyFrame class declaration of a method named setTextOnLabel all the methods that are required because the class implements three interfaces } The constructor in Listing 14-3 adds the following four components to the new MoneyFrame window: ✓ A label: In Figure 14-4, the label displays a dollar sign. ✓ A text field: In Figure 14-4, the user types 54 in the text field. ✓ Another label: In Figure 14-4, the label displays £33.06. ✓ A combo box: In Figure 14-4, the combo box displays US to UK. In Figure 14-5, the user selects an item in the box. In Figure 14-6, the selected item is UK to US. The MoneyFrame implements three interfaces — the KeyListener, ItemListener, and MouseListener interfaces. Because it implements three interfaces, the code can listen for three different kinds of events. I discuss the interfaces and events in the following list: ✓ KeyListener: A class that implements the KeyListener interface must have three methods named keyReleased, keyPressed, and keyTyped. When you lift your finger off a key, the event-handling thread calls keyReleased. In Listing 14-3, the keyReleased method calls setTextOnLabel. My setTextOnLabel method checks to see what’s currently selected in the combo box. If the user selects the US to UK option, the setTextOn Label method converts dollars to pounds. If the user selects the UK to US option, the setTextOnLabel method converts pounds to dollars. In the setTextOnLabel method, I use the string “\u00A3”. The funny- looking \u00A3 code is Java’s UK pound sign. (The u in \u00A3 stands for Unicode — an international standard for representing characters in the world’s alphabets.) If my operating system’s settings defaulted to UK currency, in the runs of Java programs, the pound sign would appear 21_9780470371732-ch14.indd 34521_9780470371732-ch14.indd 345 7/6/11 7:01 PM7/6/11 7:01 PM www.it-ebooks.info 346 Part IV: Savvy Java Techniques on its own. For information about all this, check out the Locale class in Java’s API documentation. By the way, if you’re thinking in terms of real currency conversion, forget about it. This program uses rates that may or may not have been accurate at one time. Sure, a program can reach out on the Internet for the most up-to-date currency rates, but at the moment, you have other Javafish to fry. ✓ ItemListener: A class that implements the ItemListener interface must have an itemStateChanged method. When you select an item in a combo box, the event-handling thread calls itemStateChanged. In Listing 14-3, when the user selects US to UK or UK to US in the combo box, the event-handling thread calls the itemStateChanged method. In turn, the itemStateChanged method calls setTextOnLabel, and so on. ✓ MouseListener: A class that implements the MouseListener inter- face must have mouseEntered, mouseExited, mouseClicked, mousePressed, and mouseReleased methods. Implementing MouseListener is different from implementing ActionListener. When you implement ActionListener, as in Listing 14-1, the event-handling thread responds only to mouse clicks. But with MouseListener, the thread responds to the user pressing the mouse, releasing the mouse, and more. In Listing 14-3, the mouseEntered and mouseExited methods are called whenever you move over or away from the label. How do you know that the label is involved? Just look at the code in the MoneyFrame constructor. The label variable’s addMouseListener method is the one that’s called. Look at the mouseEntered and mouseExited methods in Listing 14-3. When mouseEntered or mouseExited is called, the computer forges ahead and calls setForeground. This setForeground method changes the color of the label’s text. Isn’t modern life wonderful? The Java API even has a Color class with names like Color.red and Color.black. Listing 14-3 has several methods that aren’t really used. For instance, when you implement MouseListener, your code has to have its own mouse Released method. You need the mouseReleased method not because you’re going to do anything special when the user releases the mouse button, but because you made a promise to the Java compiler and have to keep that promise. 21_9780470371732-ch14.indd 34621_9780470371732-ch14.indd 346 7/6/11 7:01 PM7/6/11 7:01 PM www.it-ebooks.info 347 Chapter 14: Responding to Keystrokes and Mouse Clicks Creating Inner Classes Here’s big news! You can define a class inside of another class! For the user, Listing 14-5 behaves the same way as Listing 14-1. But in Listing 14-5, the GameFrame class contains a class named MyActionListener. Listing 14-5: A class within a class import java.awt.FlowLayout; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.util.Random; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JTextField; class GameFrame extends JFrame { private static final long serialVersionUID = 1L; int randomNumber = new Random().nextInt(10) + 1; int numGuesses = 0; JTextField textField = new JTextField(5); JButton button = new JButton(“Guess”); JLabel label = new JLabel(numGuesses + “ guesses”); public GameFrame() { setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); setLayout(new FlowLayout()); add(textField); add(button); add(label); button.addActionListener(new MyActionListener()); pack(); setVisible(true); } class MyActionListener implements ActionListener { @Override public void actionPerformed(ActionEvent e) { String textFieldText = textField.getText(); (continued) 21_9780470371732-ch14.indd 34721_9780470371732-ch14.indd 347 7/6/11 7:01 PM7/6/11 7:01 PM www.it-ebooks.info 348 Part IV: Savvy Java Techniques Listing 14-5 (continued) if (Integer.parseInt (textFieldText) == randomNumber) { button.setEnabled(false); textField.setText (textField.getText() + “ Yes!”); textField.setEnabled(false); } else { textField.setText(“”); textField.requestFocus(); } numGuesses++; String guessWord = (numGuesses == 1) ? “ guess” : “ guesses”; label.setText(numGuesses + guessWord); } } } The MyActionListener class in Listing 14-5 is an inner class. An inner class is a lot like any other class. But within an inner class’s code, you can refer to the enclosing class’s fields. For example, several statements inside MyActionListener use the name textField, and textField is defined in the enclosing GameFrame class. Notice that the code in Listing 14-5 uses the MyActionListener class only once. (The only use is in a call to button.addActionListener.) So I ask, do you really need a name for something that’s used only once? No, you don’t. You can substitute the entire definition of the inner class inside the call to button.addActionListener. When you do this, you have an anonymous inner class. Listing 14-6 shows you how it works. Listing 14-6: A class with no name (inside a class with a name). import java.awt.FlowLayout; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.util.Random; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JTextField; class GameFrame extends JFrame { private static final long serialVersionUID = 1L; 21_9780470371732-ch14.indd 34821_9780470371732-ch14.indd 348 7/6/11 7:01 PM7/6/11 7:01 PM www.it-ebooks.info 349 Chapter 14: Responding to Keystrokes and Mouse Clicks int randomNumber = new Random().nextInt(10) + 1; int numGuesses = 0; JTextField textField = new JTextField(5); JButton button = new JButton(“Guess”); JLabel label = new JLabel(numGuesses + “ guesses”); public GameFrame() { setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); setLayout(new FlowLayout()); add(textField); add(button); add(label); button.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { String textFieldText = textField.getText(); if (Integer.parseInt (textFieldText) == randomNumber) { button.setEnabled(false); textField.setText (textField.getText() + “ Yes!”); textField.setEnabled(false); } else { textField.setText(“”); textField.requestFocus(); } numGuesses++; String guessWord = (numGuesses == 1) ? “ guess” : “ guesses”; label.setText(numGuesses + guessWord); } }); pack(); setVisible(true); } class MyActionListener implements ActionListener { @Override public void actionPerformed(ActionEvent e) { String textFieldText = textField.getText(); (continued) 21_9780470371732-ch14.indd 34921_9780470371732-ch14.indd 349 7/6/11 7:01 PM7/6/11 7:01 PM www.it-ebooks.info 350 Part IV: Savvy Java Techniques Listing 14-6 (continued) if (Integer.parseInt (textFieldText) == randomNumber) { button.setEnabled(false); textField.setText (textField.getText() + “ Yes!”); textField.setEnabled(false); } else { textField.setText(“”); textField.requestFocus(); } numGuesses++; String guessWord = (numGuesses == 1) ? “ guess” : “ guesses”; label.setText(numGuesses + guessWord); } } } Inner classes are good for things like event handlers, such as the action Performed method in this chapter’s examples. The most difficult thing about an anonymous inner class is keeping track of the parentheses, the curly braces, and the indentation. So my humble advice is, start by writing code without any inner classes, such as the code in Listing 14-1. Later, when you become bored with ordinary Java classes, experiment by changing some of your ordinary classes into inner classes. 21_9780470371732-ch14.indd 35021_9780470371732-ch14.indd 350 7/6/11 7:01 PM7/6/11 7:01 PM www.it-ebooks.info Chapter 15 Writing Java Applets In This Chapter ▶ Creating a simple applet ▶ Building applet animation ▶ Putting buttons (and other such things) on an applet With Java’s first big burst onto the scene in 1995, the thing that made the language so popular was the notion of an applet. An applet is a Java program that sits inside a web browser window. The applet has its own rectangular area on a web page. The applet can display a drawing, show an image, make a figure move, respond to information from the user, and do all kinds of interesting things. When you put a real, live computer program on a web page, you open up a world of possibilities. Applets 101 Listings 15-1 and 15-2 show you a very simple Java applet. The applet dis- plays the words Java For Dummies inside a rectangular box. (See Figure 15-1.) Listing 15-1: An Applet import javax.swing.JApplet; public class SimpleApplet extends JApplet { private static final long serialVersionUID = 1L; public void init() { setContentPane(new DummiesPanel()); } } 22_9780470371732-ch15.indd 35122_9780470371732-ch15.indd 351 7/6/11 7:06 PM7/6/11 7:06 PM www.it-ebooks.info 352 Part IV: Savvy Java Techniques Listing 15-2: Some Helper Code for the Applet import javax.swing.JPanel; import java.awt.Font; import java.awt.Graphics; class DummiesPanel extends JPanel { private static final long serialVersionUID = 1L; public void paint(Graphics myGraphics) { myGraphics.drawRect(50, 60, 220, 75); myGraphics.setFont (new Font(“Dialog”, Font.BOLD, 24)); myGraphics.drawString(“Java For Dummies”, 55, 100); } } Figure 15-1: Nice title! When you run the code in Listings 15-1 and 15-2, you don’t execute a main method. Instead, you run a web browser, and the web browser visits an HTML file. The HTML file includes a reference to the applet’s Java code, and the applet appears on your web page. Listing 15-3 shows a bare minimum HTML file. Listing 15-3: A One-Line Web Page 22_9780470371732-ch15.indd 35222_9780470371732-ch15.indd 352 7/6/11 7:06 PM7/6/11 7:06 PM www.it-ebooks.info 353 Chapter 15: Writing Java Applets In Figure 15-1, I don’t run Firefox, Internet Explorer, or any other commonly used web browser. Instead, I run Java’s own Applet Viewer — a small browser- like application made specifically for testing Java applets. Waiting to be called When you look at the code in Listings 15-1 and 15-2, you may notice one thing — an applet doesn’t have a main method. That’s because an applet isn’t a complete program. An applet is a class that contains methods, and your web browser calls those methods (directly or indirectly). Do you see the init method in Listing 15-1? The browser calls this init method. Then the init method’s call to setContentPane drags in the code from Listing 15-2. Now, take a look at the paint method in Listing 15-2. The browser calls this paint method automatically, and the paint method tells the browser how to draw your applet on the screen. For a list of applet methods that your web browser calls, see the section entitled “The methods in an applet,” later in this chapter. A public class Notice that the SimpleApplet in Listing 15-1 is a public class. If you create an applet and you don’t make the class public, you get an Applet not inited or a Loading Java Applet Failed error. To state things very plainly, any class that extends JApplet must be public. If the class isn’t public, your web browser can’t call the class’s methods. To state things a little less plainly, a class can have either default access or public access. The only code that can reference a default access class is code that’s in the same package as the default access class. Now remember that your web browser tries to call methods that are buried inside your applet class. Because the web browser isn’t likely to be in the same package as your applet (believe me, it’s not), the applet must be public. If the applet isn’t public, your web browser’s code (code that’s not in the same package as the applet) can’t call any of your applet’s methods. 22_9780470371732-ch15.indd 35322_9780470371732-ch15.indd 353 7/6/11 7:06 PM7/6/11 7:06 PM www.it-ebooks.info 354 Part IV: Savvy Java Techniques For more information on public and default access, see Chapter 13. The Java API (again) The code in Listing 15-2 uses a few interesting Java API tricks. Here are some tricks that don’t appear in any earlier chapters: ✓ drawRect: Draws an unfilled rectangle. Look at the call to drawRect in Listing 15-2. According to that call, the rectangle’s upper-left corner is 50 pixels across and 60 pixels down from the upper-left corner of the panel. The rectangle’s lower- right corner is 220 pixels across and 75 pixels down from the upper- left corner of the panel. I wanted the rectangle to surround the words Java For Dummies. To come up with numbers for the drawRect call, I used trial and error. However, you can make the program figure out how many pixels the words Java For Dummies take up. To do this, you need the FontMetrics class. (For information on FontMetrics, see the Java API documentation.) ✓ The Font class: Describes the features of a character font. Listing 15-2 creates a bold, 24-point font with the Dialog typeface style. Other typeface styles include DialogInput, Monospaced, Serif, and SansSerif. ✓ drawString: Draws a string of characters. Listing 15-2 draws the string “Java For Dummies” on the face of the panel. The string’s lower-left corner is 55 pixels across and 100 pixels down from the upper-left corner of the panel. Making Things Move This section’s applet is cool because it’s animated — you can see an odometer change on the screen. When you look at the code for this applet, you may think the code is quite complicated. Well, in a way, it is. A lot is going on when you use Java to create animation. On the other hand, the code for this applet is mostly boilerplate. To create your own animation, you can borrow most of this section’s code. To see what I’m talking about, look at Listings 15-4 and 15-5. 22_9780470371732-ch15.indd 35422_9780470371732-ch15.indd 354 7/6/11 7:06 PM7/6/11 7:06 PM www.it-ebooks.info 355 Chapter 15: Writing Java Applets Listing 15-4: An Odometer Applet import javax.swing.JApplet; import javax.swing.Timer; import java.awt.Color; import java.awt.event.ActionListener; import java.awt.event.ActionEvent; public class Odometer extends JApplet implements ActionListener { private static final long serialVersionUID = 1L; Timer timer; public void init() { OdometerPanel panel = new OdometerPanel(); panel.setBackground(Color.white); setContentPane(panel); } public void start() { if (timer == null) { timer = new Timer(100, this); timer.start(); } else { timer.restart(); } } public void stop() { if (timer != null) { timer.stop(); timer = null; } } public void actionPerformed(ActionEvent e) { repaint(); } } 22_9780470371732-ch15.indd 35522_9780470371732-ch15.indd 355 7/6/11 7:06 PM7/6/11 7:06 PM www.it-ebooks.info 356 Part IV: Savvy Java Techniques Listing 15-5: The Odometer Panel import javax.swing.JPanel; import java.awt.Font; import java.awt.Graphics; class OdometerPanel extends JPanel { private static final long serialVersionUID = 1L; long hitCount = 239472938472L; public void paint(Graphics myGraphics) { myGraphics.setFont (new Font(“Monospaced”, Font.PLAIN, 24)); myGraphics.drawString (“You are visitor number “ + Long.toString(hitCount++), 50, 50); } } A complete web page to display the applet in Listings 15-4 and 15-5 might consist of only one line, such as For a snapshot of the odometer applet in action, see Figure 15-2. Notice the number in the figure. It’s not the same as the starting value of the hitCount variable. That’s because, every 100 milliseconds, the applet adds 1 to the value of hitCount and displays the new value. The odometer isn’t reporting an honest hit count, but it’s still really cute. Figure 15-2: A popular website. 22_9780470371732-ch15.indd 35622_9780470371732-ch15.indd 356 7/6/11 7:06 PM7/6/11 7:06 PM www.it-ebooks.info 357 Chapter 15: Writing Java Applets The methods in an applet Most of the method names in Listings 15-4 and 15-5 are standard for an applet. The Java API JApplet and JPanel classes have default declarations for these methods, so you don’t really have to declare these methods your- self. The only methods that you have to put in your code are the methods that you want to customize. Here’s a list of JApplet and JPanel methods that your web browser automatically calls: ✓ init: The browser calls init when you first visit the page containing the applet. Imagine that you close the web browser. Later, you start the browser running again and revisit the page containing the applet. Then the browser calls the applet’s init method again. ✓ start: The browser calls start right after it calls init. If your applet performs any continuous work, you can begin that work’s code in the applet’s start method. For instance, if your applet has any animation, the code to begin running that animation is in your start method. ✓ paint: The browser calls the paint method in Listing 15-5 right after it calls start. (Yes, the start method and the paint method are in different classes, but the browser figures things out because of the call to setContentPane in Listing 15-4.) The paint method has instructions for drawing your applet on the screen. For an explanation, see Chapter 13. The browser can call paint several times. For instance, imagine that you cover part of the browser with another window. Or maybe you shrink the browser so that only part of the applet is showing. Later, when you uncover the applet or enlarge the browser window again, the browser calls the panel’s paint method. ✓ stop: When the applet’s work should cease, the browser calls the stop method. Say, for instance, that you click a link that takes you away from the page with the applet on it. Then the browser calls the applet’s stop method. Later, when you revisit the page with the applet on it, the browser calls the applet’s start method again. 22_9780470371732-ch15.indd 35722_9780470371732-ch15.indd 357 7/6/11 7:06 PM7/6/11 7:06 PM www.it-ebooks.info 358 Part IV: Savvy Java Techniques What to put into all these methods The code in Listings 15-4 and 15-5 uses a standard formula for creating animation inside an applet. Here’s a very brief explanation: ✓ The applet implements the ActionListener interface. ✓ The start method creates a new timer with the following code: new Timer(100, this) Every 100 milliseconds (every tenth of a second), the timer in Listing 15-4 rings its alarm. When it “rings its alarm,” the timer actually gets Java to call an actionPerformed method. And whose actionPerformed method does Java call? Once again, the keyword this answers the question. In Listing 15-4, the word this refers to this very same code — this instance of the Odometer object that contains the new Timer(100, this) call. So every tenth of a second, when the timer rings its alarm, Java calls the actionPerformed method in Listing 15-4. How nice and tidy it is! ✓ The actionPerformed method calls the repaint method. Under the hood, a call to repaint always calls somebody’s paint method. In this example, that somebody is the code in Listing 15-5. This paint method draws the words You are visitor number whatever on the screen. ✓ At some point, the day is done, and your browser calls the stop method. When this happens, the stop method tosses the timer into the dumpster. If it weren’t such standard code, I’d feel guilty for explaining this stuff so briefly. But, really, to achieve motion in your own applet, just copy Listings 15-4 and 15-5. Then replace the listing’s init and paint methods with your own code. So, what do you put in your init and paint methods? ✓ If you declare an init method, the method should contain setup code for the applet — stuff that happens once, the first time the applet is loaded. In Listing 15-4, the setup code fiddles with a panel: 22_9780470371732-ch15.indd 35822_9780470371732-ch15.indd 358 7/6/11 7:06 PM7/6/11 7:06 PM www.it-ebooks.info 359 Chapter 15: Writing Java Applets • It creates a panel by calling the OdometerPanel constructor. • It makes the panel’s background white. (This ensures that the rect- angle housing the applet blends nicely with the rest of the web page.) • It forges a rock-solid connection between the panel and the applet. It does this by calling the setContentPane method. ✓ The paint method describes a single snapshot of the applet’s motion. In Listing 15-5, the paint method sets the graphics buffer’s font, writes the hitCount value on the screen, and then adds 1 to the hitCount. (Who needs real visitors when you can increment your own hitCount variable?) The value of the hitCount variable starts high and becomes even higher. To store such big numbers, I give hitCount the type long. I use the Long class’s toString method to turn hitCount into a string of characters. This toString method is like the Integer class’s parseInt method. I introduce the parseInt method in Chapter 11. To debug an applet, you can put calls to System.out.println in the applet’s code. If you use Eclipse, the println output appears Eclipse’s Console view. Responding to Events in an Applet This section has an applet with interactive thingamajigs on it. This applet is just like the examples in Chapter 14. In fact, to create Listing 15-7, I started with the code in Listing 14-1. I didn’t do this out of laziness (although, heaven knows, I can certainly be lazy). I did it because applets are so much like Java frames. If you take the code for a frame and trim it down, you can usually create a decent applet. This section’s applet lives in Listings 15-6 and 15-7. Listing 15-6: A Guessing Game Applet import javax.swing.JApplet; public class GameApplet extends JApplet { private static final long serialVersionUID = 1L; public void init() { setContentPane(new GamePanel()); } } 22_9780470371732-ch15.indd 35922_9780470371732-ch15.indd 359 7/6/11 7:06 PM7/6/11 7:06 PM www.it-ebooks.info 360 Part IV: Savvy Java Techniques Listing 15-7: The Guessing Game Panel import java.awt.Color; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.util.Random; import javax.swing.JButton; import javax.swing.JLabel; import javax.swing.JPanel; import javax.swing.JTextField; class GamePanel extends JPanel implements ActionListener { private static final long serialVersionUID = 1L; int randomNumber = new Random().nextInt(10) + 1; int numGuesses = 0; JTextField textField = new JTextField(5); JButton button = new JButton(“Guess”); JLabel label = new JLabel(numGuesses + “ guesses”); GamePanel() { setBackground(Color.WHITE); add(textField); add(button); add(label); button.addActionListener(this); } public void actionPerformed(ActionEvent e) { String textFieldText = textField.getText(); if (Integer.parseInt(textFieldText) == randomNumber) { button.setEnabled(false); textField.setText (textField.getText() + “ Yes!”); textField.setEnabled(false); } else { textField.setText(“”); textField.requestFocus(); } numGuesses++; String guessWord = (numGuesses == 1) ? “ guess” : “ guesses”; label.setText(numGuesses + guessWord); } } 22_9780470371732-ch15.indd 36022_9780470371732-ch15.indd 360 7/6/11 7:06 PM7/6/11 7:06 PM www.it-ebooks.info 361 Chapter 15: Writing Java Applets To run the code in Listings 15-6 and 15-7, you need an HTML file: Figures 15-3 and 15-4 show you what happens when you run this section’s listings. It’s pretty much the same as what happens when you run the code in Listing 14-1. The big difference is that the applet appears as part of a web page in a browser window. Figure 15-3: An incorrect guess. Figure 15-4: The correct guess. Instead of noticing whatever code Listing 15-7 may have, notice what code the listing doesn’t have. To change Listing 14-1 to Listing 15-7, I remove several lines. ✓ I don’t bother calling setLayout. The default layout for an applet is FlowLayout, which is just what I want. If you want info on how FlowLayout works, see Chapter 9. ✓ I don’t call the pack method. The width and height fields in the HTML applet tag determine the applet’s size. ✓ I don’t call the setVisible method. An applet is visible by default. 22_9780470371732-ch15.indd 36122_9780470371732-ch15.indd 361 7/6/11 7:06 PM7/6/11 7:06 PM www.it-ebooks.info 362 Part IV: Savvy Java Techniques The only other significant change is between Listings 14-2 and 15-6. Like many other applets, Listing 15-6 has no main method. Instead, Listing 15-6 has an init method. You don’t need a main method because you never need to say new GameApplet() anywhere in your code. The web browser says it for you. Then, after the web browser creates an instance of the GameApplet class, the browser calls the instance’s init method. That’s the standard scenario for running a Java applet. 22_9780470371732-ch15.indd 36222_9780470371732-ch15.indd 362 7/6/11 7:06 PM7/6/11 7:06 PM www.it-ebooks.info Chapter 16 Using Java Database Connectivity In This Chapter ▶ Connecting to a database ▶ Inserting values into a database ▶ Making queries to a database Whenever I teach Java to professional programmers, I always hear the same old thing. “We don’t need to make any cute little characters fly across the screen. No blinking buttons for us. We need to access databases. Yup, just show us how to write Java programs that talk to databases.” So here it is, folks — Java Database Connectivity. JDBC and Java DB When I first started working with databases, my toughest problem was connecting to a database. I had written all the Java code. (Well, I had copied all the Java code from some book.) The Java part was easy. The hard part was getting my code to find the database on the system. Part of the problem was that the way you get your code to talk to the data- base depends on the kind of system you have and the kind of database that you’re running on your system. The books that I was using couldn’t be too specific on all the details because the details (having nothing to do with Java) varied from one reader’s computer to another. And now I’m writing my own chapter about database connectivity. What’s an author to do? 23_9780470371732-ch16.indd 36323_9780470371732-ch16.indd 363 7/6/11 7:06 PM7/6/11 7:06 PM www.it-ebooks.info 364 Part IV: Savvy Java Techniques Fortunately, the Java Development Kit (JDK) comes with its own built-in database — Java DB. Based on the Apache Derby database, Java DB is secure, lightweight, and standards-based. Java DB runs seamlessly along with the rest of the Java JDK. The Java gurus introduced Java DB with the release of Java 6. Java DB makes life easier for me by providing a common database that all my readers can use. The database is freely available, and it requires no setup. And what if you don’t use Java DB? What if all your data is stored in other kinds of databases; namely, MySQL, PostgreSQL, SQLite, Oracle, Microsoft Access, DB2, or almost any other database? Then Java has a solution for you! The Java Database Connectivity (JDBC) classes provide common access to most database management systems. Just get a driver for your favorite ven- dor’s system, customize two lines of code in each of this chapter’s examples, and you’re ready to run the code. Creating Data The crux of JDBC is contained in two packages: java.sql and javax.sql, which are both in the Java API. This chapter’s examples use the classes in java.sql. The first example is shown in Listing 16-1. Listing 16-1: Creating a Database and a Table, and Inserting Data import java.sql.DriverManager; import java.sql.Statement; import java.sql.Connection; import java.sql.SQLException; class CreateTable { public static void main(String args[]) { final String DRIVER = “org.apache.derby.jdbc.EmbeddedDriver”; final String CONNECTION = “jdbc:derby:AccountDatabase;create=true”; 23_9780470371732-ch16.indd 36423_9780470371732-ch16.indd 364 7/6/11 7:06 PM7/6/11 7:06 PM www.it-ebooks.info 365 Chapter 16: Using Java Database Connectivity try { Class.forName(DRIVER).newInstance(); } catch (InstantiationException e) { e.printStackTrace(); } catch (IllegalAccessException e) { e.printStackTrace(); } catch (ClassNotFoundException e) { e.printStackTrace(); } try (Connection connection = DriverManager.getConnection(CONNECTION); Statement statement = connection.createStatement()) { statement.executeUpdate( “create table ACCOUNTS “ + “ (NAME VARCHAR(32) NOT NULL PRIMARY KEY, “ + “ ADDRESS VARCHAR(32), “ + “ BALANCE FLOAT) “); statement.executeUpdate( “insert into ACCOUNTS values “ + “ (‘Barry Burd’, ‘222 Cyber Lane’, 24.02)”); statement.executeUpdate( “insert into ACCOUNTS values “ + “ (‘Joe Dow’, ‘111 Luddite Street’, 55.63)”); } catch (SQLException e) { e.printStackTrace(); } } } To use MySQL instead of Java DB, make the following changes in Listing 16-1: Change the value of DRIVER to “com.mysql.jdbc.Driver”. Change the value of CONNECTION to “jdbc:mysql://localhost/ AccountDatabase;create=true”. Make similar changes for DB2, Oracle, and other databases. 23_9780470371732-ch16.indd 36523_9780470371732-ch16.indd 365 7/6/11 7:06 PM7/6/11 7:06 PM www.it-ebooks.info 366 Part IV: Savvy Java Techniques To run database code, you must have a file containing a suitable database driver, and that file must be in a place where Java can find it. In this chapter’s examples, I connect to a Java DB database, also known as an Apache Derby database. The driver is in a file named derby.jar, which normally lives in the JDK’s db/lib directory. To make db/lib/derby.jar available to my Java programs, I add this .jar file to my Java classpath. The way you add a .jar file to your classpath depends on the kind of IDE you use and possibly on the kind operating system you use. In Eclipse, I select Project➪Properties➪Java Build Path. Then I click the Add External JARs button and navigate to the db/lib directory. For other IDEs, the steps are slightly different. When you run the code in Listing 16-1, nothing seems to happen. The pro- gram starts running and then stops running. That’s about it. The code has no visible output because all the output goes to a database. So, to see the result of running the code in Listing 16-1, you have to look for changes in the database itself. So read on! In the previous paragraph, I wrote that running Listing 16-1 is terribly unevent- ful. I wrote that “nothing seems to happen” and that “The code has no visible output.” But, if you look closely, you can find some evidence of a run of the Listing 16-1 code. In particular, your hard drive has a few additional files after the first run of this code. One of these files, named derby.log, contains text describing the starting and stopping of the Derby database software. You can also find a new folder named derbyDB, which contains more log files, a service.properties file, and a folder full of .dat files. (These .dat files contain all the stuff stored in the database.) If you use Eclipse, you can make these new files and folders visible by selecting your project branch in the Package Explorer, and then selecting File➪Refresh. Using SQL commands In Listing 16-1, the heart of the code lies in three calls to executeUpdate. Each executeUpdate call contains a string — a normal, Java, double- quoted string of characters. To keep the code readable, I’ve chopped each string into parts. I separate the parts with plus signs (Java’s string concatenation operator). Java’s plus sign does double duty. For numbers, the plus sign performs addition. For strings, the plus sign squishes two strings together, creating one big, combined string. 23_9780470371732-ch16.indd 36623_9780470371732-ch16.indd 366 7/6/11 7:06 PM7/6/11 7:06 PM www.it-ebooks.info 367 Chapter 16: Using Java Database Connectivity You can make a double-quoted string as long as you like. When you get to the right edge of your screen, just keep typing. If you want to see the whole string without scrolling, however, you can break the string into pieces, as I did in Listing 16-1. Just separate the pieces with plus signs. You cannot break a Java string into pieces by just pressing Enter and moving to the next line. When you start a string with the double-quote (“), the ending double-quote must be on the same line of code. If you’re familiar with SQL (Structured Query Language), the command strings in the calls to executeUpdate make sense to you. If not, pick up a copy of SQL For Dummies, 7th Edition, by Allen G. Taylor. One way or another, don’t go fishing around this chapter for explanations of create table and insert into. You won’t find the explanations because these command strings aren’t part of Java. These commands are just strings of characters that you feed to the executeUpdate method. These strings, which are written in SQL, create a new database table and add rows of data to the table. When you write a Java database program, that’s what you do. You write ordinary SQL commands and surround those commands with calls to Java methods. The code in this chapter adheres strictly to the techniques defined in JDBC version 1.0. Later versions of the JDBC classes support something called scrollable result sets. With a scrollable result set, you have methods like insertRow — methods that save you the effort of writing complete SQL command strings. Connecting and disconnecting Aside from the calls to the executeUpdate method, the code in Listing 16-1 is cut-and-paste stuff. Here’s a rundown on what each part of the code means: ✓ Class.forName: Find a database driver. To talk to a database, you need an intermediary piece of software, or a database driver. Drivers come in all shapes and sizes, and many of them are quite expensive. But Listing 16-1 uses a small, freebie driver — the Derby JDBC Embedded driver. The code for the Derby JDBC Embedded driver is kept in the EmbeddedDriver class (which is a Java class). This class lives inside the org.apache.derby.jdbc package. 23_9780470371732-ch16.indd 36723_9780470371732-ch16.indd 367 7/6/11 7:06 PM7/6/11 7:06 PM www.it-ebooks.info 368 Part IV: Savvy Java Techniques To use this EmbeddedDriver class, you call the Class.forName method. Believe it or not, the Java API has a class named Class. The Class class contains information about classes that are available to the Java Virtual Machine (JVM). In Listing 16-1, the call to Class. forName looks for the org.apache.derby.jdbc.EmbeddedDriver class. After an EmbeddedDriver instance is loaded, you can proceed to connect with a database. ✓ DriverManager.getConnection: Establish a session with a particular database. The getConnection method lives in a Java class named DriverManager. In Listing 16-1, the call to getConnection creates an AccountDatabase and opens a connection to that database. Of course, you may already have an AccountDatabase before you start running the code in Listing 16-1. If you do, the text ;create=true string in the getConnection call has no effect. In the parameter for getConnection (refer to Listing 16-1), notice the colons. The code doesn’t simply name the AccountDatabase, it tells the DriverManager class what protocols to use to connect with the database. The code jdbc:derby: — which is the same as the http: in a web address — tells the computer to use the jdbc proto- col to talk to the derby protocol, which in turn talks directly to your AccountDatabase. ✓ connection.createStatement: Make a statement. It seems strange, but in Java Database Connectivity, you create a single statement object. After you’ve created a statement object, you can use that object many times, with many different SQL strings, to issue many different commands to the database. So, before you start calling the statement.executeUpdate method, you have to create an actual statement object. The call to connection.createStatement creates that statement object for you. ✓ try . . . catch . . . : Acknowledge exceptions that can be thrown in the code. If you read Chapter 12, you know that some method calls throw checked exceptions. A checked exception is one that has to be acknowledged somewhere in the calling code. Well, a call to Class.forName can 23_9780470371732-ch16.indd 36823_9780470371732-ch16.indd 368 7/6/11 7:06 PM7/6/11 7:06 PM www.it-ebooks.info 369 Chapter 16: Using Java Database Connectivity throw three kinds of exceptions, and just about everything else in Listing 16-1 can throw an SQLException. To acknowledge these exceptions, I add try-catch statements to my code. ✓ try-with-resources: Release resources, come what may! As Ritter always says, you’re not being considerate of others if you don’t clean up your own messes. Every connection and every database statement lock up some system resources. When you’re finished using these resources, you release them. You can do this by making explicit calls to close methods, but you must enclose the method calls inside try-catch statements. But there’s a catch (pun intended)! When things go wrong, they don’t simply go wrong. They often go haywire! If you can’t close a statement, Java jumps to a catch clause. But what if the catch clause throws its own exception? And what happens later when your code tries to close the whole connection? To address these issues in one fell swoop, Java 7 has a new try-with- resources statement. A try-with-resources is like the old try statement of Chapter 12. But in a try-with-resources statement, you add parentheses after the word try. Inside the parentheses, you put some statements that create resources. (In Listing 16-1, the statements between parenthe- ses are the calls to getConnection and to createStatement.) You separate the statements with semi-colons. Java’s try-with-resources statement automatically closes and releases your resources at the end of the statement’s execution. In addition, try- with-resources takes care of all the messy details associated with failed attempts to catch exceptions gracefully. It’s a win-win. Retrieving Data What good is a database if you can’t get data from it? In this section, you query the database that you created in Listing 16-1. The code to issue the query is shown in Listing 16-2. 23_9780470371732-ch16.indd 36923_9780470371732-ch16.indd 369 7/6/11 7:06 PM7/6/11 7:06 PM www.it-ebooks.info 370 Part IV: Savvy Java Techniques Listing 16-2: Making a Query import static java.lang.System.out; import java.sql.DriverManager; import java.sql.Statement; import java.sql.Connection; import java.sql.SQLException; import java.sql.ResultSet; import java.text.NumberFormat; class GetData { public static void main(String args[]) { NumberFormat currency = NumberFormat.getCurrencyInstance(); final String DRIVER = “org.apache.derby.jdbc.EmbeddedDriver”; final String CONNECTION = “jdbc:derby:AccountDatabase”; try { Class.forName(DRIVER).newInstance(); } catch (InstantiationException e) { e.printStackTrace(); } catch (IllegalAccessException e) { e.printStackTrace(); } catch (ClassNotFoundException e) { e.printStackTrace(); } try (Connection connection = DriverManager.getConnection(CONNECTION); Statement statement = connection.createStatement(); ResultSet resultset = statement.executeQuery( “select * from ACCOUNTS”)) { 23_9780470371732-ch16.indd 37023_9780470371732-ch16.indd 370 7/6/11 7:06 PM7/6/11 7:06 PM www.it-ebooks.info 371 Chapter 16: Using Java Database Connectivity while(resultset.next()) { out.print(resultset.getString(“NAME”)); out.print(“, “); out.print(resultset.getString(“ADDRESS”)); out.print(“ “); out.println(currency.format( resultset.getFloat(“BALANCE”))); } } catch (SQLException e) { e.printStackTrace(); } } } To use MySQL instead of Java DB, make the following changes in Listing 16-2: Change the value of DRIVER to “com.mysql.jdbc.Driver”. Change the value of CONNECTION to “jdbc:mysql://localhost/AccountDatabase; create=true”. Make similar changes for DB2, for Oracle, and for other databases. A run of the code from Listing 16-2 is shown in Figure 16-1. The code queries the database and then steps through the rows of the database, printing the data from each of the rows. Figure 16-1: Getting data from the database. Listing 16-2 starts with the usual calls to forName, getConnection, and createStatement. Then the code calls executeQuery and supplies the call with an SQL command. For those who know SQL commands, this particular command gets all data from the ACCOUNTS table (the table that you create in Listing 16-1). 23_9780470371732-ch16.indd 37123_9780470371732-ch16.indd 371 7/6/11 7:06 PM7/6/11 7:06 PM www.it-ebooks.info 372 Part IV: Savvy Java Techniques The thing returned from calling executeQuery is of type java.sql.ResultSet. (That’s the difference between executeUpdate and executeQuery — executeQuery returns a result set, and executeUpdate doesn’t.) This result set is very much like a database table. Like the original table, the result set is divided into rows and columns. Each row contains the data for one account. Each row has a name, an address, and a balance amount. After you call executeQuery and get your result set, you can step through the result set one row at a time. To do this, you go into a little loop and test the condition resultset.next() at the top of each loop iteration. Each time around, the call to resultset.next() does two things: ✓ It moves you to the next row of the result set (the next account) if another row exists. ✓ It tells you whether another row exists by returning a boolean value — true or false. If the condition resultset.next() is true, the result set has another row. The computer moves to that other row, so you can march into the body of the loop and scoop data from that row. On the other hand, if resultset. next() is false, the result set doesn’t have any more rows. You jump out of the loop and start closing everything. Now, imagine that the computer is pointing to a row of the result set, and you’re inside the loop in Listing 16-2. Then you’re retrieving data from the result set’s row by calling the result set’s getString and getFloat meth- ods. Back in Listing 16-1, you set up the ACCOUNTS table with the columns NAME, ADDRESS, and BALANCE. So, here in Listing 16-2, you’re getting data from these columns by calling your getSomeTypeOrOther methods and feeding the original column names to these methods. After you have the data, you display the data on the computer screen. Each Java ResultSet instance has several nice getSomeTypeOrOther methods. Depending on the type of data you put into a column, you can call methods getArray, getBigDecimal, getBlob, getInt, getObject, getTimestamp, and several others. 23_9780470371732-ch16.indd 37223_9780470371732-ch16.indd 372 7/6/11 7:06 PM7/6/11 7:06 PM www.it-ebooks.info Part V The Part of Tens 24_9780470371732-pp05.indd 37324_9780470371732-pp05.indd 373 7/6/11 7:06 PM7/6/11 7:06 PM www.it-ebooks.info In this part . . .You’re near the end of the book, and the time has come to sum it all up. This part of the book is your slam-bam, thousand-words-or-less resource for Java. What? You didn’t read every word in the chapters before this one? That’s okay. You can pick up a lot of useful information in this Part of Tens. 24_9780470371732-pp05.indd 37424_9780470371732-pp05.indd 374 7/6/11 7:06 PM7/6/11 7:06 PM www.it-ebooks.info Chapter 17 Ten Ways to Avoid Mistakes In This Chapter ▶ Checking your capitalization and value comparisons ▶ Watching out for fall-through ▶ Putting methods, listeners, and constructors where they belong ▶ Using static and nonstatic references ▶ Avoiding other heinous errors “T he only people who never make mistakes are the people who never do anything at all.” One of my college professors said that. I don’t remember the professor’s name, so I can’t give him proper credit. I guess that’s my mistake. Putting Capital Letters Where They Belong Java is a case-sensitive language, so you really have to mind your Ps and Qs — along with every other letter of the alphabet. Here are some things to keep in mind as you create Java programs: ✓ Java’s keywords are all completely lowercase. For instance, in a Java if statement, the word if can’t be If or IF. ✓ When you use names from the Java API (Application Programming Interface), the case of the names has to match what appears in the API. ✓ You also need to make sure that the names you make up yourself are capitalized the same way throughout your entire program. If you declare a myAccount variable, you can’t refer to it as MyAccount, myaccount, or Myaccount. If you capitalize the variable name two different ways, Java thinks you’re referring to two completely different variables. For more info on Java’s case-sensitivity, see Chapter 3. 25_9780470371732-ch17.indd 37525_9780470371732-ch17.indd 375 7/6/11 7:06 PM7/6/11 7:06 PM www.it-ebooks.info 376 Part V: The Part of Tens Breaking Out of a switch Statement If you don’t break out of a switch statement, you get fall-through. For instance, if the value of verse is 3, the following code prints all three lines — Last refrain, He’s a pain, and Has no brain. switch (verse) { case 3: out.print(“Last refrain, “); out.println(“last refrain,”); case 2: out.print(“He’s a pain, “); out.println(“he’s a pain,”); case 1: out.print(“Has no brain, “); out.println(“has no brain,”); } For the full story, see Chapter 5. Comparing Values with a Double Equal Sign When you compare two values with one another, you use a double equal sign. The line if (inputNumber == randomNumber) is correct, but the line if (inputNumber = randomNumber) is not correct. For a full report, see Chapter 5. 25_9780470371732-ch17.indd 37625_9780470371732-ch17.indd 376 7/6/11 7:06 PM7/6/11 7:06 PM www.it-ebooks.info 377 Chapter 17: Ten Ways to Avoid Mistakes Adding Components to a GUI Here’s a constructor for a Java frame: public SimpleFrame() { JButton button = new JButton(“Thank you...”); setTitle(“...Katie Feltman and Paul Levesque”); setLayout(new FlowLayout()); add(button); button.addActionListener(this); setSize(300, 100); setVisible(true); } Whatever you do, don’t forget the call to the add method. Without this call, you go to all the work of creating a button, but the button doesn’t show up on your frame. For an introduction to such issues, see Chapter 9. Adding Listeners to Handle Events Look again at the previous section’s code to construct a SimpleFrame. If you forget the call to addActionListener, nothing happens when you click the button. Clicking the button harder a second time doesn’t help. For the rundown on listeners, see Chapter 14. Defining the Required Constructors When you define a constructor with parameters, as in public Temperature(double number) then the computer no longer creates a default parameterless constructor for you. In other words, you can no longer call Temperature roomTemp = new Temperature(); unless you explicitly define your own parameterless Temperature construc- tor. For all the gory details on constructors, see Chapter 9. 25_9780470371732-ch17.indd 37725_9780470371732-ch17.indd 377 7/6/11 7:06 PM7/6/11 7:06 PM www.it-ebooks.info 378 Part V: The Part of Tens Fixing Non-Static References If you try to compile the following code, you get an error message: class WillNotWork { String greeting = “Hello”; public static void main(String args[]) { System.out.println(greeting); } } You get an error message because main is static, but greeting isn’t static. For the complete guide to finding and fixing this problem, see Chapter 10. Staying within Bounds in an Array When you declare an array with ten components, the components have indices 0 through 9. In other words, if you declare int guests[] = new int[10]; then you can refer to the guests array’s components by writing guests[0], guests[1], and so on, all the way up to guests[9]. You can’t write guests[10], because the guests array has no component with index 10. For the latest gossip on arrays, see Chapter 11. Anticipating Null Pointers This book’s examples aren’t prone to throwing the NullPointerException, but in real-life Java programming, you see that exception all the time. A NullPointerException comes about when you call a method that’s sup- posed to return an object, but instead the method returns nothing. Here’s a cheap example: 25_9780470371732-ch17.indd 37825_9780470371732-ch17.indd 378 7/6/11 7:06 PM7/6/11 7:06 PM www.it-ebooks.info 379 Chapter 17: Ten Ways to Avoid Mistakes import static java.lang.System.out; import java.io.File; class ListMyFiles { public static void main(String args[]) { File myFile = new File(“\\windows”); String dir[] = myFile.list(); for (String fileName : dir) { out.println(fileName); } } } This program displays a list of all the files in the windows directory. (For clarification on the use of the double backslash in “\\windows”, see Chapter 8.) But what happens if you change \\windows to something else — something that doesn’t represent the name of a directory? File myFile = new File(“&*%$!!”); Then the new File call returns null (a special Java word meaning nothing), so the variable myFile has nothing in it. Later in the code, the variable dir refers to nothing, and the attempt to loop through all the dir values fails miserably. You get a big NullPointerException, and the program comes crashing down around you. To avoid this kind of calamity, check Java’s API documentation. If you’re calling a method that can return null, add exception-handling code to your program. For the story on handling exceptions, see Chapter 12. For some advice on reading the API documentation, see Chapter 3 and this book’s website. Helping Java Find Its Files You’re compiling Java code, minding your own business, when the computer gives you a NoClassDefFoundError. All kinds of things can be going wrong, but chances are that the computer can’t find a particular Java file. To fix this, you must align all the planets correctly. 25_9780470371732-ch17.indd 37925_9780470371732-ch17.indd 379 7/6/11 7:06 PM7/6/11 7:06 PM www.it-ebooks.info 380 Part V: The Part of Tens ✓ Your project directory has to contain all the Java files whose names are used in your code. ✓ If you use named packages, your project directory has to have appropri- ately named subdirectories. ✓ Your CLASSPATH must be set properly. For specific guidelines, see Chapter 13 and this book’s website. 25_9780470371732-ch17.indd 38025_9780470371732-ch17.indd 380 7/6/11 7:06 PM7/6/11 7:06 PM www.it-ebooks.info Chapter 18 Ten Websites for Java In This Chapter ▶ Checking out this book’s Website ▶ Finding resources from Oracle ▶ Reading more about Java No wonder the Web is so popular. It’s both useful and fun. This chapter proves that fact by listing ten useful and fun websites. Each website has resources to help you use Java more effectively. And as far as I know, none of these sites uses adware, pop-ups, or other grotesque things. This Book’s Website 1. For all matters related to the technical content of this book, visit www.allmycode.com/JavaForDummies. 2. For business issues (for example, “How can I purchase 100 more copies of Java For Dummies?”) visit www.dummies.com/go/ javafordummies5e. The Horse’s Mouth 3. Oracle’s official website for Java is www.oracle.com/ technetwork/java. 4. Consumers of Java technology should visit www.java.com. 5. Programmers and developers interested in sharing Java technology can go to www.java.net. 26_9780470371732-ch18.indd 38126_9780470371732-ch18.indd 381 7/6/11 7:06 PM7/6/11 7:06 PM www.it-ebooks.info 382 Part V: The Part of Tens Finding News, Reviews, and Sample Code 6. For articles by the experts (including yours truly and Michael Redlich) visit the Java Boutique at http://javaboutique.internet.com. 7. For discussion by everyone (including many very smart people), visit JavaRanch at www.javaranch.com. Looking for Java Jobs 8. For job listings, visit www.computerwork.com/jobs-by-skill/Java. Everyone’s Favorite Sites It’s true — these two sites aren’t devoted exclusively to Java. However, no geek-worthy list of resources would be complete without Slashdot and SourceForge. 9. Slashdot’s slogan is “News for nerds, stuff that matters,” says it all. By all means, visit http://slashdot.org. 10. The SourceForge repository (at http://sourceforge.net) houses more than 200,000 free, open-source projects. Check it out! 26_9780470371732-ch18.indd 38226_9780470371732-ch18.indd 382 7/6/11 7:06 PM7/6/11 7:06 PM www.it-ebooks.info Index • Symbols and Numerics • || operator, 111 * (asterisk) basics, 351–354 in comments, 56 as operator, 84 as reference symbol, 213 use of, 106 [ ] (braces), 99–100, 350 : (colon), 334, 336, 348–350 {} (curly braces) about, 51–53 in anonymous inner classes, 350 in statements, 99–101 <> (diamond operator), 277, 278 . (dot), 105 \ (double backslash), 270 == (double equal sign), 99, 103, 376 -- (double minus sign), 87, 90 ++ (double plus sign), 87–88, 90 “ (double-quote), 367 = (equal sign), 92 / (forward slash), 55, 56, 84, 270 != (inequality), 103 - (minus sign), 84 () (parentheses), 105, 111–112, 350 + (plus sign), 83, 366 £ (pound), 345 ? (question mark), 334, 336, 348–350 ‘ (quote mark), 75 ; (semicolon), 51, 98, 221 \t (tab stops), 255 32-bit variables, 69 64-bit variables, 69 • A • access defaults, 312, 323–325, 353 package-wide, 325 protected, 326–329 public, 353 Access (software), 364 access modif ers about, 312, 314–316 for classes, 330–332 examples of, 316–321 protected, 312, 326–329 accessor methods, 160–165, 184, 198 accounts, displaying, 146–149 accuracy 32-bit variables, 69 BigDecimal class, 266 currency calculations, 262, 266 int values, 84, 266 long value type, 266 number calculations, 156–160 acknowledging in the code, 300–302 ActionListener interface, 337, 339, 358 actionPerformed method about, 340–341 in animation, 358 in coding, 336 in event handling, 338–339, 350 punctuation for, 337 add method, 215, 275, 377 addActionListener method, 377 after, def nition, 88, 90 animation actionPerformed method in, 358 of applets, 354–359 of f gures, 351 annotation, 191, 215–216, 340 anonymous inner classes, 350 anticipating null pointers, 378 Apache Derby database, 364 API (Application Programming Interface) about, 40 features of, 354 identif ers in, 41–43 Applet Viewer, 353 27_9780470371732-bindex.indd 38327_9780470371732-bindex.indd 383 7/6/11 7:06 PM7/6/11 7:06 PM www.it-ebooks.info 384 Java For Dummies, 5th Edition applets about, 351 animating, 354–359 basics, 351–354 coding, 351–352, 355–356, 360, 362 events in, 359–362 Application Programming Interface (API) about, 40 features of, 354 identif ers in, 41–43 applications. See also Java; specifi c aspects of software development; specifi c software def nition, 12 development compilers, 26–28 IDE (integrated development environment), 25, 35–37, 52, 59, 100 JVM (Java virtual machines), 25, 28–33, 226, 338, 368 steps in, 33–34 tools for, 25 installation, 23–24 args[] string, 268 ArithmeticException, 304, 306 ArrayList class, 274–277 arrays background about, 249–251 creating, 251–252 initializer, 255–256 searching, 258–261 tab stops (\t), 255 values, 252–254 boundaries, 378 collection classes, 272–279 command line arguments, 267–272 of objects, 261–267 ASCII Character Encoding, 75 assignment operators, 91–92 assignment statements about, 65–67 examples of, 85–86 loops as substitute, 253 asterisk (*) basics, 351–354 in comments, 56 as operator, 84 as reference symbol, 213 use of, 106 AT&T Bell Labs, 14 audience as governing factor, 58 averages displaying, 230–232 f nding, 226–229 • B • background (arrays) about, 249–251 creating, 251–252 initializer, 255–256 searching, 258–261 tab stops (\t), 255 values, 252–254 backslash (\), 178, 270 backslash, double (\\), 270 bean method, 163 before, def nition, 88, 90 BigDecimal class accuracy of, 266 value type, 69 blocks about, 85, 99–101 building, 39–53 variables within, 136 blueprints, classes as, 18–22 Blu-ray devices, 15 bodies within declarations, 148–149 boolean values about, 76–77, 96–97 changing, 111 as primitive type, 73–74 braces ([ ]), 99–100, 350 braces, curly ({}) about, 51–53 in anonymous inner classes, 350 in statements, 99–101 break statements, 117, 118–120, 129 breaking out switch statements, 376 browsers applets in, 351, 352 types of, 353 buck passing, 299–304 bug f xes, 283 building blocks coding, 43–44, 46–47, 52, 55 language, 39–43 27_9780470371732-bindex.indd 38427_9780470371732-bindex.indd 384 7/6/11 7:06 PM7/6/11 7:06 PM www.it-ebooks.info 385385 Index programming classes, 44–45, 52–53 curly braces, 51–53 execution, 49–51 methods, 45–49 Burd, Barry (author) e-mail address, 7 technical support, 24 website compiling instructions, 34 currency coding, 69 data f les, 253 installation instructions, 24, 25 integrated development environment, 37, 100 keywords, 43 technical content, 381 updates on, 7 business data processing, 14 button clicks about, 333–336 actionPerformed method, 340–341 event handling, 336, 338–339 Java interface, 336–338 serialVersionUID f eld, 341 this, keyword, 339–340 threads of execution, 336–338 button.addActionListener method, 339, 340 buttons (JButtons), 43, 215 byte values as primitive type, 73 as whole numbers, 72 bytecode instructions, 27–28, 30–31 • C • C programming, 14, 17, 19 C# programming, 15 C++ programming, 14, 15, 17 calls to constructors, 144, 145, 211 to methods, 47, 49, 207, 226, 229–230, 353 case sensitivity, 45, 375 catch clauses def nition, 284 multi-, 296–299 parameters in, 286–287 in try clauses, 289–295, 303 changing boolean values, 111 char value type, 73–75 characters case sensitivity, 375 comparisons, 102–103 fonts for, 354 reading, 134–135, 174–175 strings of, 354 Character.toUpperCase method, 75 checked exceptions, 300, 303–304, 368–369 child classes, 20, 183, 184 classes about, 18–22, 44–45, 139 access modif ers for, 330–332 accessor methods, 160–165 action in, 314–316 ArrayList, 274–277 BigDecimal accuracy of, 266 value type, 69 blueprints as, 18–22 child, 20, 183, 184 within classes, 347–348 collection, 272–279 curly braces for, 52–53 def ning, 140–146, 219–226 drawing, 317–318, 322, 323 EmbeddedDriver, 367–368 enum type as, 197 Exception, 283 FontMetrics, 354 GameApplet, 362 GridLayout, 232 implements ActionListener, 336 inner, 332, 347–350 InterruptedException, 300, 304 from the Java API, 214–215 JLabel, 224 MyActionListener, 347–350 nameless, 348–350 nonpublic, 330, 331 NumberFormat, 266 numbers, 156–160 OutOfRangeException, 288, 291, 293 packages of, 213 parent about, 19–20 extending, 336–337 relationship with child class, 183 27_9780470371732-bindex.indd 38527_9780470371732-bindex.indd 385 7/6/11 7:06 PM7/6/11 7:06 PM www.it-ebooks.info 386 Java For Dummies, 5th Edition classes (continued) public about, 142, 353 access modif ers for, 330 for displaying accounts, 149 Drawing, 318 members compared with, 313–314 reusing code, 168–172 RuntimeException, 303, 306 Scanner, 96, 174 static components, 233 subclasses about, 19–20 constructors for, 206–211 def ning, 180–185 examples of, 227–228 methods from, 192–193 using, 185–188 Class.forName method, 368 ClassName variableName, 80 CLASSPATH, 320, 380 clauses catch def nition, 284 multi-, 296–299 parameters in, 286–287 in try clauses, 289–295, 303 finally, 304–306 throw, 303, 304 clicks (mouse) about, 333–336 actionPerformed method, 340–341 event handling, 336, 338–339 Java interface, 336–338 keyword this, 339–340 serialVersionUID f eld, 341 threads of execution, 336–338 closing f les, 306–309 COBOL, 14 coding about, 1 acknowledging, 300–302 actionPerformed method in, 336 applets, 351–352, 355–356, 360, 362 arrays background of, 249, 250, 251, 253, 254, 256–259, 260 command line arguments, 269, 270 of objects, 262, 263, 265, 267 basics examples of, 13, 26 FORTRAN/C style, 19 Java Bytecode, 27 for Pentium processors, 29 for power pc processors, 30 building blocks calls, 47 commenting out code, 55 comments in coding, 55 curly braces, 52 declarations, 46 program snippet, 43 button clicks about, 333–336 actionPerformed method, 340–341 event handling, 336, 338–339 Java interface, 336–338 serialVersionUID f eld, 341 this, keyword, 339–340 threads of execution, 336–338 bytecode, 30–31 classes accessor methods, 161, 162–163, 165 def ning, 141, 145 inner, 347–350 methods, 147–148, 149, 150–151, 152, 153, 154 numbers, accuracy of, 157, 158–159 comments, 55 conciseness, 73 constructors def ning, 196–201 subclasses, 206–211 database connectivity, 364–365, 370–371 decision-making statements break statements, 118–120 conditions, 104, 111–112 if statements, 94, 95–96, 97, 98, 101–102 Java 7, 121 logical operators, 107, 108, 109 nest building, 112–114 null values, 109–110 switch statements, 116, 117, 118 def nition, 12–13 errors, preventing, 376–377, 378, 379 event handling, 336 formatting, 51–53 inner classes, 347–350 27_9780470371732-bindex.indd 38627_9780470371732-bindex.indd 386 7/6/11 7:06 PM7/6/11 7:06 PM www.it-ebooks.info 387387 Index Java database connectivity, 364–365, 370–371 keystrokes, 342–345 loops do statements, 132, 133, 134, 135, 136 for statements, 127, 128–129, 130 while statements, 124, 125–126 modularity, 312 mouse clicks about, 333–336 actionPerformed method, 340–341 event handling, 336, 338–339 Java interface, 336–338 serialVersionUID f eld, 341 this, keyword, 339–340 threads of execution, 336–338 name sharing access modif ers, 330, 331–332 code variations, 322, 324, 325, 326 members, 313–316, 317, 320–321 protected access, 327, 329 objects, 143, 144–145 portability of, 31–33 programming double equal sign (==), 99, 103, 376 double minus sign (--), 87, 90 double plus sign (++), 87–88, 90 inequality (!=), 103 minus sign (-), 84 plus sign (+), 83, 366 punctuation asterisks (*), 56, 84, 106, 213, 351–354 backslash (\), 178, 270 braces ([ ]), 99–100, 350 colon (:), 334, 336, 348–350 curly braces ({}), 51–53, 99–101, 350 diamond (< >), 277, 278 dot (.), 105 double backslash (\), 270 double-quote (“), 367 forward slash (/), 55, 56, 84, 270 grouping separators, 172 parentheses (), 105, 111–112, 350 pounds (£), 345 question mark (?), 334, 336, 348–350 quote marks (‘), 75 semicolons (;), 51, 98, 221 questionable, 215–216 recovery, 283 reusing classes, 169, 170, 171 disk f les, 173–174, 175, 176, 179 methods, 189, 191, 192 subclasses, 182, 183–184, 185, 186 safe, 161 samples, 382 source, 13, 27, 28 steps in, 33–34 the unexpected buck passing, 299, 301, 302, 303 exception handling. See exception handling f les, closing, 307, 308–309 f nally clauses, 305 variables assignment statements, 66 basics, 64 classes, 220, 221–222 import declarations, 82 initializing, 72 names context, 235, 238 operator effects, 83–85, 86, 87, 89, 91 parameters/parameter lists, 241, 242, 243, 245 reference types, 78, 79–80 static components, 228, 230–231, 232 types of, 68, 69, 70, 74, 76–77 whole numbers, 71 collection classes, 272–279 com directory, 319 combined strings, 366 combo boxes, 345 command lines arguments, 267–272 directories for, 223 running from, 329 command prompt window, 268 commenting out code, 58 comments in coding, 53–59 comparison operators, 102–106 symbol (==), 99, 376 values, 376 compiling about, 25, 26–28 appeasers, 176 automatic, 37 during development, 33–34 pitfalls, 324 from within protected f elds, 329 27_9780470371732-bindex.indd 38727_9780470371732-bindex.indd 387 7/6/11 7:06 PM7/6/11 7:06 PM www.it-ebooks.info 388 Java For Dummies, 5th Edition components of arrays, 250–251 of graphical user interfaces, 377 as length, 254 components, static in classes, 233 in declarations, 213 in statements, 86 use of, 96 in variables, 226–234 Computer Folklore newsgroup (website), 282 Computer magazine (website), 282 computer programming language def nition, 12 Computer Science Advanced Placement exams, 15 computers, merits of, 11–12 concatenating String values, 83 concise coding, 73 conditional operators, 267 conditions comparison operators, 102–106 expressions as, 99 logical operators, 106–109 null values, 109–110 in parentheses (), 111–112 conditionToBeTested condition, 267 connection.createStatement, 368 constructors about, 195 calling, 144, 145, 211 components, 345 in currency, 266 def ning, 196–205 examples of, 220, 223, 336 exceptions to, 226 instances of, 224 for Jframe, 377 as non-static components, 229 PrintStream, 260, 261 required, 377 requirement def nitions, 377 role of, 211–216 subclasses, 206–211 context of names, 235, 237–240 controlling program f ow with decision-making statements. See decision-making statements with loops about, 123 do statements, 131–136 in lieu of assignment statements, 253 for statements, 127–131 while statements, 124–126, 129, 131–132 copying and pasting code, 173–174 correctness BigDecimal class, 266 currency calculations, 262, 266 int values, 84, 266 long value type, 266 number calculations, 156–160 32-bit variables, 69 counters, 126, 256 createStatement, 371 creating arrays, 251–252 data, 364–369 frames, 320–321 inner classes, 347–350 objects, 142–145 subclasses, 182–185 cross-reference icons, explained, 6 curly braces ({}), 51–53, 99–101, 350 currency accuracy of calculations, 262, 266 appearance of, 266 coding, 69 conversion, 341, 345 inaccuracies, 262 currency.format (rate) method, 266 Custom Made Exceptions, 287–289 • D • data checking for, 278–279 creating, 364–369 f les, 253 organizing, 16 processing, 14 in programming, 17 reading, 178–180 retrieving, 369–372 storage, 173 database connectivity about, 363 27_9780470371732-bindex.indd 38827_9780470371732-bindex.indd 388 7/6/11 7:06 PM7/6/11 7:06 PM www.it-ebooks.info 389389 Index data creating, 364–369 retrieving, 369–372 databases, 363–364 database drivers, 367 .dat f les, 366 DB2, 365 debugging, 25, 286 decFormat.format (average) method, 266 decFormat.setMaximum method, 221 decFormat.setMinimum method, 221 decimal numbers about, 68–69 coding for, 96–97 as primitive type, 73 decimal points digits beyond, 68–69 numbers without, 70–72 DecimalFormat method, 221, 266 decision-making statements conditions comparison operators, 102–106 logical operators, 106–109 null values, 109–110 in parentheses (), 111–112 if statements about, 94–97, 98–99 braces, 99–100 conditional operators as, 267 double equal signs, 99 else part (the bottom half), 101–102 indenting, 100–101 randomness, 97 in for loops, 131 nest building, 112–114 switch statements basics, 112–114 breaking out, 376 Java 7, 120–121 using, 202 declarations abbreviation, 278 bodies within, 148–149 combining, 72–73 examples of, 220 import, 81–82, 86, 213, 317 methods, 46–47, 50 package, 318 variables, 68, 79, 81–82, 136, 142–145 decrement operators, 86–91 defaults access, 312, 323–325, 353 constructors, 210–211 layout, 361 visibility, 361 def ning classes, 140–149, 168–172, 219–226 constructors, 196–205, 377 frames, 212 subclasses, 180–185 Derby JDBC Embedded drivers, 367 derbyDB f le, 366 derby.log f le, 366 details, hidden, 160–165, 312 developer version numbers, 32 development (applications) compilers, 26–28 IDE (integrated development environment) about, 25, 35–37 commenting out code, 59 indentation, automated, 52, 100 JVM (Java virtual machines) about, 25, 28–33 calls from, 226 classes available to, 368 multi-tasking, 338 development tools, pricing, 25 Diaconis, Persi (mathematician), 97 dialog boxes, 108–109 diamond operator (<>), 277, 278 Dictionary of Computing, Free On-line (website), 282 directories names, 177–178 structure, 319, 379–380 disk f les, 172–180, 260 Displayer.java f les, 24 displaying accounts, 146–149 averages, 230–232 currency, 342–346 drawing, 351 frames, 212, 222, 316–317 images, 351 do statements, 131–136 do while loops (while statements) about, 124–126, 131–132 functions of, 129 27_9780470371732-bindex.indd 38927_9780470371732-bindex.indd 389 7/6/11 7:06 PM7/6/11 7:06 PM www.it-ebooks.info 390 Java For Dummies, 5th Edition documentation, 40, 41 doSomething method, 306 dot (.), 105 double backslash (\\), 270 double equal signs (==), 99, 103, 376 double minus sign (--), 87, 90 double plus signs (++), 87–88, 90 double value decimals as, 68–69, 96–97 inaccuracies, 266 methods, passing to, 152–154 as primitive type, 73–74, 79 double-quote (“), 367 double-quoted strings, 367 drag-and-drop components, 35, 36 drawing classes, 317–318, 322, 323 displaying, 351 rectangles, 354 drawRect call, 354 drawString call, 354 DriverManager.getConnection, 368 drivers, database, 367 Dummies (website), 381 • E • Eclipse about, 35–36 as integrated development environment, 24, 366 storage in, 223 elements of arrays, 250–251 else part (the bottom half), 99–100, 101–102 EmbeddedDriver class, 367–368 employment, 382 end of a f le, 298 end-of-line comments, 56, 58–59 enhanced for loops, 136, 256–258. See also for loops enum type, 196–197, 202, 332 equal sign (=), 92 equal sign, double (==), 99, 103, 376 equality (==), 103 equals method, 103, 105 errors avoiding with coding care, 161 double plus signs (++), 90 modularity, 312 parentheses (), 111–112 variable initialization, 73 f nding, 25 messages about bug f xes, 283 loops, 129, 136 NoClassDefFoundError, 319 null values, 110 variables, 86, 91, 233, 329 without throws IOException, 176 preventing with array boundaries, 378 case sensitivity, 375 constructor requirements, 377 directory structure, 379–380 event handling listeners, 377 GUI components, 377 non-static references, 378 null pointers, 378 switch statements, 376 value comparisons, 376 escape sequences, 255 event handling about, 336, 338–339 actionPerformed method in, 338–339, 350 inner classes for, 350 listeners, adding, 377 events in applets, 359–362 eWeek, 15 Exception class, 283 exception handling about, 282–286 buck passing, 299–304 catch clauses about, 296–299 in exceptions, 289–295 parameters in, 286–287 multi-catch clauses, 295–296 types of, 287–289 exceptions checked, 300, 303–304, 368–369 to constructors, 226 to methods, 225–226 executeQuery, 371–372 executeUpdate, 366, 367, 372 execution, threads of, 336–338 experiments with variables, 234–240 27_9780470371732-bindex.indd 39027_9780470371732-bindex.indd 390 7/6/11 7:06 PM7/6/11 7:06 PM www.it-ebooks.info 391391 Index expressions evaluation of, 128 features of, 99 as operators, 90, 92 extending classes, 19, 20, 183 • F • factory method, 266 fall-through, 118–120, 129 f elds in classes, 314–316 content control, 196 def nition, 141 hiding, 162 as members of a class, 313, 324 in objects, 145 private, 163, 184, 312 protected, 327 public, 312 serialVersionUID, 216, 340, 341 text, 345 f gures, animating, 351 f les classes, 175 closing, 306–309 .dat, 366 data, 253 derbyDB, 366 derby.log, 366 disk, 172–180, 260 Displayer.java, 24 end of a f le, 298 handling, 136 HTML, 352 .jar, 366 locations of, 177, 320 service.properties, 366 src.zip, 41 zipped, 41 finally clauses, 304–306 Firefox (Mozilla), 353 f xing non-static references, 377 float values in arrays, 262 as decimal numbers, 69 inaccuracies, 266 as primitive type, 73 FlowLayout method, 214, 361 Font class class, 354 FontMetrics class, 354 for loops, 254. See also enhanced for loops for statements, 127–131 format string, 158 formatting code, 51–53 indentation, 51–53, 100–101, 350 methods, 266 numbers, 65 text, 70 forName, getConnection, 371 FORTRAN, 14, 16, 19 forward slash (/), 55, 56, 84, 270 frames about, 81 creating, 320–321 displaying, 212, 222, 316–317 Jframe as class, 79, 80 constructors for, 377 as reference type, 78 uses for, 40 ordering on, 225 packing, 224–225 sizing, 224 free development tools, 25 Free On-line Dictionary of Computing (website), 282 • G • GameApplet class, 362 generics, 276–278 getArray method, 372 getAverageString method, 220–221 getBigDecimal method, 372 getBlob method, 372 getCurrencyInstance method, 266 getFloat method, 372 getInt method, 372 getMessage method, 286 getObject method, 372 getSomeTypeOrOther method, 372 getString method, 372 27_9780470371732-bindex.indd 39127_9780470371732-bindex.indd 391 7/6/11 7:06 PM7/6/11 7:06 PM www.it-ebooks.info 392 Java For Dummies, 5th Edition getter methods, 220. See also accessor methods getTimestamp method, 372 Gosling, James (computer programmer), 17 grammar, 40–41 graphical interface design, 35, 36 graphical user interfaces (GUIs) components of, 377 events in, 336 JFrame as, 78 types of, 224–225 graphics buffer, 318 GridLayout class, 224, 232 grouping options, 197 separators, 172 GUIs (graphical user interfaces) components of, 377 events in, 336 JFrame as, 78 types of, 224–225 • H • handling events about, 336, 338–339 actionPerformed method in, 338–339, 350 inner classes for, 350 listeners, adding, 377 hasNext method, 278–279 headers within declarations, 148–149 hiding details, 160–165, 312 hitCount value, 356 HTML f les, 352 • I • icons, explained, 6 IDE (integrated development environment) about, 25, 35–37 commenting out code, 59 indentation, automated, 52, 100 identif ers about, 41–43 variables as, 65 IEEE (website), 282 if part (the top half), 99–100 if statements about, 94–97, 98–99 braces, 99–100 conditional operators as, 267 double equal signs, 99 else part (the bottom half), 101–102 indenting, 100–101 randomness, 97 images, displaying, 351 implements ActionListener class, 336 import declarations, 81–82, 86, 213, 317 import java.util.Scanner, 96 importing options, 106 inaccuracies currency, 262 numbers, 156–160 increment operators, 86–91 indentation, 51–53, 100–101, 350 indexes (indices), 251, 256 IndexOutOfBoundsException, 304 inequality (!=), 103 inheriting class features, 19, 20, 183, 184, 208 init method, 353, 357, 361 initialization arrays, 255–256 for statements, 128 static components, 229–230 variables, 72–73, 85–86, 145 inner classes about, 332 anonymous, 350 creating, 347–350 insertRow method, 367 installing applications, 23–24 instance variables, 236, 339. See also f elds instances of classes, 21 examples of, 224 instructions, statements as, 49 int values accuracy of, 84, 266 coding for, 96–97 in Java 7, 120–121 27_9780470371732-bindex.indd 39227_9780470371732-bindex.indd 392 7/6/11 7:06 PM7/6/11 7:06 PM www.it-ebooks.info 393393 Index as primitive type, 73–74, 79, 271 as whole numbers, 71, 72 integer class, 271 Integer.parseInt method, 286 integrated development environment (IDE) about, 25, 35–37 commenting out code, 59 indentation, automated, 52, 100 IntelliJ IDEA, 35 interactivity, 359 interfaces about, 336–338 ActionListener, 337, 339, 358 API (Application Programming Interface) about, 40 features of, 354 identif ers in, 41–43 ItemListener, 345, 346 KeyListener, 345–346 MouseListener, 345, 346 Internet Explorer (Microsoft), 353 Internet resources Barry Burd (author) compiling instructions, 34 currency coding, 69 data f les, 253 installation instructions, 24, 25 integrated development environment, 37, 100 keywords, 43 technical content, 381 updates on, 7 Computer Folklore newsgroup, 282 Computer magazine, 282 Dummies, 381 Free On-line Dictionary of Computing, 282 IEEE, 282 installation instructions, 23 Java, 24, 40, 381 Java Boutique, 382 Java Bytecode Editor, 28 Java Community Process (JCP), 41 JavaRanch, 382 OpenJDK Project, 41 Oracle Corporation, 381 Slashdot, 382 SourceForge repository, 382 InterruptedException class, 300, 304 intrusion, vulnerability to, 318 IOException, 304 ItemListener interface, 345, 346 itemStateChanged method, 346 iterations of loops, 126 • J • .jar f les, 366 Java. See also specifi c topics about, 1 annotation, 191 applets about, 351 basics, 351–354 events in, 359–362 motion in, 354–359 coding. See also coding comments, 53–59 formatting, 51–53 database connectivity about, 363 data, 364–372 databases, 363–364 history of, 14–15, 17, 351 installation about, 25 compilers, 26–28 Java virtual machines, 28–33 interface, 336–338 as object-oriented language, 16–22 quick-start instructions, 23–24 specif cations, 329 uses for, 12–13, 15 websites, 24, 40, 381 Java 7. See also specifi c topics changes with, 65 multi-catch clauses, 295–296 switch statements in, 120–121 Java Boutique (website), 382 Java Bytecode Editor (Saabas), 28 Java Community Process (JCP), 41, 42, 43 Java DB, 364, 365, 371 Java Development Kit (JDK), 32, 364 java MakeRandomNumsFile, 268 27_9780470371732-bindex.indd 39327_9780470371732-bindex.indd 393 7/6/11 7:06 PM7/6/11 7:06 PM www.it-ebooks.info 394 Java For Dummies, 5th Edition Java Runtime Environment (JRE), 32 Java Standard Edition (SE), 24, 40 Java virtual machines (JVM) about, 25, 28–33 calls from, 226 classes available to, 368 multi-tasking, 338 JavaBeans, 163 javadoc comments, 56–57 java.io.File, 135, 175 java.lang.NumberFormat- Exception, 283 java.lang.System.*, 106 java.lang.System.out, 96 JavaRanch (website), 382 java.sql package, 364 java.sql.ResultSet, 372 javax.sql package, 364 JButton class, 43, 215 JCP (Java Community Process), 41, 42, 43 JDK (Java Development Kit), 32, 364 Jframe as class, 79, 80 constructors for, 377 as reference type, 78 uses for, 40 JLabel class, 224 JRE (Java Runtime Environment), 32 JVM (Java virtual machines) about, 25, 28–33 calls from, 226 classes available to, 368 multi-tasking, 338 • K • keyboard.next() method, 104 keyboards, terminology for, 96 KeyListener interface, 345–346 keyPressed method, 345 keyReleased method, 345 keystrokes, 341–346 keyTyped method, 345 keywords about, 41–42 on author’s website, 43 catch, 284 lowercase letters, 375 private, 325 protected, 325 public, 313, 325 this, 339 throws, 283 try, 284 types of, 68 knowing the audience, 56 • L • labels from constructors, 345 on frames, 225 language object-oriented languages about, 16–22, 44–45 features of, 168 specif cations, 40, 42 layout, defaults, 361 length of args array, 271 components as, 254 letter comparisons, 102–103 limitations of arrays, 272 line breaks adding, 77 creating, 179, 367 examples of, 223 Linux coding, 31–33, 178 command lines in, 268 data f les, 253 literals 32-bit variables as, 69 appearance of, 73 numbers as, 65 locations of f les/directories, 177–178 logical operators, 106–109 logical type, 73 long value type accuracy of, 266 as primitive type, 73 as whole numbers, 72 loops about, 123 do statements, 131–136 in lieu of assignment statements, 253 for statements, 127–131 27_9780470371732-bindex.indd 39427_9780470371732-bindex.indd 394 7/6/11 7:06 PM7/6/11 7:06 PM www.it-ebooks.info 395395 Index while statements about, 124–126, 131–132 functions of, 129 lowercase letters, 103, 375 • M • Macintosh coding, 31–33, 178 command lines in, 268 data f les, 253 main method about, 47–49, 142–143 with applets, 353, 362 declarations for, 50 exceptions to, 226 running, 329 MakeRandomNumsFile, 268 matching catch clauses, 291 matching types, 187 members access modif ers for, 314–316 public, 313–314 method-local variables, 313, 324–325 methods about, 45–49 accessor, 160–165, 184, 198 actionPerformed about, 340–341 in animation, 358 in coding, 336 in event handling, 338–339, 350 punctuation for, 337 add, 377 addActionListener, 377 in applets, 357 bean, 163 button.addActionListener, 339, 340 calls, 47, 49, 207, 226, 229–230, 353 catch clauses as, 286 Character.toUpperCase, 75 classes within about, 353 declarations, 314–316 def ning, 146–149 sending values to/from, 149–156 from classes/subclasses, 192–193 Class.forName, 368 constructors, 199 currency.format (rate), 266 decFormat.format (average), 266 decFormat.setMaximum, 221 decFormat.setMinimum, 221 DecimalFormat, 221, 266 declarations, 46–47, 50 doSomething, 306 equals, 103, 105 exceptions to, 225–226 factory, 266 FlowLayout, 214, 361 getArray, 372 getAverageString, 220–221 getBigDecimal, 372 getBlob, 372 getCurrencyInstance, 266 getFloat, 372 getInt, 372 getMessage, 286 getObject, 372 getSomeTypeOrOther, 372 getString, 372 getTimestamp, 372 hasNext, 278–279 init, 353, 357, 361 insertRow, 367 Integer.parseInt, 286 itemStateChanged, 346 from the Java API, 214–215 keyboard.next(), 104 keyPressed, 345 keyReleased, 345 keyTyped, 345 main about, 47–49, 142–143 with applets, 353, 362 declarations for, 50 exceptions to, 226 running, 329 as members of a class, 313, 324 mouseClicked, 346 mouseEntered, 346 mouseExited, 346 mousePressed, 346 mouseReleased, 346 naming, 149 next-Double, 174 nextLine, 178–179 overriding, 189–193 pack, 361 27_9780470371732-bindex.indd 39527_9780470371732-bindex.indd 395 7/6/11 7:06 PM7/6/11 7:06 PM www.it-ebooks.info 396 Java For Dummies, 5th Edition methods (continued) paint, 318, 353, 357, 358, 359 parseInt, 284 printf, 157, 158, 160, 171, 205 printStackTrace, 286–287 PrintStream, 260, 261 remove, 275 repaint, 358 resultset.next(), 372 return from, 245–247 setDefaultCloseOperation, 214–215 setLayout, 214, 361 setSize, 215 setTextOnLabel, 345 setTitle, 214 setVisible, 215, 225, 361 SimpleFrame(), 377 sleep, 300 start, 357, 358 stop, 357 subprograms as, 146 System.out.printIn, 50–51 takeANap(), 303 Thread.sleep (5000), 300 Microsoft Access, 364 C# language, 15 Internet Explorer, 353 Windows coding, 31–33 command lines in, 268 data f les, 253 minus sign, double (--), 87, 90 minus signs (-) as operators, 84 mistakes avoiding with coding care, 161 double plus signs (++), 90 modularity, 312 parentheses (), 111–112 variable initialization, 73 f nding, 25 messages about bug f xes, 283 loops, 129, 136 NoClassDefFoundError, 319 null values, 110 variables, 86, 91, 233, 329 without throws IOException, 176 preventing with array boundaries, 378 case sensitivity, 375 constructor requirements, 377 directory structure, 379–380 event handling listeners, 377 GUI components, 377 non-static references, 378 null pointers, 378 switch statements, 376 value comparisons, 376 mobile devices, Java on, 15 modif ers (access) about, 312, 314–316 for classes, 330–332 examples of, 316–321 protected, 312, 326–329 modularity, 312 motion in applets, 354–359 mouse clicks about, 333–336 actionPerformed method, 340–341 event handling, 336, 338–339 Java interface, 336–338 keyword this, 339–340 serialVersionUID f eld, 341 threads of execution, 336–338 mouseClicked method, 346 mouseEntered method, 346 mouseExited method, 346 MouseListener interface, 345, 346 mousePressed method, 346 mouseReleased method, 346 Mozilla Firefox, 353 multi-catch clauses, 295–296 multithreaded programs, 338 MyActionListener class, 347–350 myFrame variable, 80 MySQL, 364, 365, 371 • N • nameless class, 348–350 names context of, 234–235, 237–240 in Java programs, 65 of methods, 149 of parameters, 204 27_9780470371732-bindex.indd 39627_9780470371732-bindex.indd 396 7/6/11 7:06 PM7/6/11 7:06 PM www.it-ebooks.info 397397 Index sharing about, 311–312 access modif ers, 312, 314–318, 330–332 code variations, 321–326 directory structure, 319 frames, 316–318, 320–321 members, 324 protected access, 326–330 terminology, 313–314 negative numbers, 221 nest building, 112–114 NetBeans IDE, 35, 36 new Random().nextInt value, 97 news updates, 382 nextBoolean() values, 96–97 next-Double method, 174 nextDouble() values, 96–97, 178–179, 180 nextInt() values, 96–97, 178, 180 nextLine method, 178–179 NoClassDefFoundError, 319, 379 nonpublic classes, 330, 331 non-static references, 377, 378 non-subclasses, 328–330 null pointers, 378 null values, 109–110 NullPointerException, 304, 378 NumberFormat class, 266 NumberFormatException, 283, 286, 293, 304 numbers appearance of, 220–221, 266 comparisons, 102–103 decimal about, 68–69 coding for, 96–97 as primitive type, 73 inaccuracies, 156–160 literals as, 65 negative, 221 pitfalls, 103 plus sign (+), 366 positive, 221 whole, 70–72, 73, 96 NumberTooLargeException, 291, 293 • O • object-oriented languages about, 16–22, 44–45 features of, 168 objects arrays of, 261–267 classes of, 18–22 comparisons, 103–105 constructors about, 195 def ning, 196–205 role of, 211–216 subclasses, 206–211 creating, 142–145 f elds in, 145 non-static components, 233 returning, 245–247 on the Web icons, explained, 6 online resources Barry Burd (author) compiling instructions, 34 currency coding, 69 data f les, 253 installation instructions, 24, 25 integrated development environment, 37, 100 keywords, 43 technical content, 381 updates on, 7 Computer Folklore newsgroup, 282 Computer magazine, 282 Dummies, 381 Free On-line Dictionary of Computing, 282 IEEE, 282 installation instructions, 23 Java, 24, 40, 381 Java Boutique, 382 Java Bytecode Editor, 28 Java Community Process (JCP), 41 JavaRanch, 382 OpenJDK Project, 41 Oracle Corporation, 381 Slashdot, 382 SourceForge repository, 382 OpenJDK Project, 41, 43 operators || operator, 111 assignment, 91–92 comparison, 102–106 conditional, 267 decrement, 86–91 diamond, 277, 278 effects of, 83–92 27_9780470371732-bindex.indd 39727_9780470371732-bindex.indd 397 7/6/11 7:06 PM7/6/11 7:06 PM www.it-ebooks.info 398 Java For Dummies, 5th Edition operators (continued) increment, 86–91 logical, 106–109 postdecrement, 89, 90 postincrement, 88, 90 predecrement, 89, 90 preincrement, 87–88, 90 Oracle Corporation software, 364, 365 Sun Microsystems purchase, 15, 32 website, 381 ordering on frames, 225 organizing f les, 16 org.apache.derby.jdbc package, 367 OutOfRangeException class, 288, 291, 293 @Override, 338 overriding classes, 20 methods, 189–193 • P • pack method, 361 packages of classes, 213 declarations, 318 java.sql, 364 javax.sql, 364 org.apache.derby.jdbc, 367 pitfalls, 324 package-wide access, 325 packing frames, 224, 225 paint method, 318, 353, 357, 358, 359 parameters about, 150 code shuff ing, 176 in exception handling, 286–287 names, 204 passing, 240–247 parent classes about, 19–20 extending, 336–337 relationship with child class, 183 parentheses (), 105, 111–112, 350 parseInt method, 284 passing parameters, 240–247 by reference, 243–245 values, 152–154, 240–242 passwords, 104, 114 pasting code, 173–174 payroll checks, 170, 171–172 Pentium processors, 29 pixel choices, 354 plus sign (+), 83, 366 plus sign, double (++), 87–88, 90 portability of coding, 31–33 positive numbers, 221 postdecrement operators, 89, 90 PostgreSQL, 364 postincrement operators, 88, 90 pound (£), 345 pow (tool), 40 PowerPC processors, 30 predecrement operators, 89, 90 preincrement operators, 87–88, 90 pricing, development tools, 25 primitive types, 73–77, 241, 243 printf method, 157, 158, 160, 171, 205 printStackTrace method, 286–287 PrintStream method, 260, 261 private f elds, 163, 184, 312 private members, 314 processing (data), 14 product version numbers, 32 program, def nition, 12 program f ow with decision-making statements. See decision-making statements with loops. See loops programming bad practices, 106 bug f xes, 283 C, 14, 17, 19 C#, 15 C++, 14, 15, 17 classes, 44–45, 52–53 execution, 49–51 methods, 45–49 quality of, 160–163 reusing, 19–21 symbols || operator, 111 * (asterisk), 56, 84, 106, 213, 351–354 [ ] (braces), 99–100, 350 {} (curly braces), 51–53, 99–101, 350 <> (diamond operator), 277, 278 27_9780470371732-bindex.indd 39827_9780470371732-bindex.indd 398 7/6/11 7:06 PM7/6/11 7:06 PM www.it-ebooks.info 399399 Index . (dot), 105 \\ (double backslash), 270 == (double equal sign), 99, 103, 376 -- (double minus sign), 87, 90 ++ (double plus sign), 87–88, 90 “ (double-quote), 367 = (equal sign), 92 / (forward slash), 55, 56, 84, 270 != (inequality), 103 - (minus sign), 84 () (parentheses), 105, 111–112, 350 + (plus sign), 83, 366 £ (pound), 345 ‘ (quote mark), 75 ; (semicolon), 51, 98, 221 \t (tab stops), 255 programs f ling, 146 multithreaded, 338 protected access modif er, 312, 326–329 public, def nition, 313–314 public access, 353 public classes about, 142, 353 access modif ers for, 330 for displaying accounts, 149 Drawing, 318 members compared with, 313–314 public f elds, 312 public members, 314 punctuation for actionPerformed method, 337 asterisks (*) basics, 351–354 in comments, 56 as operators, 84 as reference symbol, 213 use of, 106 backslashes (\), 178, 270 braces ([]), 99–100, 350 curly braces ({}), 51–53, 99–101, 350 diamond (<>), 277, 278 dot (.), 105 double backslash (\\), 270 double-quote (“), 367 forward slashes (/), 55, 56, 270 grouping separators, 172 parentheses (), 105, 111–112, 350 pounds (£), 345 quote marks (‘), 75 semicolons (;), 51, 98, 221 • Q • questionable code, 215–216 quick-start instructions, 23–24 quote, double (“), 367 quote marks (‘), 75 • R • randomness, 97 range-of-values, 257 reading characters, 134–135, 174–175 f les, 173–177 lines, 178–180 recovery code, 283 rectangles, drawing, 354 Redlich, Michael (programmer), 382 references non-static, 377 passing by, 243–245 types of, 77–81, 145, 324 referencing applet coding, 352 f elds/methods, 327 from outside the package, 327 releasing resources, 369 remember icons, explained, 6 remove methods, 275 repaint method, 358 repetition, avoiding, 251 resources, releasing, 369 responding to events, 359–362 to keystrokes, 341–346 to mouse clicks about, 333–336 actionPerformed method, 340–341 event handling, 336, 338–339 Java interface, 336–338 keyword this, 339–340 serialVersionUID, 341 threads of execution, 336–338 to users, 351 results, returning, 242–243 resultset.next() method, 372 27_9780470371732-bindex.indd 39927_9780470371732-bindex.indd 399 7/6/11 7:06 PM7/6/11 7:06 PM www.it-ebooks.info 400 Java For Dummies, 5th Edition retrieving data, 369–372 return statements, 153 return values, 149, 155–156 returning objects, 245–247 results, 242–243 reusing code about, 167–168 classes, 168–172 disk f les, 172–180 methods, 189–193 subclasses def ning, 180–185 using, 185–188 reviews, 382 Ritchie, Dennis (computer programmer), 14 rules with accessor methods, 165 RuntimeException class, 303, 306 • S • Saabas, Ando (software developer) Java Bytecode Editor, 28 Scanner class, 96, 174 scrollable result sets, 367 SDK (Software Development Kit), 32 SE (Java Standard Edition), 24, 40 searching arrays, 258–261 semicolon (;), 51, 98, 221 serial version numbers, 340 serialVersionUID f eld, 216, 340, 341 service.properties f le, 366 setDefaultCloseOperation method, 214–215 setLayout method, 214, 361 setSize method, 215 setter methods. See accessor methods setTextOnLabel method, 345 setTitle method, 214 setup code for applets, 358–359 setVisible method, 215, 225, 361 sharing names about, 311–312 access modif ers, 312, 314–318, 330–332 code variations, 321–326 directory structure, 319 frames, 316–318, 320–321 members, 324 protected access, 326–330 terminology, 313–314 shell, 268 short value type as primitive type, 73 as whole numbers, 72 shuff ing code, 176 SimpleFrame() method, 377 simplicity in programming, 160 SIMULA, 17 single characters, 134–135 64-bit variables, 69 sizing in applets, 354 frames, 224 Slashdot (website), 382 slashes (/) in comments, 55, 56 as operators, 84, 270 sleep method, 300 Smalltalk, 17 software. See also Java; specifi c aspects of software development; specifi c software Access, 364 def nition, 12 development compilers, 26–28 integrated development environment, 35–37 Java virtual machines, 28–33 steps in, 33–34 tools for, 25 installation, 23–24 testing commenting out code, 58 installations, 24 Software Development Kit (SDK), 32 source code, 13, 27, 28 SourceForge repository (website), 382 specif cations, language, 40, 42 SQL (Structured Query Language) commands, 366 SQL For Dummies, 7th Edition (Taylor), 367 SQLException, 304 27_9780470371732-bindex.indd 40027_9780470371732-bindex.indd 400 7/6/11 7:06 PM7/6/11 7:06 PM www.it-ebooks.info 401401 Index SQLite, 364 src.zip f le, 41 start method, 357, 358 statements for, 127–131 about, 49 assignment about, 65–67 examples of, 85–86 loops as substitute, 253 assignment operators as, 92 break, 117, 118–120, 129 connection.createStatement, 368 createStatement, 371 decision-making about, 93 break statements, 118–120 conditions, 102–112 if statements, 94–102, 267 Java 7, 121 logical operators, 107, 108, 109 in for loops, 131 nest building, 112–114 null values, 109–110 switch statements, 112–114, 116, 117, 118, 120–121, 376 using, 202 do, 131–136 formatting, 70 if about, 94–97, 98–99 braces, 99–100 conditional operators as, 267 double equal signs, 99 else part (the bottom half), 101–102 indenting, 100–101 randomness, 97 punctuation in, 51 return, 153 role of, 90 switch basics, 112–114 breaking out, 376 Java 7, 120–121 in for loops, 131 using, 202 throw, 302 try-catch, 301 try-with-resources, 308, 369 while about, 124–126, 131–132 functions of, 129 static components in classes, 233 in declarations, 213 in statements, 86 use of, 96 in variables, 226–234 stop method, 357 storing values, 252–254 String of characters, 354 as classes, 79 command line arguments, 268 comparisons, 103–104 examples of, 220–221 format, 158 pasting together, 83–84 plus sign (+), 366 as reference type, 78 with switch statements, 121 variables, 135 Stroustrup, Bjarne (computer programmer), 14, 17 Structured Query Language (SQL) commands, 366 subclasses about, 19–20 constructors for, 206–211 def ning, 180–185 examples of, 227–228 methods from, 192–193 using, 185–188 subdirectories, 319, 380 subordination in coding, 51–53 subprograms as methods, 146 Sun Microsystems, 14–15, 17, 32, 43 super calls, 211 superclasses, 19–20, 183, 338 SuppressWarnings annotation, 215–216, 340 Swing GUI Builder, 36 27_9780470371732-bindex.indd 40127_9780470371732-bindex.indd 401 7/6/11 7:06 PM7/6/11 7:06 PM www.it-ebooks.info 402 Java For Dummies, 5th Edition switch statements basics, 112–114 breaking out, 376 Java 7, 120–121 in for loops, 131 using, 202 symbols || operator, 111 * (asterisk) basics, 351–354 in comments, 56 as operator, 84 as reference symbol, 213 use of, 106 [ ] (braces), 350 {} (curly braces) about, 51–53 in anonymous inner classes, 350 in statements, 99–101 <> (diamond operator), 277, 278 . (dot), 105 \ (double backslash), 270 == (double equal sign), 99, 103, 376 -- (double minus sign), 87, 90 ++ (double plus sign), 87–88, 90 “ (double-quote), 367 = (equal sign), 92 / (forward slash), 55, 56, 84, 270 != (inequality), 103 - (minus sign), 84 () (parentheses), 105, 111–112, 350 + (plus sign), 83, 366 £ (pound), 345 ‘ (quote mark), 75 ; (semicolon), 51, 98, 221 \t (tab stops), 255 Sys-Con Media, 15 System.in, 96, 106, 174 System.out, 96, 106 System.out. print, out.println, 260 System.out.print display, 70 System.out.println display, 70, 75, 84, 232, 286 System.out.println method, 50–51 • T • tab stops (\t), 255 takeANap() method, 303 Taylor, Allen G. (author) SQL For Dummies, 7th Edition, 367 technical stuff icons, explained, 6 technical support from author, 24 temperature, coding, 196–203 terminal, 268 testing software commenting out code, 58 installations, 24 text f elds, 345 formatting, 70 32-bit variables, 69 this, def nition, 339 Thread class, 300 threads of execution, 336–338 Thread.sleep (5000) method, 300 throw clauses, 303, 304 statements, 302 throwing an exception, 283, 368–369 throws InterruptedException, 303 throws IOException, 225–226 timers, 358 TIOBE Programming Community Index, 15 tip icons, explained, 6 tools for APIs, 40 development, 25 traditional comments, 55–56, 58–59 true or false (boolean values) about, 76–77, 96–97 changing, 111 as primitive type, 73–74 try, def nition, 284 try clauses, 289, 303, 304, 305 try-catch statements, 301 try-with-resources statement, 308, 369 types enum, 332 matching, 187 names of, 73 primitive, 73–77, 241, 243 27_9780470371732-bindex.indd 40227_9780470371732-bindex.indd 402 7/6/11 7:06 PM7/6/11 7:06 PM www.it-ebooks.info 403403 Index • U • unchecked exceptions, 300, 304 Unicode, 75 updates evaluation of, 128 uppercase letters, 103, 375 users authentication, 114 responding to, 351 using SQL commands, 366 • V • values in arrays, 251–254 boolean about, 76–77, 96–97 changing, 111 as primitive type, 73–74 byte as primitive type, 73 as whole numbers, 72 char, 73–75 comparisons, 376 def nition, 64 double decimals as, 68–69, 96–97 inaccuracies, 266 methods, passing to, 152–154 as primitive type, 73–74, 79 expressions as, 90 float in arrays, 262 as decimal numbers, 69 inaccuracies, 266 as primitive type, 73 hitCount, 356 int accuracy of, 84, 266 coding for, 96–97 in Java 7, 120–121 as primitive type, 73–74, 79, 271 as whole numbers, 71, 72 long accuracy of, 266 as primitive type, 73 as whole numbers, 72 new Random().nextInt, 97 nextBoolean(), 96–97 nextDouble(), 96–97, 178–179, 180 nextInt(), 96–97, 178, 180 null, 109–110 operator effects on, 83–92 passing, 152–154, 240–242 range of, 73 return, 155–156 short as primitive type, 73 as whole numbers, 72 types of, 67–69 variable has protected access error message, 329 variable-name loops, 257 variables about, 63–65 assignment statements, 65–67 within blocks, 136 within classes, 141 declarations, 68, 79, 81–82, 136, 142–145 initializing, 72–73, 85–86, 145 instance, 236, 339 in loops, 129 method-local, 313, 324–325 myFrame, 80 operator effects on, 83–92 placement of about, 219 classes, 219–226 experiments with, 234–240 parameters, 240–247 static components, 226–234 reference types, 77–81 64-bit, 69 String, 135 text, 70 32-bit, 69 types of primitive, 73–77, 241, 243 value, 67–69 whole numbers, 70–72 variable-type loops, 257 version numbers conf icts, 340 types of, 32 27_9780470371732-bindex.indd 40327_9780470371732-bindex.indd 403 7/6/11 7:06 PM7/6/11 7:06 PM www.it-ebooks.info 404 Java For Dummies, 5th Edition visibility, 361 void, def nition, 149 vulnerability to intrusion, 318 • W • warning icons, explained, 6 web browsers applets in, 351, 352 types of, 353 websites Barry Burd (author) compiling instructions, 34 currency coding, 69 data f les, 253 installation instructions, 24, 25 integrated development environment, 37, 100 keywords, 43 technical content, 381 updates on, 7 Computer Folklore newsgroup, 282 Computer magazine, 282 Dummies, 381 Free On-line Dictionary of Computing, 282 IEEE, 282 installation instructions, 23 Java, 24, 40, 381 Java Boutique, 382 Java Bytecode Editor, 28 Java Community Process (JCP), 41 JavaRanch, 382 OpenJDK Project, 41 Oracle Corporation, 381 Slashdot, 382 SourceForge repository, 382 while statements about, 124–126, 131–132 functions of, 129 whole numbers, 70–72, 73, 96 Windows (Microsoft) coding, 31–33 command lines in, 268 data f les, 253 words, 41–43 “Write Once, Run Anywhere” philosophy, 14 writing to disk f les, 260 payroll checks, 170 • Z • zipped f les, 41 27_9780470371732-bindex.indd 40427_9780470371732-bindex.indd 404 7/6/11 7:06 PM7/6/11 7:06 PM www.it-ebooks.info Notes ______________________________________ ______________________________________ ______________________________________ ______________________________________ ______________________________________ ______________________________________ ______________________________________ ______________________________________ ______________________________________ ______________________________________ ______________________________________ ______________________________________ ______________________________________ ______________________________________ ______________________________________ ______________________________________ ______________________________________ ______________________________________ ______________________________________ ______________________________________ ______________________________________ ______________________________________ ______________________________________ ______________________________________ ______________________________________ ______________________________________ 27_9780470371732-bindex.indd 40527_9780470371732-bindex.indd 405 7/6/11 7:06 PM7/6/11 7:06 PM www.it-ebooks.info Notes ______________________________________ ______________________________________ ______________________________________ ______________________________________ ______________________________________ ______________________________________ ______________________________________ ______________________________________ ______________________________________ ______________________________________ ______________________________________ ______________________________________ ______________________________________ ______________________________________ ______________________________________ ______________________________________ ______________________________________ ______________________________________ ______________________________________ ______________________________________ ______________________________________ ______________________________________ ______________________________________ ______________________________________ ______________________________________ ______________________________________ 27_9780470371732-bindex.indd 40627_9780470371732-bindex.indd 406 7/6/11 7:06 PM7/6/11 7:06 PM www.it-ebooks.info Notes ______________________________________ ______________________________________ ______________________________________ ______________________________________ ______________________________________ ______________________________________ ______________________________________ ______________________________________ ______________________________________ ______________________________________ ______________________________________ ______________________________________ ______________________________________ ______________________________________ ______________________________________ ______________________________________ ______________________________________ ______________________________________ ______________________________________ ______________________________________ ______________________________________ ______________________________________ ______________________________________ ______________________________________ ______________________________________ ______________________________________ 27_9780470371732-bindex.indd 40727_9780470371732-bindex.indd 407 7/6/11 7:06 PM7/6/11 7:06 PM www.it-ebooks.info Notes ______________________________________ ______________________________________ ______________________________________ ______________________________________ ______________________________________ ______________________________________ ______________________________________ ______________________________________ ______________________________________ ______________________________________ ______________________________________ ______________________________________ ______________________________________ ______________________________________ ______________________________________ ______________________________________ ______________________________________ ______________________________________ ______________________________________ ______________________________________ ______________________________________ ______________________________________ ______________________________________ ______________________________________ ______________________________________ ______________________________________ 27_9780470371732-bindex.indd 40827_9780470371732-bindex.indd 408 7/6/11 7:06 PM7/6/11 7:06 PM www.it-ebooks.info Apple & Macs iPad For Dummies 978-0-470-58027-1 iPhone For Dummies, 4th Edition 978-0-470-87870-5 MacBook For Dummies, 3rd Edition 978-0-470-76918-8 Mac OS X Snow Leopard For Dummies 978-0-470-43543-4 Business Bookkeeping For Dummies 978-0-7645-9848-7 Job Interviews For Dummies, 3rd Edition 978-0-470-17748-8 Resumes For Dummies, 5th Edition 978-0-470-08037-5 Starting an Online Business For Dummies, 6th Edition 978-0-470-60210-2 Stock Investing For Dummies, 3rd Edition 978-0-470-40114-9 Successful Time Management For Dummies 978-0-470-29034-7 Computer Hardware BlackBerry For Dummies, 4th Edition 978-0-470-60700-8 Computers For Seniors For Dummies, 2nd Edition 978-0-470-53483-0 PCs For Dummies, Windows 7 Edition 978-0-470-46542-4 Laptops For Dummies, 4th Edition 978-0-470-57829-2 Cooking & Entertaining Cooking Basics For Dummies, 3rd Edition 978-0-7645-7206-7 Wine For Dummies, 4th Edition 978-0-470-04579-4 Diet & Nutrition Dieting For Dummies, 2nd Edition 978-0-7645-4149-0 Nutrition For Dummies, 4th Edition 978-0-471-79868-2 Weight Training For Dummies, 3rd Edition 978-0-471-76845-6 Digital Photography Digital SLR Cameras & Photography For Dummies, 3rd Edition 978-0-470-46606-3 Photoshop Elements 8 For Dummies 978-0-470-52967-6 Gardening Gardening Basics For Dummies 978-0-470-03749-2 Organic Gardening For Dummies, 2nd Edition 978-0-470-43067-5 Green/Sustainable Raising Chickens For Dummies 978-0-470-46544-8 Green Cleaning For Dummies 978-0-470-39106-8 Health Diabetes For Dummies, 3rd Edition 978-0-470-27086-8 Food Allergies For Dummies 978-0-470-09584-3 Living Gluten-Free For Dummies, 2nd Edition 978-0-470-58589-4 Hobbies/General Chess For Dummies, 2nd Edition 978-0-7645-8404-6 Drawing Cartoons & Comics For Dummies 978-0-470-42683-8 Knitting For Dummies, 2nd Edition 978-0-470-28747-7 Organizing For Dummies 978-0-7645-5300-4 Su Doku For Dummies 978-0-470-01892-7 Home Improvement Home Maintenance For Dummies, 2nd Edition 978-0-470-43063-7 Home Theater For Dummies, 3rd Edition 978-0-470-41189-6 Living the Country Lifestyle All-in-One For Dummies 978-0-470-43061-3 Solar Power Your Home For Dummies, 2nd Edition 978-0-470-59678-4 Available wherever books are sold. For more information or to order direct: U.S. customers visit www.dummies.com or call 1-877-762-2974. U.K. customers visit www.wileyeurope.com or call (0) 1243 843291. Canadian customers visit www.wiley.ca or call 1-800-567-4797. 28_9780470371732-badvert01.indd 40928_9780470371732-badvert01.indd 409 7/6/11 7:04 PM7/6/11 7:04 PM www.it-ebooks.info Internet Blogging For Dummies, 3rd Edition 978-0-470-61996-4 eBay For Dummies, 6th Edition 978-0-470-49741-8 Facebook For Dummies, 3rd Edition 978-0-470-87804-0 Web Marketing For Dummies, 2nd Edition 978-0-470-37181-7 WordPress For Dummies, 3rd Edition 978-0-470-59274-8 Language & Foreign Language French For Dummies 978-0-7645-5193-2 Italian Phrases For Dummies 978-0-7645-7203-6 Spanish For Dummies, 2nd Edition 978-0-470-87855-2 Spanish For Dummies, Audio Set 978-0-470-09585-0 Math & Science Algebra I For Dummies, 2nd Edition 978-0-470-55964-2 Biology For Dummies, 2nd Edition 978-0-470-59875-7 Calculus For Dummies 978-0-7645-2498-1 Chemistry For Dummies 978-0-7645-5430-8 Microsoft Office Excel 2010 For Dummies 978-0-470-48953-6 Office 2010 All-in-One For Dummies 978-0-470-49748-7 Office 2010 For Dummies, Book + DVD Bundle 978-0-470-62698-6 Word 2010 For Dummies 978-0-470-48772-3 Music Guitar For Dummies, 2nd Edition 978-0-7645-9904-0 iPod & iTunes For Dummies, 8th Edition 978-0-470-87871-2 Piano Exercises For Dummies 978-0-470-38765-8 Parenting & Education Parenting For Dummies, 2nd Edition 978-0-7645-5418-6 Type 1 Diabetes For Dummies 978-0-470-17811-9 Pets Cats For Dummies, 2nd Edition 978-0-7645-5275-5 Dog Training For Dummies, 3rd Edition 978-0-470-60029-0 Puppies For Dummies, 2nd Edition 978-0-470-03717-1 Religion & Inspiration The Bible For Dummies 978-0-7645-5296-0 Catholicism For Dummies 978-0-7645-5391-2 Women in the Bible For Dummies 978-0-7645-8475-6 Self-Help & Relationship Anger Management For Dummies 978-0-470-03715-7 Overcoming Anxiety For Dummies, 2nd Edition 978-0-470-57441-6 Sports Baseball For Dummies, 3rd Edition 978-0-7645-7537-2 Basketball For Dummies, 2nd Edition 978-0-7645-5248-9 Golf For Dummies, 3rd Edition 978-0-471-76871-5 Web Development Web Design All-in-One For Dummies 978-0-470-41796-6 Web Sites Do-It-Yourself For Dummies, 2nd Edition 978-0-470-56520-9 Windows 7 Windows 7 For Dummies 978-0-470-49743-2 Windows 7 For Dummies, Book + DVD Bundle 978-0-470-52398-8 Windows 7 All-in-One For Dummies 978-0-470-48763-1 Available wherever books are sold. For more information or to order direct: U.S. customers visit www.dummies.com or call 1-877-762-2974. U.K. customers visit www.wileyeurope.com or call (0) 1243 843291. Canadian customers visit www.wiley.ca or call 1-800-567-4797. Learn to: • Create a Profle, navigate the site, and use privacy features • Find friends and post messages • Add applications and upload photos to your Facebook page • Build a fan page or get the word out about an event Leah Pearlman Carolyn Abram Facebook 3rd EditionMaking Everyt hing Easier!™ Peter Weverka Author of PowerPoint All-in-One For Dummies 8 IN 1BOOKSBOOKS • Common Ofce Tools • Word • Outlook® • PowerPoint® • Excel® • Access® • Publisher • Ofce 2010 — One Step Beyond Ofce 2010 ALL-IN-ONE Making Everyth ing Easier!™ Microsoft ® ART IS TK TO BE INSERTED DURING ROUTING Edward C. Baig Bob “Dr. Mac” LeVitus • Set up your iPad, use the multitouch interface, and get connected • Surf the Web, listen to music, watch videos, and download apps • Turn your iPad into a portable game console IN FULL COLOR! Learn to: iPad ™ Making Ever ything Easier! ™ Andy Rathbone Author of all previous editions of Windows For Dummies Learn to: • potksed7 swodniW ruoy ez i lanosreP with your own photos • ni -t l iub htiw swodniW pu deepS shortcuts • lno ot sgninraw swodniW ezimotsuC y give the notices you want • evoM your files from your old PC to a Windows 7 computer Windows® 7 ™ 28_9780470371732-badvert01.indd 41028_9780470371732-badvert01.indd 410 7/6/11 7:04 PM7/6/11 7:04 PM www.it-ebooks.info Wherever you are in life, Dummies makes it easier. Visit us at Dummies.com From fashion to Facebook®, wine to Windows®, and everything in between, Dummies makes it easier. 28_9780470371732-badvert01.indd 41128_9780470371732-badvert01.indd 411 7/6/11 7:04 PM7/6/11 7:04 PM www.it-ebooks.info DIY • Consumer Electronics • Crafts • Software • Cookware • Hobbies • Videos • Music • Games • and More! For more information, go to Dummies.com® and search the store by category. Dummies products make life easier! 28_9780470371732-badvert01.indd 41228_9780470371732-badvert01.indd 412 7/6/11 7:04 PM7/6/11 7:04 PM www.it-ebooks.info Start with FREE Cheat Sheets Cheat Sheets include • Checklists • Charts • Common Instructions • And Other Good Stuff! Get Smart at Dummies.com Dummies.com makes your life easier with 1,000s of answers on everything from removing wallpaper to using the latest version of Windows. Check out our • Videos • Illustrated Articles • Step-by-Step Instructions Plus, each month you can win valuable prizes by entering our Dummies.com sweepstakes. * Want a weekly dose of Dummies? Sign up for Newsletters on • Digital Photography • Microsoft Windows & Office • Personal Finance & Investing • Health & Wellness • Computing, iPods & Cell Phones • eBay • Internet • Food, Home & Garden Find out “HOW” at Dummies.com *Sweepstakes not currently available in all countries; visit Dummies.com for official rules. Get More and Do More at Dummies.com® To access the Cheat Sheet created specifically for this book, go to www.dummies.com/cheatsheet/java Mobile Apps There’s a Dummies App for This and That With more than 200 million books in print and over 1,600 unique titles, Dummies is a global leader in how-to information. Now you can get the same great Dummies information in an App. With topics such as Wine, Spanish, Digital Photography, Certification, and more, you’ll have instant access to the topics you need to know in a format you can trust. To get information on all our Dummies apps, visit the following: www.Dummies.com/go/mobile from your computer. www.Dummies.com/go/iphone/apps from your phone. www.it-ebooks.info
还剩434页未读

继续阅读

下载pdf到电脑,查找使用更方便

pdf的实际排版效果,会与网站的显示效果略有不同!!

需要 8 金币 [ 分享pdf获得金币 ] 0 人已下载

下载pdf

pdf贡献者

kingnot

贡献于2014-05-02

下载需要 8 金币 [金币充值 ]
亲,您也可以通过 分享原创pdf 来获得金币奖励!
下载pdf