Programmer's Guide to Java SCJP Certification, 3rd Edition

  

  

A Programmer’s Guide to

Java SCJP Certification Third Edition

  This page intentionally left blank

  

A Programmer’s Guide to

  

Java SCJP Certification

A Comprehensive Primer Third Edition Khalid A. Mughal Rolf W. Rasmussen

  Upper Saddle River, New Jersey • Boston • Indianapolis • San Francisco New York • Toronto • Montreal • London • Munich • Paris • Madrid Capetown • Sidney • Tokyo • Singapore • Mexico City

   Many of the designations used by manufacturers and sellers to distinguish their products are claimed as trademarks. Where those designations appear in this book, and the publisher was aware of a trademark claim, the designations have been printed with initial capital let- ters or in all capitals.

  The authors and publisher have taken care in the preparation of this book, but make no expressed or implied warranty of any kind and assume no responsibility for errors or omis- sions. No liability is assumed for incidental or consequential damages in connection with or arising out of the use of the information or programs contained herein.

  The publisher offers excellent discounts on this book when ordered in quantity for bulk pur- chases or special sales, which may include electronic versions and/or custom covers and content particular to your business, training goals, marketing focus, and branding interests. For more information, please contact:

  U.S. Corporate and Government Sales (800) 382-3419 [email protected]

  For sales outside the United States please contact: International Sales [email protected]

  Visit us on the Web: informit.com/aw

  Library of Congress Cataloging-in-Publication Data Mughal, Khalid Azim.

  A programmer's guide to Java SCJP certification : a comprehensive primer / Khalid A. Mughal, Rolf W. Rasmussen.—3rd ed. p. cm. Previously published under title: A programmer’s guide to Java certification. Includes bibliographical references and index.

  ISBN 0-321-55605-4 (pbk. : alk. paper)

  1. Electronic data processing personnel--Certification. 2. Operating systems (Comput- ers)—Examinations--Study guides. 3. Java (Computer program language)--Examinations-- Study guides. I. Rasmussen, Rolf (Rolf W.) II. Mughal, Khalid Azim. Programmer’s guide to Java certification. III. Title.

  QA76.3.M846 2008 005.2'762--dc22 2008048822 Copyright © 2009 Pearson Education, Inc.

  All rights reserved. Printed in the United States of America. This publication is protected by copyright, and permission must be obtained from the publisher prior to any prohibited reproduction, storage in a retrieval system, or transmission in any form or by any means, electronic, mechanical, photocopying, recording, or likewise. For information regarding permissions, write to:

  ISBN-13: 978-0-321-55605-9

  ISBN-10: 0-321-55605-4 Text printed in the United States on recycled paper at Courier in Stoughton, Massachusetts. First printing, December 2008

  

  To the loving memory of my mother, Zubaida Begum, and my father, Mohammed Azim.

  —K.A.M.

  For Olivia E. Rasmussen and Louise J. Dahlmo.

  —R.W.R.

  This page intentionally left blank

  vii Contents Overview

  6 Control Flow 203

  13 Threads 613

  

12 Localization, Pattern Matching and Formatting 531

  11 Files and Streams 467

  

10 Fundamental Classes 423

  9 Object Lifetime 389

  

8 Nested Type Declarations 351

  

7 Object-Oriented Programming 283

  

5 Operators and Expressions 159

  Foreword xxxv Preface xxxvii

  4 Access Control 103

  39

  3 Declarations

  19

  2 Language Fundamentals

  1

  1 Basics of Java Programming

  14 Generics 661

  viii CONTENTS

15 Collections and Maps

  747 A Taking the SCJP 1.6 Exam 851 B Objectives for the SCJP 1.6 Exam 857 C Objectives for the SCJP 1.6 Upgrade Exam 863 D Annotated Answers to Review Questions 869 E Solutions to Programming Exercises 935 F Mock Exam 959 G Number Systems and Number Representation 1005 Index 1013

  ix Contents

  

  

  

  

  

  

  

  

  

  

  

  

  

  

  

  

  

  

  

  

  

  

  

  

  

  

  

  

  

  

  

  

  

  x CONTENTS

  

  

  

  

  

  

  

  

  

  

  

  

  

  

  

  

  

  

  

  

  

  

  

  

  

  

  

  

  

  

  

  

  

  

  

  

  

  

  

  

  

  

  

  

  

  

  

  

  

  

  

  

  

  CONTENTS xi

  

  

  

  

  

  

  

  

  

  

  

  

  

  

  

  

  

  

  

  

  

  

  

  

  

  

  

  

  

  

  

  

  

  

  

  

  

  

  

  

  

  

  

  

  

  

  

  

  

  

  xii CONTENTS

  

  

  

  

  

  

  

  

  

  

  

  

  

  

  

  

  

  

  

  

  

  

  

  

  

  

5 Operators and Expressions 159

  CONTENTS xiii

  

  

  

  

  

  

  

  

  

  

  

  

  

  

  

  

  

  

  

  

  

  

  

  

  

  

  

  

  

  

  

  

  

  

  

  

  

  

  xiv CONTENTS

  

  

  

  

  

  

  

  

  

  

  

  

  

  

  

  

  

  

  

  

  

  

  

  

  

  

  

  

  

  

  

  

  

  

  

  

  

  

  

  

  

  

7 Object-Oriented Programming 283

  CONTENTS xv

  

  

  

  

  

  

  

  

  

  

  

  

  

  

  

  

  

  

  

  

  

  

  

  

  

  

  

  

  

  

  

  

  

  

  

  

  

  

  

  

  

  

  

  

8 Nested Type Declarations 351

  xvi CONTENTS

  

  

  

  

  

  

  

  

  

  

  

  

  

  

  

  

  

  

  

  

  

  

  

  

  

  

  

  

  

  

  

  

  

  

  

  

  

  

  

  

  

  

  CONTENTS xvii

  

  

  

  

  

  

  

  

  

  

  

  

  

  

  

  

  

  

  

  

  

  

  

  

  

  

  

  

  

  

  

  

  xviii CONTENTS

  

  

  

  

  

  

12 Localization, Pattern Matching, and Formatting 531

  

  

  

  

  

  

  

  

  

  

  

  

  

  

  

  

  

  

  

  

  

  

  

  

  

  

  CONTENTS xix

  

  

  

  

  

  

  

  

  

  

  

  

  

  

  

  

  

  

  

  

  

  

  

  

  

  

  

  

  

  

  

  

  

  

  

  

  

  

  

  

  

  

  xx CONTENTS

  

  

  

  

  

  

  

  

  

  

  

  

  

  

  

  

  

  

  

  

  

  

  

  

  

  

  

  

  

  

  

  

  

  

  

  

  CONTENTS xxi

  

  

  

  

  

  

  

  

  

  

  

  

  

  

  

  

  

  

  

  

  

  

  

  

  

  

  

  

  

  

  

  

  

  

  

  

  

  

  

  xxii CONTENTS

  

  

  

  

  

  

  

  

  

  

  

  

  

  

  

Chapter 1 1

  xxiii

  4.10 Private Accessibility 144

  4.1 Java Source File Structure 104

  4.2 Package Hierarchy 105

  4.3 File Hierarchy 116

  4.4 Searching for Classes 118

  4.5 Searching in JAR files 121

  4.6 Block Scope 132

  4.7 Public Accessibility 141

  4.8 Protected Accessibility 142

  4.9 Default Accessibility 143

  5.1 Widening Primitive Conversions 160

  1.1 UML Notation for Classes

  5.2 Overflow and Underflow in Floating-point Arithmetic 176

  5.3 Numeric Promotion in Arithmetic Expressions 181

  6.1 Activity Diagram for if Statements 205

  6.2 Activity Diagram for a switch Statement 208

  6.3 Activity Diagram for the while Statement 217

  6.4 Activity Diagram for the do-while Statement 218

  6.5 Activity Diagram for the for Statement 219

  6.6 Enhanced for Statement 221

  6.7 Method Execution 237

  87 Chapter 4 103

  3.5 Parameter Passing: Arrays

  85

  1.6 Class Diagram Depicting Inheritance Relationship

  3

  1.2 UML Notation for Objects

  5

  1.3 Aliases

  6

  1.4 Class Diagram Showing Static Members of a Class

  8

  1.5 Members of a Class

  9

  10

  3.4 Parameter Passing: Reference Values

  1.7 Class Diagram Depicting Aggregation

  12 Chapter 2 19

  2.1 Primitive Data Types in Java

  28 Chapter 3 39

  3.1 The Event Model

  43

  3.2 Array of Arrays

  78

  3.3 Parameter Passing: Primitive Data Values

  84

Chapter 5 159

Chapter 6 203

  xxiv LIST OF FIGURES

  13.7 Thread Communication 642

  11.6 Buffered Writers 496

  11.7 Buffered Readers 497

  11.8 Keyboard and Display as Console 501

  11.9 Object Stream Chaining 511

  Chapter 12 531 Chapter 13 613

  13.1 Spawning Threads Using a Runnable Object 616

  13.2 Spawning Threads—Extending the Thread Class 620

  13.3 Thread States 635

  13.4 Running and Yielding 639

  13.5 Sleeping and Waking up 640

  13.6 Waiting and Notifying 641

  13.8 Stack Users 643

  11.4 Setting up a PrintWriter to Write to a File 493

  13.9 Joining of Threads 648

  13.10 Deadlock 652

  Chapter 14 661

  14.1 Extending Generic Types 668

  14.2 No Subtype Covariance for Parameterized Types 674

  14.4 Partial Type Hierarchy for Node<? super Integer> 676

  14.3 Partial Type Hierarchy for Node<? extends Number> 676

  14.5 Partial Type Hierarchy for Selected Parameterized Types of Node<E> 678

  14.6 Flexible Comparisons with Wildcards 709

  Chapter 15 747

  15.1 The Core Interfaces 778

  11.5 Setting up Readers to read Characters 494

  11.3 Partial Character Stream Inheritance Hierarchies 489

  6.8 Exception Propagation 238

  7.4 Type Hierarchy to Illustrate Polymorphism 340

  6.9 Partial Exception Inheritance Hierarchy 240

  6.10 The try-catch-finally Construct 246

  6.11 Exception Handling (Scenario 1) 248

  6.12 Exception Handling (Scenario 2) 249

  6.13 Exception Handling (Scenario 3) 250

  6.14 Execution of the Simple assert Statement (with Assertions Enabled) 266

  6.15 Package Hierarchy 271

  Chapter 7 283

  7.1 Inheritance Hierarchy 287

  7.2 Inheritance Relations 314

  7.3 Reference Type Hierarchy: Arrays and Subtype Covariance 318

  7.5 Implementing Data Structures by Inheritance and Aggregation 342

  11.2 Stream Chaining for Reading and Writing Binary Values to a File 481

  Chapter 8 351

  8.1 Static Member Classes and Interfaces 358

  8.2 Outer Object with Associated Inner Objects 362

  8.3 Nested Classes and Inheritance 366

  8.4 Local Classes and Inheritance Hierarchy 374

  Chapter 9 389

  9.1 Memory Organization at Runtime 392

  Chapter 10 423

  10.1 Partial Inheritance Hierarchy in the java.lang Package 424

  10.2 Converting Values Between Primitive, Wrapper, and String Types 429

  Chapter 11 467

  11.1 Partial Byte Stream Inheritance Hierarchies 476

   LIST OF FIGURES

  XXV

  15.2 The Core Collection Interfaces and Their Implementations 781

  15.3 The Core Map Interfaces and Their Implementations 782

  15.4 Bulk Operations on Collections 785 G.1 Converting between Binary, Octal, and Hexadecimal 1008

  

  This page intentionally left blank

Chapter 1 1

  xxvii

  5.1 Selected Conversion Contexts and Conversion Categories 163

  2.14 Default Values

  33 Chapter 3 39

  3.1 Parameter Passing By Value

  82 Chapter 4 103

  4.1 Accessing Members within a Class 130

  4.2 Summary of Accessibility Modifiers for Top-Level Types 135

  4.3 Summary of Other Modifiers for Types 137

  4.4 Summary of Accessibility Modifiers for Members 144

  4.5 Summary of Other Modifiers for Members 153

  5.3 Examples of Truncated Values 172

  5.2 Operator Summary 167

  2.13 Summary of Primitive Data Types

  5.4 Arithmetic Operators 174

  5.5 Examples of Arithmetic Expression Evaluation 180

  5.6 Arithmetic Compound Assignment Operators 183

  5.7 Relational Operators 191

  5.9 Reference Equality Operators 192

  5.8 Primitive Data Value Equality Operators 192

  5.10 Truth-Values for Boolean Logical Operators 195

  5.11 Boolean Logical Compound Assignment Operators 196

  5.12 Conditional Operators 196

  30

  30

  1.1 Terminology for Class Members

  22

  10 Chapter 2 19

  2.1 Keywords in Java

  21

  2.2 Reserved Literals in Java

  21

  2.3 Reserved Keywords not Currently in Use

  21

  2.4 Examples of Literals

  21

  2.5 Examples of Decimal, Octal, and Hexadecimal Literals

  2.6 Examples of Character Literals

  2.12 Boolean Values

  23

  2.7 Escape Sequences

  24

  2.8 Examples of Escape Sequence \ddd

  25

  2.9 Range of Integer Values

  28

  2.10 Range of Character Values

  29

  2.11 Range of Floating-Point Values

  29

Chapter 5 159

  xxviii LIST OF TABLES

  13.1 Thread States 636

  12.9 Selected Character Classes 556

  12.10 Selected Predefined Character Classes 557

  12.11 Boundary Matchers 557

  12.12 Selected Logical Operators 558

  12.13 Quantifier Classification 561

  12.14 Implications of the Limit Value in the split() Method 564

  12.15 Formatting Conversions 596

  12.16 Flags 597

  12.18 Selected Format Exceptions 601

  12.17 Selected Time/Date Composition Conversions 601

  Chapter 13 613

  Chapter 14 661

  12.7 Formatting Styles for Date and Time 542

  14.1 Summary of Subtyping Relationships for Generic Types 675

  14.2 Get and Set Operations Using Parameterized References 682

  14.3 Summary of Get and Set Operations using Parameterized References 684

  14.4 Examples of Type Erasure 714

  14.5 Examples of Reifiable Types 723

  14.6 Examples of Non-Reifiable Types 723

  Chapter 15 747

  15.1 Core Interfaces in the Collections Framework 779

  15.2 Summary of Collection and Map Implementations 782

  15.3 Bulk Operations and Set Logic 796 G.1 Number Systems

  1005 G.2 Representing Signed byte Values Using 2’s Complement 1010

  12.8 Selected Characters 555

  12.6 Selected Constants that Represent Values in a Calendar 538

  5.13 Truth-values for Conditional Operators 197

  11.2 Selected Output Streams 477

  Chapter 6 203

  6.1 The return Statement 228

  6.2 Granularities for Enabling and Disabling Assertions at Runtime 269

  6.3 Enabling and Disabling Assertions in All System Classes at Runtime 272

  Chapter 7 283

  7.1 Overriding vs. Overloading 293

  7.2 Types and Values 317

  Chapter 8 351

  8.1 Overview of Type Declarations 354

  Chapter 9 389 Chapter 10 423 Chapter 11 467

  11.1 Selected Input Streams 477

  11.3 The DataInput and DataOutput Interfaces 480

  12.5 Selected Field Numbers to Indicate Information in a Calendar 537

  11.4 Selected Readers 488

  11.5 Selected Writers 490

  11.6 Print Methods of the

  

PrintWriter

  Class 491

  11.7 Correspondence Between Selected Byte and Character Streams 500

  Chapter 12 531

  12.1 Selected Language Codes 532

  12.2 Selected Country Codes 532

  12.3 Selected Predefined Locales for Languages 533

  12.4 Selected Predefined Locales for Countries 533

  

Chapter 1 1

  3.15 Calling a Varargs Method

  78

  3.10 Passing Primitive Values

  83

  3.11 Passing Reference Values

  84

  3.12 Passing Arrays

  86

  3.13 Array Elements as Primitive Data Values

  88

  3.14 Array Elements as Reference Values

  88

  91

  75

  3.16 Passing Program Arguments

  95 Chapter 4 103

  4.1 Defining Packages and Using Type Import 107

  4.2 Single Static Import 110

  4.3 Avoiding the Interface Constant Antipattern 110

  4.4 Importing Enum Constants 111

  4.5 Shadowing by Importing 112

  4.6 Conflict in Importing Static Method with the Same Signature 113

  4.7 Importing Nested Static Types 114

  4.8 Using Properties 123

  4.9 Class Scope 131

  4.10 Accessibility Modifiers for Classes and Interfaces 133

  3.9 Using Multidimensional Arrays

  xxix

  1.1 Basic Elements of a Class Declaration

  35 Chapter 3 39

  3

  1.2 Static Members in Class Declaration

  8

  1.3 Defining a Subclass

  11

  1.4 An Application

  15 Chapter 2 19

  2.1 Default Values for Fields

  33

  2.2 Flagging Uninitialized Local Variables of Primitive Data Types

  34

  2.3 Flagging Uninitialized Local Reference Variables

  3.1 A JavaBean

  73

  42

  3.2 Using the this Reference

  46

  3.3 Namespaces

  49

  3.4 Using Enums

  55

  3.5 Declaring Enum Constructors and Members

  56

  3.6 Declaring Constant-Specific Class Bodies

  60

  3.7 Using Arrays

  3.8 Using Anonymous Arrays

  xxx

LIST OF EXAMPLES

  4.12 Public Accessibility of Members 139

  7.11 Overloaded Method Resolution 326

  7.2 Overriding, Overloading, and Hiding 290

  7.3 Using the super Keyword 296

  7.4 Constructor Overloading 302

  7.5 The this() Constructor Call 304

  7.6 The super() Constructor Call 305

  7.7 Interfaces 311

  7.8 Variables in Interfaces 315

  7.9 Assigning and Passing Reference Values 320

  7.10 Choosing the Most Specific Method (Simple Case) 325

  7.12 The instanceof and Cast Operators 329

  6.18 Using Assertions 267

  7.13 Using the instanceof Operator 330

  7.14 Polymorphism and Dynamic Method Lookup 341

  7.15 Implementing Data Structures by Inheritance and Aggregation 342

  8.1 Overview of Type Declarations 353

  8.2 Static Member Types 355

  8.3 Importing Static Member Types 357

  8.4 Accessing Members in Enclosing Context (Static Member Classes) 358

  8.5 Defining and Instantiating Non-static Member Classes 360

  

  7.1 Extending Classes: Inheritance and Accessibility 285

  6.17 The throws Clause 258

  4.13 Accessing Static Members 147

  6.5 The break Statement 224

  4.14 Accessing Final Members 149

  4.15 Synchronized Methods 151

  5.1 Operand Evaluation Order 175

  5.2 Numeric Promotion in Arithmetic Expressions 181

  5.3 Short-Circuit Evaluation Involving Conditional Operators 198

  6.1 Fall Through in a switch Statement 208

  6.2 Using break in a switch Statement 210

  6.3 Nested switch Statement 211

  6.4 Enums in switch Statement 212

  6.6 Labeled break Statement 225

  4.11 Abstract Classes 136

  6.7 The continue Statement 226

  6.8 Labeled continue Statement 227

  6.9 The return Statement 228

  6.10 Method Execution 236

  6.11 The try-catch Construct 247

  6.12 Exception Propagation 250

  6.13 The try-catch-finally Construct 253

  6.14 The try-finally Construct 254

  6.15 The finally Block and the return Statement 255

  6.16 Throwing Exceptions 256

LIST OF EXAMPLES

  12.2 Using the Date class 536

  11.2 Copy a File 478

  11.3 Reading and Writing Binary Values 482

  11.4 Demonstrating Readers and Writers, and Character Encoding 498

  11.5 Changing Passwords 503

  11.6 Object Serialization 513

  11.7 Non-Serializable Objects 515

  11.8 Customized Serialization 518

  11.9 Serialization and Inheritance 520

  12.1 Understanding Locales 534

  12.3 Using the Calendar Class 540

  10.4 Reading Characters from a String 444

  12.4 Formatting Date/Time 543

  12.5 Using the DateFormat class 544

  12.6 Using the NumberFormat class 548

  12.7 Splitting 565

  12.8 String Pattern Matching 568

  12.9 Match and Replace 570

  12.10 Tokenizing Mode 573

  12.11 Parsing Primitive Values and Strings 576

  12.12 Using Delimiters and Patterns with a Scanner 580

  

  11.1 Listing Files Under a Directory 474

  xxxi

  8.6 Special Form of this and new Constructs in Non-static Member Classes

  9.2 Using Finalizers 397

  363

  8.7 Inheritance Hierarchy and Enclosing Context 365

  8.8 Extending Inner Classes 367

  8.9 Access in Enclosing Context (Local Classes) 371

  8.10 Instantiating Local Classes 374

  8.11 Objects of Local Classes as Caches 376

  8.12 Defining Anonymous Classes 378

  8.13 Accessing Declarations in Enclosing Context (Anonymous Classes) 381

  9.1 Garbage Collection Eligibility 394

  9.3 Invoking Garbage Collection 400

  10.2 String Representation of Integers 435

  9.4 Initializer Expression Order and Method Calls 408

  9.5 Exceptions in Initializer Expressions 409

  9.6 Static Initializers and Forward References 411

  9.7 Static Initializer Blocks and Exceptions 412

  9.8 Instance Initializers and Forward References 414

  9.9 Instance Initializer Block in Anonymous Class 414

  9.10 Exception Handling in Instance Initializer Blocks 415

  9.11 Object State Construction 417

  9.12 Initialization under Object State Construction 419

  10.1 Methods in the Object class 426

  10.3 String Construction and Equality 441

  xxxii

LIST OF EXAMPLES

  12.14 Using the format() Method 603

  15.10 Natural Ordering and Total Ordering 773

  15.1 A Test Case for Version Numbers 749

  15.2 Not Overriding the equals() and the hashCode() Methods 752

  15.3 Testing the equals() and the hashCode() Methods 752

  15.4 Implementing the equals() Method 756

  15.5 Implications of Overriding the equals() Method 759

  15.6 Implementing the hashCode() Method 762

  15.7 Implications of Overriding the hashCode() Method 765

  15.8 Implementing the compareTo() Method of the Comparable Interface 767

  15.9 Implications of Implementing the compareTo() Method 769

  15.11 Using a Comparator for Version Numbers 774

  14.16 Type Parameter in throws Clause 731

  15.12 Using an Iterator 786

  15.13 Using a for(:) Loop to Iterate Over a Collection 789

  15.14 Converting Collections to Arrays 790

  15.15 Traversing Over Sets 797

  15.16 Using Sets 799

  15.17 Using Navigable Sets 803

  15.18 Using Lists 808

  15.19 Using Priority Queues 811

  

  14.17 Generic Nested Classes 732

  14.15 Genericity Cannot Be Added to Inherited Methods 722

  13.1 Implementing the Runnable Interface 618

  14.3 A Generic Interface and its Implementation 667

  13.2 Extending the Thread Class 621

  13.3 Mutual Exclusion 628

  13.4 Thread States 637

  13.5 Waiting and Notifying 644

  13.6 Joining of Threads 648

  13.7 Thread Termination 651

  13.8 Deadlock 652

  14.1 A Legacy Class 662

  14.2 A Generic Class for Nodes 664

  14.4 Extending Generic Types 669

  12.13 Multi-Line Mode 582

  14.5 Unchecked Warnings 671

  14.6 Illustrating Get and Set Operations Using Parameterized References 681

  14.7 Implementing a Simplified Generic Stack 695

  14.8 Declaring and Calling Generic Methods 697

  14.9 Flexible Comparisons 710

  14.10 Using Recursive Bounds 712

  14.11 Using the @Override Annotation 719

  14.12 Subsignatures 720

  14.13 Overriding from Generic Supertype 720

  14.14 Missing Supertype Parameterization 721

LIST OF EXAMPLES

  xxxiii

  15.20 Using Deques as a Stack and as a FIFO Queue 815

  15.21 Using Maps 825

  15.22 Using Navigable Maps 831

  

  This page intentionally left blank

  

  Consider the following observations:

  • Software continues to become ever more pervasive, ever more ubiquitous in our lives.
  • Incompetence seems to be the only thing we can count on in today’s world and, especially, in the domain of software.
  • The Java programming language has become a lingua franca for programmers all over the world.

  One can draw varied conclusions from these comments. One of them is that it is of great importance that programmers working with the Java programming lan- guage should be as competent as possible. The Java certification program is an important effort aimed at precisely this goal. Practitioners looking to obtain such certification need good quality training mate- rials, which brings us to this book.

  Programming is still more of an art than a science, and will continue to be so for the foreseeable future. Mastering the intricacies of a large and complex program- ming language is a challenging task that requires time and effort, and above all experience.

  Real programming requires more than just mastery of a programming language. It requires mastery of a computing platform, with a rich set of libraries. These librar- ies are designed to simplify the task of building realistic applications, and they do. Again, the practitioner is faced with a daunting task. To address the clear need for professional training material, a plethora of books have been written purporting to tutor programmers in the programming language and platform skills they require. The choice is as mind boggling as the material within the books themselves. Should one try Java for Frontally Lobotomized Simians or Postmodern Java Dialectics? The readership for these books is largely self selecting. I trust that if you, the reader,

  xxxv

  xxxvi FOREWORD

  have gotten this far, you are looking for something that is intelligent, yet practical. This book is one of the finest efforts in this crowded arena. It brings a necessary level of academic rigor to an area much in need of it, while retaining an essentially pragmatic flavor.

  The material in this book is probably all you need to pass the Java certification exam. It certainly isn’t all you need to be a good software engineer. You must con- tinue learning about new technologies. The hardest part of this is dealing with things that are completely different from what you are familiar with. Yet this is what distinguishes the top flight engineer from the mediocre one. Keep an open mind; it pays.

  Gilad Bracha

  Computational Theologist Sun Java Software

   Writing the Third Edition

  The exam for the Sun Certified Programmer for Java Platform, Standard Edition 6, has changed considerably since the second edition of this book was published. The most noticeable change in the current version of the Sun Certified Java Program- mer (SCJP) 1.6 exam is the inclusion of the features of Java 5, and the shifting of emphasis towards analyzing code scenarios, rather than individual language con- structs. In our opinion, the new exam demands an even greater understanding and actual experience of the language, rather than mere recitation of facts. Proficiency in the language is the key to success.

  Since the emphasis of the SCJP 1.6 exam is on the core features of Java, the third edition provides even greater in-depth coverage of the relevant topics. The book covers not just the exam objectives, but also supplementary topics that aid in mas- tering the exam topics.

  The third edition is still a one-source guide for the SCJP 1.6 exam: it provides a mix- ture of theory and practice for the exam. Use the book to learn Java, pass the SCJP 1.6 exam, and afterwards, use it as a handy language guide. The book also has an appendix devoted to the SCJP 1.6 Upgrade exam.

  We have taken into consideration the feedback we have received from readers. The many hours spent in handling the deluge of e-mail have not been in vain. Every single e-mail is appreciated and is hereby acknowledged. Preparing the third edition dispelled our illusions about newer editions being, to put it colloquially, a piece of cake. Every sentence from the second edition has been weighed carefully, and not many paragraphs have escaped rewriting. UML (Uni- fied Modeling Language) is also extensively employed in this edition. Numerous new review questions have been added. In covering the new topics and expanding the existing ones, new examples, figures, and tables were also specifically created for the third edition.

  xxxvii

  xxxviii PREFACE

  About This Book

  This book provides extensive coverage of the Java programming language and its core Application Programming Interfaces (APIs), with particular emphasis on its syntax and usage. The book is primarily intended for professionals who want to prepare for the SCJP 1.6 exam, but it is readily accessible to any programmer who wants to master the language. For both purposes, it provides in-depth coverage of essential features of the language and its core APIs.

  There is a great and increasing demand for certified Java programmers. Sun Microsystems has defined the SCJP 1.6 exam as one that professionals can take to validate their skills. The certification provides the IT industry with a standard to use for hiring such professionals, and allows the professionals to turn their Java skills into credentials that are important for career advancement.

  The book provides extensive coverage of all the objectives defined for the exam by Sun. But the exam objectives are selective and do not include many of the essential features of Java. This book covers many additional topics that every Java program- mer should master in order to be proficient. In this regard, the book is a compre- hensive primer for learning the Java programming language. After mastering the language by working through this book, the reader can confidently sit for the exam.

  This book is not a complete reference for Java, as it does not attempt to list every member of every class from the Java Development Kit (JDK) API documentation. The purpose is not to document the JDK APIs. This book does not teach programming techniques. The emphasis is on the Java programming language features, their syntax and correct usage through code examples. The book assumes little background in programming. We believe the exam is accessible to any programmer who works through the book. A Java programmer can easily skip over material that is well understood and concentrate on parts that need reinforcing, whereas a programmer new to Java will find the concepts explained from basic principles. Each topic is explained and discussed thoroughly with examples, and backed by review questions and exercises to reinforce the concepts. The book is not biased toward any particular platform, but provides platform-specific details where necessary.

  Using the Book

  The reader can choose a linear or a non-linear route through the book, depending on her programming background. Non-Java programmers wishing to migrate to Java can read Chapter 1, which provides a short introduction to object-oriented programming concepts, and the procedure for compiling and running Java appli-

   PREFACE xxxix

  cations. For those preparing for the SCJP 1.6 exam, the book has a separate appen- dix providing all the pertinent information on taking the exam. The table of contents; listings of tables, examples, and figures; and a comprehen- sive index facilitate locating topics discussed in the book. In particular, we draw attention to the following features:

  Exam Objectives 0.1 Exam objectives are stated clearly at the start of every chapter.

  0.2 The number in front of the objective identfies the objective as defined by Sun.

  0.3 The objectives are organized into major sections, detailing the curriculum for the exam.

  0.4 The exam objectives are reproduced in Appendix B where, for each section of the syllabus, references are included to point the reader to relevant topics for the exam.

  Supplementary Objectives

  • Supplementary objectives cover topics that are not on the exam, but which we believe are important for mastering the topics that are on the exam.
  • Any supplementary objectives are listed as bullets at the beginning of a chapter.

  Review Questions

  Review questions are provided after every major topic, in order to test and rein- force the material. These review questions reflect the kinds of questions that can be asked on the actual exam. Annotated answers to the review questions are provided in a separate appendix.

  Example 0.1 Example Source Code

  We encourage experimenting with the code examples in order to reinforce the material from the book. These can be downloaded from the book Web site (see p. xli).

  a mono-spaced font

  Java code is written in . Lines of code in the examples or in code snippets are referenced in the text by a number, which is specified by using a single-line comment in the code. For example, in the following code snippet, the

  doSomethingInteresting()

  call to the method hopefully does something interesting at (1).

  

  xl PREFACE

  // ... doSomethingInteresting(); // (1) // ...

  Names of classes and interfaces start with an uppercase letter. Names of packages, variables, and methods start with a lowercase letter. Constants are all in uppercase

  'I'

  letters. Interface names begin with the prefix . Coding conventions are fol- lowed, except when we have had to deviate in the interest of space or clarity.

  Chapter Summary

  Each chapter concludes with a summary of the topics, pointing out the major con- cepts discussed in the chapter.

  Programming Exercises

  Programming exercises at the end of each chapter provide the opportunity to put concepts into practice. Solutions to the programming exercises are provided in a separate appendix.

  Mock Exam

  A complete mock exam is provided in a separate appendix, which the reader can try when she is ready.

  Java SE API Documentation