Location via proxy:   [ UP ]  
[Report a bug]   [Manage cookies]                

D67238GC20 sg1

Download as pdf or txt
Download as pdf or txt
You are on page 1of 282
At a glance
Powered by AI
The document discusses Java syntax, classes, strings, and regular expressions.

The document provides an introduction to Java programming concepts for students in a training course.

Regular expressions can be used to search, parse, and replace strings. They allow matching patterns in text through the use of metacharacters.

Volume I Student Guide

D67238GC20
Edition 2.0
November 2011
D74996

Oracle Internal & Oracle Academy Use Only

Java SE 7 Programming

Authors

Copyright 2011, Oracle and/or it affiliates. All rights reserved.

Michael Williams
Tom McGinn

Disclaimer

Technical Contributors
and Reviewers
Lee Klement
Steve Watts
Brian Earl
Vasily Strelnikov
Andy Smith
Nancy K.A.N
Chris Lamb
Todd Lowry
Ionut Radu
Joe Darcy
Brian Goetz
Alan Bateman
David Holmes

Editors
Richard Wallis
Daniel Milne
Vijayalakshmi Narasimhan

Graphic Designer
James Hans

Publishers
Syed Imtiaz Ali
Sumesh Koshy

This document contains proprietary information and is protected by copyright and


other intellectual property laws. You may copy and print this document solely for your
own use in an Oracle training course. The document may not be modified or altered
in any way. Except where your use constitutes "fair use" under copyright law, you
may not use, share, download, upload, copy, print, display, perform, reproduce,
publish, license, post, transmit, or distribute this document in whole or in part without
the express authorization of Oracle.
The information contained in this document is subject to change without notice. If you
find any problems in the document, please report them in writing to: Oracle University,
500 Oracle Parkway, Redwood Shores, California 94065 USA. This document is not
warranted to be error-free.
Restricted Rights Notice
If this documentation is delivered to the United States Government or anyone using
the documentation on behalf of the United States Government, the following notice is
applicable:
U.S. GOVERNMENT RIGHTS
The U.S. Governments rights to use, modify, reproduce, release, perform, display, or
disclose these training materials are restricted by the terms of the applicable Oracle
license agreement and/or the applicable U.S. Government contract.
Trademark Notice
Oracle and Java are registered trademarks of Oracle and/or its affiliates. Other names
may be trademarks of their respective owners.

Oracle Internal & Oracle Academy Use Only

Matt Heimer

Introduction
Course Goals 1-2
Course Objectives 1-3
Audience 1-5
Prerequisites 1-6
Class Introductions 1-7
Course Environment 1-8
Java Programs Are Platform-Independent 1-9
Java Technology Product Groups 1-10
Java SE Platform Versions 1-11
Downloading and Installing the JDK 1-12
Java in Server Environments 1-13
The Java Community 1-14
The Java Community Process (JCP) 1-15
OpenJDK 1-16
Oracle Java SE Support 1-17
Additional Resources 1-18
Summary 1-19

Java Syntax and Class Review


Objectives 2-2
Java Language Review 2-3
Class Structure 2-4
A Simple Class 2-5
Code Blocks 2-6
Primitive Data Types 2-7
Java SE 7 Numeric Literals 2-9
Java SE 7 Binary Literals 2-10
Operators 2-11
Strings 2-12
String Operations 2-13
if else 2-14
Logical Operators 2-15
Arrays and for-each Loop 2-16
for Loop 2-17

iii

Oracle Internal & Oracle Academy Use Only

Contents

Encapsulation and Subclassing


Objectives 3-2
Encapsulation 3-3
Encapsulation: Example 3-4
Encapsulation: Private Data, Public Methods 3-5
Public and Private Access Modifiers 3-6
Revisiting Employee 3-7
Method Naming: Best Practices 3-8
Employee Class Refined 3-9
Make Classes as Immutable as Possible 3-10
Creating Subclasses 3-11
Subclassing 3-12
Manager Subclass 3-13
Constructors Are Not Inherited 3-14
Using super 3-15
Constructing a Manager Object 3-16
What Is Polymorphism? 3-17
Overloading Methods 3-18
Methods Using Variable Arguments 3-19
Single Inheritance 3-21
iv

Oracle Internal & Oracle Academy Use Only

while Loop 2-18


String switch Statement 2-19
Java Naming Conventions 2-20
A Simple Java Class: Employee 2-21
Employee Class Methods 2-22
Creating an Instance of an Object 2-23
Constructors 2-24
package Statement 2-25
import Statements 2-26
More on import 2-27
Java Is Pass-By-Value 2-28
Pass-By-Value for Object References 2-29
Objects Passed as Parameters 2-30
How to Compile and Run 2-31
Compiling and Running: Example 2-32
Java Class Loader 2-33
Garbage Collection 2-34
Summary 2-35
Quiz 2-36
Practice 2-1 Overview: Creating Java Classes 2-39

Java Class Design


Objectives 4-2
Using Access Control 4-3
Protected Access Control: Example 4-4
Field Shadowing: Example 4-5
Access Control: Good Practice 4-6
Overriding Methods 4-7
Invoking an Overridden Method 4-9
Virtual Method Invocation 4-10
Accessibility of Overridden Methods 4-11
Applying Polymorphism 4-12
Using the instanceof Keyword 4-14
Casting Object References 4-15
Casting Rules 4-16
Overriding Object methods 4-18
Object toString Method 4-19
Object equals Method 4-20
Overriding equals in Employee 4-21
Overriding Object hashCode 4-22
Summary 4-23
Quiz 4-24
Practice 4-1 Overview: Overriding Methods and Applying Polymorphism 4-28

Advanced Class Design


Objectives 5-2
Modeling Business Problems with Classes 5-3
Enabling Generalization 5-4
Identifying the Need for Abstract Classes 5-5
Defining Abstract Classes 5-6
Defining Abstract Methods 5-7
Validating Abstract Classes 5-8
Quiz 5-9
static Keyword 5-10
Static Methods 5-11
Implementing Static Methods 5-12
Calling Static Methods 5-13
v

Oracle Internal & Oracle Academy Use Only

Summary 3-22
Quiz 3-23
Practice 3-1 Overview: Creating Subclasses 3-27
(Optional) Practice 3-2 Overview: Adding a Staff to a Manager 3-28

Inheritance with Java Interfaces


Objectives 6-2
Implementation Substitution 6-3
Java Interfaces 6-4
Developing Java Interfaces 6-5
Constant Fields 6-6
Interface References 6-7
instanceof Operator 6-8
Marker Interfaces 6-9
Casting to Interface Types 6-10
Using Generic Reference Types 6-11
Implementing and Extending 6-12
Extending Interfaces 6-13
Interfaces in Inheritance Hierarchies 6-14
vi

Oracle Internal & Oracle Academy Use Only

Static Variables 5-14


Defining Static Variables 5-15
Using Static Variables 5-16
Static Imports 5-17
Quiz 5-18
Final Methods 5-19
Final Classes 5-20
Final Variables 5-21
Declaring Final Variables 5-22
Quiz 5-23
When to Avoid Constants 5-24
Typesafe Enumerations 5-25
Enum Usage 5-26
Complex Enums 5-27
Quiz 5-28
Design Patterns 5-29
Singleton Pattern 5-30
Nested Classes 5-31
Inner Class: Example 5-32
Anonymous Inner Classes 5-33
Quiz 5-34
Summary 5-35
Practice 5-1 Overview: Applying the Abstract Keyword 5-36
Practice 5-2 Overview: Applying the Singleton Design Pattern 5-37
Practice 5-3 Overview: (Optional) Using Java Enumerations 5-38
(Optional) Practice 5-4 Overview: Recognizing Nested Classes 5-39

Generics and Collections


Objectives 7-2
Generics 7-3
Simple Cache Class Without Generics 7-4
Generic Cache Class 7-5
Generics in Action 7-6
Generics with Type Inference Diamond 7-7
Quiz 7-8
Collections 7-9
Collection Types 7-10
List Interface 7-11
ArrayList Implementation Class 7-12
ArrayList Without Generics 7-13
Generic ArrayList 7-14
Generic ArrayList: Iteration and Boxing 7-15
Autoboxing and Unboxing 7-16
Quiz 7-17
Set Interface 7-18
Set Interface: Example 7-19
Map Interface 7-20
vii

Oracle Internal & Oracle Academy Use Only

Quiz 6-15
Design Patterns and Interfaces 6-16
DAO Pattern 6-17
Before the DAO Pattern 6-18
After the DAO Pattern 6-19
The Need for the Factory Pattern 6-20
Using the Factory Pattern 6-21
The Factory 6-22
The DAO and Factory Together 6-23
Quiz 6-24
Code Reuse 6-25
Design Difficulties 6-26
Composition 6-27
Composition Implementation 6-28
Polymorphism and Composition 6-29
Quiz 6-31
Summary 6-32
Practice 6-1 Overview: Implementing an Interface 6-33
Practice 6-2 Overview: Applying the DAO Pattern 6-34
(Optional) Practice 6-3 Overview: Implementing Composition 6-35

String Processing
Objectives 8-2
Command-Line Arguments 8-3
Properties 8-5
Loading and Using a Properties File 8-6
Loading Properties from the Command Line 8-7
PrintWriter and the Console 8-8
printf format 8-9
Quiz 8-10
String Processing 8-11
StringBuilder and StringBuffer 8-12
StringBuilder: Example 8-13
Sample String Methods 8-14
Using the split() Method 8-15
Parsing with StringTokenizer 8-16
Scanner 8-17
Regular Expressions 8-18
Pattern and Matcher 8-19
Character Classes 8-20
Character Class: Examples 8-21
Character Class Code: Examples 8-22
Predefined Character Classes 8-23
Predefined Character Class: Examples 8-24
Quantifiers 8-25
viii

Oracle Internal & Oracle Academy Use Only

Map Types 7-21


Map Interface: Example 7-22
Deque Interface 7-23
Stack with Deque: Example 7-24
Ordering Collections 7-25
Comparable Interface 7-26
Comparable: Example 7-27
Comparable Test: Example 7-28
Comparator Interface 7-29
Comparator: Example 7-30
Comparator Test: Example 7-31
Quiz 7-32
Summary 7-33
Practice 7-1 Overview: Counting Part Numbers by Using a HashMap 7-34
Practice 7-2 Overview: Matching Parentheses by Using a Deque 7-35
Practice 7-3 Overview: Counting Inventory and Sorting with Comparators 7-36

Exceptions and Assertions


Objectives 9-2
Error Handling 9-3
Exception Handling in Java 9-4
The try-catch Statement 9-5
Exception Objects 9-6
Exception Categories 9-7
Quiz 9-8
Handling Exceptions 9-10
The finally Clause 9-11
The try-with-resources Statement 9-12
Suppressed Exceptions 9-13
The AutoCloseable Interface 9-14
Catching Multiple Exceptions 9-15
Declaring Exceptions 9-16
Handling Declared Exceptions 9-17
Throwing Exceptions 9-18
Custom Exceptions 9-19
Quiz 9-20
Wrapper Exceptions 9-21
Revisiting the DAO Pattern 9-22
Assertions 9-23
Assertion Syntax 9-24
Internal Invariants 9-25
Control Flow Invariants 9-26
Postconditions and Class Invariants 9-27
Controlling Runtime Evaluation of Assertions 9-28
Quiz 9-29
ix

Oracle Internal & Oracle Academy Use Only

Quantifier: Examples 8-26


Greediness 8-27
Quiz 8-28
Boundary Matchers 8-29
Boundary: Examples 8-30
Quiz 8-31
Matching and Groups 8-32
Using the replaceAll Method 8-33
Summary 8-34
Practice 8-1 Overview: Parsing Text with split() 8-35
Practice 8-2 Overview: Creating a Regular Expression Search Program 8-36
Practice 8-3 Overview: Transforming HTML by Using Regular Expressions 8-37

10 Java I/O Fundamentals


Objectives 10-2
Java I/O Basics 10-3
I/O Streams 10-4
I/O Application 10-5
Data Within Streams 10-6
Byte Stream InputStream Methods 10-7
Byte Stream OutputStream Methods 10-9
Byte Stream Example 10-10
Character Stream Reader Methods 10-11
Character Stream Writer Methods 10-12
Character Stream Example 10-13
I/O Stream Chaining 10-14
Chained Streams Example 10-15
Processing Streams 10-16
Console I/O 10-17
java.io.Console 10-18
Writing to Standard Output 10-19
Reading from Standard Input 10-20
Channel I/O 10-21
Practice 10-1 Overview: Writing a Simple Console I/O Application 10-22
Persistence 10-23
Serialization and Object Graphs 10-24
Transient Fields and Objects 10-25
Transient: Example 10-26
Serial Version UID 10-27
Serialization Example 10-28
Writing and Reading an Object Stream 10-29
Serialization Methods 10-30
readObject Example 10-31
Summary 10-32
Quiz 10-33
Practice 10-2 Overview: Serializing and Deserializing a ShoppingCart 10-37
11 Java File I/O (NIO.2)
Objectives 11-2
New File I/O API (NIO.2) 11-3
x

Oracle Internal & Oracle Academy Use Only

Summary 9-30
Practice 9-1 Overview: Catching Exceptions 9-31
Practice 9-2 Overview: Extending Exception 9-32

xi

Oracle Internal & Oracle Academy Use Only

Limitations of java.io.File 11-4


File Systems, Paths, Files 11-5
Relative Path Versus Absolute Path 11-6
Symbolic Links 11-7
Java NIO.2 Concepts 11-8
Path Interface 11-9
Path Interface Features 11-10
Path: Example 11-11
Removing Redundancies from a Path 11-12
Creating a Subpath 11-13
Joining Two Paths 11-14
Creating a Path Between Two Paths 11-15
Working with Links 11-16
Quiz 11-17
File Operations 11-20
Checking a File or Directory 11-21
Creating Files and Directories 11-23
Deleting a File or Directory 11-24
Copying a File or Directory 11-25
Copying Between a Stream and Path 11-26
Moving a File or Directory 11-27
Listing a Directorys Contents 11-28
Reading/Writing All Bytes or Lines from a File 11-29
Channels and ByteBuffers 11-30
Random Access Files 11-31
Buffered I/O Methods for Text Files 11-32
Byte Streams 11-33
Managing Metadata 11-34
File Attributes (DOS) 11-35
DOS File Attributes: Example 11-36
POSIX Permissions 11-37
Quiz 11-38
Practice 11-1 Overview: Writing a File Merge Application 11-41
Recursive Operations 11-42
FileVisitor Method Order 11-43
Example: WalkFileTreeExample 11-46
Finding Files 11-47
PathMatcher Syntax and Pattern 11-48
PathMatcher: Example 11-50
Finder Class 11-51
Other Useful NIO.2 Classes 11-52

12 Threading
Objectives 12-2
Task Scheduling 12-3
Why Threading Matters 12-4
The Thread Class 12-5
Extending Thread 12-6
Starting a Thread 12-7
Implementing Runnable 12-8
Executing Runnable Instances 12-9
A Runnable with Shared Data 12-10
One Runnable: Multiple Threads 12-11
Quiz 12-12
Problems with Shared Data 12-13
Nonshared Data 12-14
Quiz 12-15
Atomic Operations 12-16
Out-of-Order Execution 12-17
Quiz 12-18
The volatile Keyword 12-19
Stopping a Thread 12-20
The synchronized Keyword 12-22
synchronized Methods 12-23
synchronized Blocks 12-24
Object Monitor Locking 12-25
Detecting Interruption 12-26
Interrupting a Thread 12-27
Thread.sleep() 12-28
Quiz 12-29
Additional Thread Methods 12-30
Methods to Avoid 12-31
Deadlock 12-32
Summary 12-33
Practice 12-1 Overview: Synchronizing Access to Shared Data 12-34
Practice 12-2 Overview: Implementing a Multithreaded Program 12-35

xii

Oracle Internal & Oracle Academy Use Only

Moving to NIO.2 11-53


Summary 11-54
Quiz 11-55
Practice 11-2 Overview: Recursive Copy 11-58
(Optional) Practice 11-3 Overview: Using PathMatcher to Recursively Delete 11-59

xiii

Oracle Internal & Oracle Academy Use Only

13 Concurrency
Objectives 13-2
The java.util.concurrent Package 13-3
The java.util.concurrent.atomic Package 13-4
The java.util.concurrent.locks Package 13-5
java.util.concurrent.locks 13-6
Thread-Safe Collections 13-7
Quiz 13-8
Synchronizers 13-9
java.util.concurrent.CyclicBarrier 13-10
High-Level Threading Alternatives 13-11
java.util.concurrent.ExecutorService 13-12
java.util.concurrent.Callable 13-13
java.util.concurrent.Future 13-14
Shutting Down an ExecutorService 13-15
Quiz 13-16
Concurrent I/O 13-17
A Single-Threaded Network Client 13-18
A Multithreaded Network Client (Part 1) 13-19
A Multithreaded Network Client (Part 2) 13-20
A Multithreaded Network Client (Part 3) 13-21
A Multithreaded Network Client (Part 4) 13-22
A Multithreaded Network Client (Part 5) 13-23
Parallelism 13-24
Without Parallelism 13-25
Naive Parallelism 13-26
The Need for the Fork-Join Framework 13-27
Work-Stealing 13-28
A Single-Threaded Example 13-29
java.util.concurrent.ForkJoinTask<V> 13-30
RecursiveTask Example 13-31
compute Structure 13-32
compute Example (Below Threshold) 13-33
compute Example (Above Threshold) 13-34
ForkJoinPool Example 13-35
Fork-Join Framework Recommendations 13-36
Quiz 13-37
Summary 13-38
(Optional) Practice 13-1 Overview: Using the java.util.concurrent Package 13-39
(Optional) Practice 13-2 Overview: Using the Fork-Join Framework 13-40

15 Localization
Objectives 15-2
Why Localize? 15-3
A Sample Application 15-4
Locale 15-5
Resource Bundle 15-6
xiv

Oracle Internal & Oracle Academy Use Only

14 Building Database Applications with JDBC


Objectives 14-2
Using the JDBC API 14-3
Using a Vendors Driver Class 14-4
Key JDBC API Components 14-5
Using a ResultSet Object 14-6
Putting It All Together 14-7
Writing Portable JDBC Code 14-9
The SQLException Class 14-10
Closing JDBC Objects 14-11
The try-with-resources Construct 14-12
try-with-resources: Bad Practice 14-13
Writing Queries and Getting Results 14-14
Practice 14-1 Overview: Working with the Derby Database and JDBC 14-15
ResultSetMetaData 14-16
Getting a Row Count 14-17
Controlling ResultSet Fetch Size 14-18
Using PreparedStatement 14-19
Using CallableStatement 14-20
What Is a Transaction? 14-22
ACID Properties of a Transaction 14-23
Transferring Without Transactions 14-24
Successful Transfer with Transactions 14-25
Unsuccessful Transfer with Transactions 14-26
JDBC Transactions 14-27
RowSet 1.1: RowSetProvider and RowSetFactory 14-28
Using RowSet 1.1 RowSetFactory 14-29
Example: Using JdbcRowSet 14-31
Data Access Objects 14-32
The Data Access Object Pattern 14-33
Summary 14-34
Quiz 14-35
Practice 14-2 Overview: Using the Data Access Object Pattern 14-39

A SQL Primer
Objectives A-2
Using SQL to Query Your Database A-3
SQL Statements A-4
Basic SELECT Statement A-5
Limiting the Rows That Are Selected A-7
Using the ORDER BY Clause A-8
INSERT Statement Syntax A-9
UPDATE Statement Syntax A-10
DELETE Statement A-11
CREATE TABLE Statement A-12
Defining Constraints A-13
Including Constraints A-16
Data Types A-18
Dropping a Table A-20
Summary A-21

xv

Oracle Internal & Oracle Academy Use Only

Resource Bundle File 15-7


Sample Resource Bundle Files 15-8
Quiz 15-9
Initializing the Sample Application 15-10
Sample Application: Main Loop 15-11
The printMenu Method 15-12
Changing the Locale 15-13
Sample Interface with French 15-14
Format Date and Currency 15-15
Initialize Date and Currency 15-16
Displaying a Date 15-17
Customizing a Date 15-18
Displaying Currency 15-19
Quiz 15-20
Summary 15-21
Practice 15-1 Overview: Creating a Localized Date Application 15-22
(Optional) Practice 15-2 Overview: Localizing a JDBC Application 15-23

Oracle Internal & Oracle Academy Use Only

Copyright 2011, Oracle and/or its affiliates. All rights reserved.

Oracle Internal & Oracle Academy Use Only

Introduction

Course Goals

This course covers the core APIs that you use to design
object-oriented applications with Java. This course also
covers writing database programs with JDBC.
Use this course to further develop your skills with the Java
language and prepare for the Oracle Certified
Professional, Java SE 7 Programmer Exam.

Copyright 2011, Oracle and/or its affiliates. All rights reserved.

Java SE 7 Programming 1 - 2

Oracle Internal & Oracle Academy Use Only

After completing this course, you should be able to do the


following:
Create Java technology applications that leverage the
object-oriented features of the Java language, such as
encapsulation, inheritance, and polymorphism
Execute a Java application from the command line
Create applications that use the Collections framework
Implement error-handling techniques using exception
handling
Implement input/output (I/O) functionality to read from and
write to data and text files
and understand advanced
I/O streams

Copyright 2011, Oracle and/or its affiliates. All rights reserved.

Java SE 7 Programming 1 - 3

Oracle Internal & Oracle Academy Use Only

Course Objectives

(continued)
Manipulate files, directories, and file systems using the
JDK7 NIO.2 specification
Perform multiple operations on database tables, including
creating, reading, updating, and deleting, using the JDBC
API
Process strings using a variety of regular expressions
Create high-performing multi-threaded applications that
avoid deadlock
Localize Java applications

Copyright 2011, Oracle and/or its affiliates. All rights reserved.

Java SE 7 Programming 1 - 4

Oracle Internal & Oracle Academy Use Only

Course Objectives

The target audience includes those who have:


Completed the Java SE 7 Fundamentals course or have
experience with the Java language, and can create,
compile, and execute programs
Experience with at least one programming language
An understanding of object-oriented principles
Experience with basic database concepts and a basic
knowledge of SQL

Copyright 2011, Oracle and/or its affiliates. All rights reserved.

Java SE 7 Programming 1 - 5

Oracle Internal & Oracle Academy Use Only

Audience

Prerequisites

successfully complete this course, you must know how to:


Compile and run Java applications
Create Java classes
Create object instances using the new keyword
Declare Java primitive and reference variables
Declare Java methods using return values and parameters
Use conditional constructs such as if and switch
statements
Use looping constructs such as for, while, and do loops
Declare and instantiate Java arrays
Use the Java Platform, Standard Edition API Specification
(Javadocs)
Copyright 2011, Oracle and/or its affiliates. All rights reserved.

Java SE 7 Programming 1 - 6

Oracle Internal & Oracle Academy Use Only

To

Briefly introduce yourself:


Name
Title or position
Company
Experience with Java programming and Java applications
Reasons for attending

Copyright 2011, Oracle and/or its affiliates. All rights reserved.

Java SE 7 Programming 1 - 7

Oracle Internal & Oracle Academy Use Only

Class Introductions

Course Environment

Classroom PC
Additional Tools
Firefox
Java DB

Copyright 2011, Oracle and/or its affiliates. All rights reserved.

In this course, the following products are preinstalled for the lesson practices:
JDK 7: The Java SE Development Kit includes the command-line Java compiler
(javac) and the Java Runtime Environment (JRE), which supplies the java command
needed to execute Java applications.
Firefox: A web browser is used to view the HTML documentation (Javadoc) for the Java
SE Platform libraries.
NetBeans 7.0.1: The NetBeans IDE is a free and open-source software development
tool for professionals who create enterprise, web, desktop, and mobile applications.
NetBeans 7.0.1 fully supports the Java SE 7 Platform. Support is provided by Oracle's
Development Tools Support offering.
Java DB: Java DB is Oracle's supported distribution of the open-source Apache Derby
100% Java technology database. It is fully transactional, secure, easy-to-use,
standards-based SQL, JDBC API, and Java EE yet small, only 2.5 MB.

Java SE 7 Programming 1 - 8

Oracle Internal & Oracle Academy Use Only

Core Apps
JDK 7
NetBeans 7.0.1

Copyright 2011, Oracle and/or its affiliates. All rights reserved.

Platform-Independent Programs
Java technology applications are written in the Java programming language and compiled to
Java bytecode. Bytecode is executed on the Java platform. The software that provides you
with a runnable Java platform is called a Java Runtime Environment (JRE). A compiler,
included in the Java SE Development Kit (JDK), is used to convert Java source code to Java
bytecode.

Java SE 7 Programming 1 - 9

Oracle Internal & Oracle Academy Use Only

Java Programs Are Platform-Independent

Copyright 2011, Oracle and/or its affiliates. All rights reserved.

Identifying Java Technology Groups


Oracle provides a complete line of Java technology products ranging from kits that create
Java technology programs to emulation (testing) environments for consumer devices, such as
cellular phones. As indicated in the graphic, all Java technology products share the
foundation of the Java language. Java technologies, such as the Java Virtual Machine, are
included (in different forms) in three different groups of products, each designed to fulfill the
needs of a particular target market. The figure illustrates the three Java technology product
groups and their target device types. Among other Java technologies, each edition includes a
Software Development kit (SDK) that allows programmers to create, compile, and execute
Java technology programs on a particular platform:
Java Platform, Standard Edition (Java SE): Develops applets and applications that
run within Web browsers and on desktop computers, respectively. For example, you can
use the Java SE Software Development Kit (SDK) to create a word processing program
for a personal computer. You can also use the Java SE to create an application that
runs in a browser.
Note: Applets and applications differ in several ways. Primarily, applets are launched inside a
web browser, whereas applications are launched within an operating system.

Java SE 7 Programming 1 - 10

Oracle Internal & Oracle Academy Use Only

Java Technology Product Groups

Year

Developer
Version (JDK)

Platform

1996

1.0

1997

1.1

1998

1.2

2000

1.3

2002

1.4

2004

1.5

2006

1.6

2011

1.7

Copyright 2011, Oracle and/or its affiliates. All rights reserved.

How to Detect Your Version


If Java SE is installed on your system, you can detect the version number by running
java -version. Note that the java command is included with the Java Runtime
Environment (JRE). As a developer, you also need a Java compiler, typically javac. The
javac command is included in the Java SE Development Kit (JDK). Your operation systems
PATH may need to be updated to include the location of javac.

Java SE 7 Programming 1 - 11

Oracle Internal & Oracle Academy Use Only

Java SE Platform Versions

Copyright 2011, Oracle and/or its affiliates. All rights reserved.

1.
2.
3.
4.
5.

Go to http://www.oracle.com/technetwork/java/javase/downloads/index.html.
Choose the Java Platform, Standard Edition (Java SE) link.
Download the version that is appropriate for your operation system.
Follow the installation instructions.
Set your PATH.

Java SE 7 Programming 1 - 12

Oracle Internal & Oracle Academy Use Only

Downloading and Installing the JDK

Java in Server Environments


Java is common in enterprise
environments:
Oracle Fusion Middleware
Java application servers

GlassFish
WebLogic

Database servers
MySQL
Oracle Database

Copyright 2011, Oracle and/or its affiliates. All rights reserved.

Enterprise Environments
In this course, you develop Java SE applications. There are standard patterns you need to
follow when implementing Java SE applications, such as always creating a main method that
may be different when implementing enterprise applications. Java SE is only the starting point
in your path to becoming a Java developer. Depending on the needs of your organization, you
may be required to develop applications that run inside Java EE application servers or other
types of Java middleware.
Often, you will also need to manipulate information stored inside relational databases such as
MySQL or Oracle Database. This course introduces you to the fundamentals of database
programming.

Java SE 7 Programming 1 - 13

Oracle Internal & Oracle Academy Use Only

The Java Community

Apache Software Foundation

Copyright 2011, Oracle and/or its affiliates. All rights reserved.

What Is the Java Community?


At a very high level, Java Community is the term used to refer to the many individuals and
organizations that develop, innovate, and use Java technology. This community includes
developers as individuals, organizations, businesses, and open-source projects.
It is very common for you to download and use Java libraries from non-Oracle sources within
the Java community. For instance, in this course, you use an Apache-developed JDBC library
to access a relational database.

Java SE 7 Programming 1 - 14

Oracle Internal & Oracle Academy Use Only

Mobile &
Embedded

The JCP is used to develop new Java standards:


http://jcp.org
Free download of all Java Specification Requests (JSRs)
Early access to specifications
Public review and feedback opportunities
Open membership

Copyright 2011, Oracle and/or its affiliates. All rights reserved.

JCP.next
The JCP produces the JSRs that outline the standards of the Java platform. The behavior of
the JCP itself is also defined and improved through the JSR process. The JCP is evolving and
its improvements are defined in JSR-348. JSR-348 introduces changes in the areas of
transparency, participation, agility, and governance.
Transparency: In the past, some aspects of the development of a JSR may have
occurred behind closed doors. Transparent development is now the recommended
practice.
Participation: Individuals and Java User Groups are encouraged to become active in
the JCP.
Agility: Slow-moving JSRs are now actively discouraged.
Governance: The SE and ME expert groups are merging into a single body.

Java SE 7 Programming 1 - 15

Oracle Internal & Oracle Academy Use Only

The Java Community Process (JCP)

OpenJDK is the open-source implementation of Java:


http://openjdk.java.net/
GPL licensed open-source project
JDK reference implementation
Where new features are developed
Open to community contributions
Basis for Oracle JDK

Copyright 2011, Oracle and/or its affiliates. All rights reserved.

Why OpenJDK Is Important


Because it is open source, OpenJDK enables users to port Java to operating systems and
hardware platforms of their choosing. Ports are underway for many platforms (besides those
already supported) including FreeBSD, OpenBSD, NetBSD, and MacOS X.

Java SE 7 Programming 1 - 16

Oracle Internal & Oracle Academy Use Only

OpenJDK

Oracle Java SE Support

JRockit Mission Control


Memory Leak Detection
Low Latency GC (Suite)
JRockit Virtual Edition (Suite)

Copyright 2011, Oracle and/or its affiliates. All rights reserved.

Still Free
Java (Oracle JDK) is freely available at no cost. Oracle offers advanced commercial solutions
at cost. The previously offered Java for Business program has been replaced by Oracle
Java SE Support, which provides access to Oracle Premier Support and the Oracle Java SE
Advanced and Oracle Java SE Suite binaries. For more information, visit
http://www.oracle.com/us/technologies/java/java-se-suite-394230.html.

Java SE 7 Programming 1 - 17

Oracle Internal & Oracle Academy Use Only

Java is available free of charge. However, Oracle does provide


pay-for Java solutions:
The Java SE Support Program provides updates for
end-of-life Java versions.
Oracle Java SE Advanced and Oracle Java SE Suite:

Topic

Website

Education and Training

http://education.oracle.com

Product Documentation

http://www.oracle.com/technology/documentation

Product Downloads

http://www.oracle.com/technology/software

Product Articles

http://www.oracle.com/technology/pub/articles

Product Support

http://www.oracle.com/support

Product Forums

http://forums.oracle.com

Product Tutorials

http://www.oracle.com/technetwork/tutorials/index.html

Sample Code

https://www.samplecode.oracle.com

Oracle Technology Network


for Java Developers

http://www.oracle.com/technetwork/java/index.html

Oracle Learning Library

http://www.oracle.com/goto/oll

Copyright 2011, Oracle and/or its affiliates. All rights reserved.

The table in the slide lists various web resources that are available for you to learn more
about Java SE programming.

Java SE 7 Programming 1 - 18

Oracle Internal & Oracle Academy Use Only

Additional Resources

In this lesson, you should have learned about:


The course objectives
Software used in this course
Java platforms (ME, SE, and EE)
Java SE version numbers
Obtaining a JDK
The open nature of Java and its community
Commercial support options for Java SE

Copyright 2011, Oracle and/or its affiliates. All rights reserved.

Java SE 7 Programming 1 - 19

Oracle Internal & Oracle Academy Use Only

Summary

Oracle Internal & Oracle Academy Use Only

Copyright 2011, Oracle and/or its affiliates. All rights reserved.

Oracle Internal & Oracle Academy Use Only

Java Syntax and Class Review

Objectives

Create primitive variables


Manipulate Strings
Use if-else and switch branching statements
Iterate with loops
Create arrays

Use Java fields, constructors, and methods


Use package and import
statements

Copyright 2011, Oracle and/or its affiliates. All rights reserved.

Java SE 7 Programming 2 - 2

Oracle Internal & Oracle Academy Use Only

After completing this lesson, you should be able to do the


following:
Create simple Java classes

This lesson is a review of fundamental Java and programming


concepts. It is assumed that students are familiar with the
following concepts:
The basic structure of a Java class
Program block and comments
Variables
Basic if-else and switch branching constructs
Iteration with for and while loops

Copyright 2011, Oracle and/or its affiliates. All rights reserved.

Java SE 7 Programming 2 - 3

Oracle Internal & Oracle Academy Use Only

Java Language Review

Class Structure
package <package_name>;
import <other_packages>;

<constructor method(s)>;
<other methods>;
}

Copyright 2011, Oracle and/or its affiliates. All rights reserved.

A Java class is described in a text file with a .java extension. In the example shown, the
Java keywords are highlighted in bold.
The package keyword defines where this class lives relative to other classes, and
provides a level of access control. You use access modifiers (such as public and
private) later in this lesson.
The import keyword defines other classes or groups of classes that you are using in
your class. The import statement helps to narrow what the compiler needs to look for
when resolving class names used in this class.
The class keyword precedes the name of this class. The name of the class and the file
name must match when the class is declared public (which is a good practice).
However, the keyword public in front of the class keyword is a modifier and is not
required.
Variables, or the data associated with programs (such as integers, strings, arrays, and
references to other objects), are called instance fields (often shortened to fields).
Constructors are functions called during the creation (instantiation) of an object (a
representation in memory of a Java class.)
Methods are the functions that can be performed on an object. They are also referred to
as instance methods.
Java SE 7 Programming 2 - 4

Oracle Internal & Oracle Academy Use Only

public class ClassName {


<variables(also known as fields)>;

A Simple Class
A simple Java class with a main method:
public class Simple{

}
}

Copyright 2011, Oracle and/or its affiliates. All rights reserved.

To run a Java program, you must define a main method as shown in the slide. The main
method is automatically called when the class is called from the command line.
Command-line arguments are passed to the program through the args[] array.
Note: A method that is modified with the keyword static is invoked without a reference to a
particular object. The class name is used instead. These methods are referred to as class
methods. The main method is a special method that is invoked when this class is run using
the Java runtime.

Java SE 7 Programming 2 - 5

Oracle Internal & Oracle Academy Use Only

public static void main(String args[]){

Code Blocks

Every class declaration is enclosed in a code block.


Method declarations are enclosed in code blocks.
Java fields and methods have block (or class) scope.
Code blocks are defined in braces:

Example:
public class SayHello {
public static void main(String[] args) {
System.out.println("Hello world");
}
}

Copyright 2011, Oracle and/or its affiliates. All rights reserved.

Java fields (variables) and methods have a class scope defined by the opening left curly
brace and ending at the closing right curly brace.
Class scope allows any method in the class to call or invoke any other method in the class.
Class scope also allows any method to access any field in the class.
Code blocks are always defined using braces {}. A block is executed by executing each of
the statements defined within the block in order from first to last (left to right).
The Java compiler ignores all white space. Line indentation is not required but makes code
much more readable. In this course, the line indentation is four spaces, which is the default
line indentation used by the NetBeans IDE.

Java SE 7 Programming 2 - 6

Oracle Internal & Oracle Academy Use Only

{ }

Integer

Floating
Point

Character

True
False

byte
short
int
long

float
double

char

boolean

1, 2, 3, 42
07
0xff

3.0F
.3337F
4.022E23

'a'
'\u0061'
'\n'

true
false

0.0f

'\u0000'

false

Append uppercase or lowercase "L" or "F" to the number to


specify a long or a float number.

Copyright 2011, Oracle and/or its affiliates. All rights reserved.

Integer
Java provides four different integer types to accommodate different size numbers. All the
numeric types are signed, which means that they can hold positive or negative numbers.
The integer types have the following ranges:

byte range is 128 to +127. Number of bits = 8.

short range is 32,768 to +32,767. Number of bits = 16.

int range is 2,147,483,648 to +2,147,483,647. The most common integer type is int.
Number of bits = 32.

long range is 9,223,372,036,854,775,808 to +9,223,372,036,854,775,807. Number of


bits = 64.
Floating Point
The floating-point types hold numbers with a fractional part and conform to the IEEE 754
standard. There are two types of floating points: float and double.
double is so called because it provides double the precision of float. A float uses 32 bits
to store data, whereas a double uses 64 bits.

Java SE 7 Programming 2 - 7

Oracle Internal & Oracle Academy Use Only

Primitive Data Types

Character
The char type is used for individual characters, as opposed to a string of characters (which is
implemented as a String object). Java supports Unicode, an international standard for
representing a character in any written language in the world in a single 16-bit value. The first
256 characters coincide with the ISO Latin 1 character set, part of which is ASCII.

Default Values
If a value is not specified, a default value is used. The values in red in the slide are the
defaults used. The default char value is null (represented as '\u0000'), and the default
value for boolean is false.
Note: Local variables (that is, variables declared within methods) do not have a default value.
An attempt to use a local variable that has not been assigned a value will cause a compiler
error. It is a good practice always to supply a default value to any variable.

Java SE 7 Programming 2 - 8

Oracle Internal & Oracle Academy Use Only

Boolean
The boolean type can hold either true or false.
Note: true and false may appear to be keywords, but they are technically boolean literals.

Java SE 7 Numeric Literals

long creditCardNumber = 1234_5678_9012_3456L;


long socialSecurityNumber = 999_99_9999L;
float pi = 3.14_15F;
long hexBytes = 0xFF_EC_DE_5E;
long hexWords = 0xCAFE_BABE;
long maxLong = 0x7fff_ffff_ffff_ffffL;
byte nybbles = 0b0010_0101;
long bytes = 0b11010010_01101001_10010100_10010010;

Copyright 2011, Oracle and/or its affiliates. All rights reserved.

Rules for Literals


You can place underscores only between digits; you cannot place underscores in the
following places:

At the beginning or end of a number

Adjacent to a decimal point in a floating point literal

Prior to an F or L suffix

In positions where a string of digits is expected


Note: The Java language is case-sensitive. In Java, the variable creditCardNumber is
different from CREDITCARDNUMBER. Convention indicates that Java variables and method
names use lower camel caselowercase for the first letter of the first element of a variable
name and uppercase for the first letter of subsequent elements.

Java SE 7 Programming 2 - 9

Oracle Internal & Oracle Academy Use Only

In Java SE 7 (and later versions), any number of underscore


characters (_) can appear between digits in a numeric field.
This can improve the readability of your code.

Java SE 7 Binary Literals


In Java SE 7 (and later versions), binary literals can also be
expressed using the binary system by adding the prefixes 0b or
0B to the number:

// A 16-bit 'short' value:


short aShort = (short)0b1010_0001_0100_0101;
// Some 32-bit 'int' values:
int anInt1 = 0b1010_0001_0100_0101_1010_0001_0100_0101;
int anInt2 = 0b101;
int anInt3 = 0B101; // The B can be upper or lower case.

Copyright 2011, Oracle and/or its affiliates. All rights reserved.

Binary literals are Java int values. Java byte and short values require a cast to prevent a
precision loss warning from the compiler.

Java SE 7 Programming 2 - 10

Oracle Internal & Oracle Academy Use Only

// An 8-bit 'byte' value:


byte aByte = (byte)0b00100001;

Operators

Simple assignment operator


= Simple assignment operator

Arithmetic operators
+

*
/
%

Additive operator (also used for String concatenation)


Subtraction operator
Multiplication operator
Division operator
Remainder operator

Unary operators
+ Unary plus operator; indicates positive
Unary minus operator; negates an expression
++ Increment operator; increments a value by 1
-- Decrement operator; decrements a value by 1
! Logical complement operator; inverts the value of a boolean
Copyright 2011, Oracle and/or its affiliates. All rights reserved.

Because numbers have been introduced, the slide shows a list of common operators. Most
are common to any programming language, and a description of each is provided in the slide.
The binary and bitwise operators have been omitted for brevity. For details about those
operators, refer to the Java Tutorial:
http://download.oracle.com/javase/tutorial/java/nutsandbolts/operators.html
Note: Operators have definitive precedence. For the complete list, see the Java Tutorial link
mentioned above. Precedence can be overridden using parentheses.

Java SE 7 Programming 2 - 11

Oracle Internal & Oracle Academy Use Only

1 public class Strings {


2
3
public static void main(String args[]){
4
5
char letter = 'a';
6
String literals are
7
String string1 = "Hello";
automatically created
as String objects.
8
String string2 = "World";
9
String string3 = "";
10
String dontDoThis = new String ("Bad Practice");
11
12
string3 = string1 + string2; // Concatenate strings
13
14
System.out.println("Output: " + string3 + " " + letter);
15
16
}
17 }

Copyright 2011, Oracle and/or its affiliates. All rights reserved.

The code in the slide demonstrates how text characters are represented in Java. Single
characters can be represented with the char type. However, Java also includes a String
type for representing multiple characters. Strings can be defined as shown in the slide and
combined using the + sign as a concatenation operator.
The output from the code in the slide is:
Output: HelloWorld a
Caution: Strings should always be initialized using the assignment operator "=" and text in
quotation marks, as shown in the examples. The use of new to initialize a String is strongly
discouraged. The reason is that "Bad Practice" in line 10 is a String literal of type
String, Using the new keyword simply creates another instance functionally identical to the
literal. If this statement appeared inside of a loop that was frequently invoked, there could be
a lot of needless String instances created.

Java SE 7 Programming 2 - 12

Oracle Internal & Oracle Academy Use Only

Strings

1 public class StringOperations {


2
public static void main(String arg[]){
String literals are
automatically created
3
String string2 = "World";
as String objects.
4
String string3 = "";
5
6
string3 = "Hello".concat(string2);
7
System.out.println("string3: " + string3);
8
9
// Get length
10
System.out.println("Length: " + string1.length());
11
12
// Get SubString
13
System.out.println("Sub: " + string3.substring(0, 5));
14
15
// Uppercase
16
System.out.println("Upper: " + string3.toUpperCase());
17
}
18}

Copyright 2011, Oracle and/or its affiliates. All rights reserved.

This slide demonstrates some common string methods, including:


concat()
length()
substring()
toUpperCase()
To see what other methods can be used on a String, see the API documentation.
The output from the program is:
string3: HelloWorld
Length: 5
Sub: Hello
Upper: HELLOWORLD
Note: String is a class, not a primitive type. Instances of the class String represent
sequences of Unicode characters.

Java SE 7 Programming 2 - 13

Oracle Internal & Oracle Academy Use Only

String Operations

1 public class IfElse {


2
3
public static void main(String args[]){
4
long a = 1;
5
long b = 2;
6
7
if (a == b){
8
System.out.println("True");
9
} else {
10
System.out.println("False");
11
}
12
13
}
14 }

Copyright 2011, Oracle and/or its affiliates. All rights reserved.

The example in the slide demonstrates the syntax for an if-else statement in Java.
The output from the code in the slide is as follows:
False

Java SE 7 Programming 2 - 14

Oracle Internal & Oracle Academy Use Only

if else

Logical Operators
Equality and relational operators
==
!=
>
>=
<
<=

Equal to
Not equal to
Greater than
Greater than or equal to
Less than
Less than or equal to

Conditional operators
&& Conditional-AND
|| Conditional-OR
?: Ternary (shorthand for if-then-else statement)

Type comparison operator


instanceof Compares an object to a specified type

Copyright 2011, Oracle and/or its affiliates. All rights reserved.

The slide shows a summary of the logic and conditional operators in Java.

Java SE 7 Programming 2 - 15

Oracle Internal & Oracle Academy Use Only

1 public class ArrayOperations {


2
public static void main(String args[]){
3
4
String[] names = new String[3];
5
6
names[0] = "Blue Shirt";
7
names[1] = "Red Shirt";
Arrays are objects.
8
names[2] = "Black Shirt";
Array objects have a
final field length.
9
10
int[] numbers = {100, 200, 300};
11
12
for (String name:names){
13
System.out.println("Name: " + name);
14
}
15
16
for (int number:numbers){
17
System.out.println("Number: " + number);
18
}
19
}
20 }

Copyright 2011, Oracle and/or its affiliates. All rights reserved.

This class demonstrates how to define arrays in Java. The first example creates a String
array and initializes each element separately. The second int array is defined in a single
statement.
Each array is iterated through using the Java for-each construct. The loop defines an
element which will represent each element of the array and the array to loop through. The
output of the class is shown here:
Name: Blue Shirt
Name: Red Shirt
Name: Black Shirt
Number: 100
Number: 200
Number: 300
Note: Arrays are also objects by default. All arrays support the methods of the class Object.
You can always obtain the size of an array using its length field.

Java SE 7 Programming 2 - 16

Oracle Internal & Oracle Academy Use Only

Arrays and for-each Loop

1 public class ForLoop {


2
3
public static void main(String args[]){
4
5
for (int i = 0; i < 9; i++ ){
6
System.out.println("i: " + i);
7
}
8
9
}
10 }

Copyright 2011, Oracle and/or its affiliates. All rights reserved.

The classic for loop is shown in the slide. A counter is initialized and incremented for each
step of the loop. When the condition statement is met, the loop exits. Here is the sample
output for this program.
i: 0
i: 1
i: 2
i: 3
i: 4
i: 5
i: 6
i: 7
i: 8

Java SE 7 Programming 2 - 17

Oracle Internal & Oracle Academy Use Only

for Loop

1 public class WhileLoop {


2
3
public static void main(String args[]){
4
5
int i = 0;
6
int[] numbers = {100, 200, 300};
7
8
while (i < numbers.length ){
9
System.out.println("Number: " + numbers[i]);
10
i++;
11
}
12
}
13 }

Copyright 2011, Oracle and/or its affiliates. All rights reserved.

The while loop performs a test and continues if the expression evaluates to true. The
while loop, shown here, iterates through an array using a counter. Here is the output from
the code in the slide:
Number: 100
Number: 200
Number: 300
Note: There is also a do-while loop, where the test after the expression has run at least
once:
class DoWhileDemo {
public static void main(String[] args){
int count = 1;
do {
System.out.println("Count is: " + count);
count++;
} while (count <= 11);
}
}

Java SE 7 Programming 2 - 18

Oracle Internal & Oracle Academy Use Only

while Loop

1 public class SwitchStringStatement {


2
public static void main(String args[]){
3
4
String color = "Blue";
5
String shirt = " Shirt";
6
7
switch (color){
8
case "Blue":
9
shirt = "Blue" + shirt;
10
break;
11
case "Red":
12
shirt = "Red" + shirt;
13
break;
14
default:
15
shirt = "White" + shirt;
16
}
17
18
System.out.println("Shirt type: " + shirt);
19
}
20 }

Copyright 2011, Oracle and/or its affiliates. All rights reserved.

This example shows a switch statement in Java using a String. Prior to version 7 of Java,
only enums and byte, short, char, and int primitive data types could be used in a
switch statement. You will see enums in the lesson titled Advanced Class Design.

Java SE 7 Programming 2 - 19

Oracle Internal & Oracle Academy Use Only

String switch Statement

Java Naming Conventions

in lower camel case.

Copyright 2011, Oracle and/or its affiliates. All rights reserved.

Class names should be nouns in mixed case, with the first letter uppercase and the first
letter of each internal word capitalized. This is approach is termed "upper camel case."
Methods should be verbs in mixed case, with the first letter lowercase and the first letter
of each internal word capitalized. This is termed "lower camel case."
Variable names should be short but meaningful. The choice of a variable name should
be mnemonic: designed to indicate to the casual observer the intent of its use.
One-character variable names should be avoided except as temporary "throwaway"
variables.
Constants should be declared using all uppercase letters.

For the complete Code Conventions for the Java Programming Language document, go to
http://www.oracle.com/technetwork/java/codeconv-138413.html.

Java SE 7 Programming 2 - 20

Oracle Internal & Oracle Academy Use Only

Class names are nouns in

1 public class CreditCard {


upper camel case.
2
public int VISA = 5001;
3
public String accountName; Constants should be declared in
all uppercase. letters
4
public String cardNumber;
Variable names are short
5
public Date expDate;
but meaningful in lower
6
camel case.
7
public double getCharges(){
8
// ...
9
}
10
11
public void disputeCharge(String chargeId, float amount){
12
// ...
13
}
Methods should be verbs,
14}

A Simple Java Class: Employee

1 package com.example.domain;
2 public class Employee { class declaration
3
public int empId;
4
public String name;
fields
5
public String ssn;
6
public double salary;
7
8
public Employee () { a constructor
9
}
10
11
public int getEmpId () {
a method
12
return empId;
13
}
14 }
Copyright 2011, Oracle and/or its affiliates. All rights reserved.

A Java class is often used to store or represent data for the construct that the class
represents. For example, you could create a model (a programmatic representation) of an
Employee. An Employee object defined using this model will contain values for empId,
name, Social Security Number (ssn), and salary.
The constructor method in this class creates an instance of an object called Employee.
A constructor method is unique in Java because the return type of the method is an instance
of the class, so constructors always have the same name as the class and do not declare a
return type. You can declare more than one constructor, as you will see in the lesson titled
Java Class Design.

Java SE 7 Programming 2 - 21

Oracle Internal & Oracle Academy Use Only

A Java class is often used to represent a concept.

Employee Class Methods

1 package com.example.domain;
2 public class Employee {
3
public int empId;
4
// other fields...
5
public void setEmpId(int empId) {
6
this.empId = empId;
Often a pair of methods
7
}
to set and get the
current field value.
8
public int getEmpId() {
9
return empId;
10
}
11
// getter/setter methods for other fields...
12 }

Copyright 2011, Oracle and/or its affiliates. All rights reserved.

Adding Methods to the Employee Class


A common practice is to create a set of methods that manipulate field data: methods that set
the value of each field, and methods that get the value of each field. These methods are
called accessors (getters) and mutators (setters).
The convention is to use set and get plus the name of the field with the first letter of the field
name capitalized (lower camel case). Most modern integrated development environments
(IDEs) provide an easy way to automatically generate the accessor (getter) and mutator
(setter) methods for you.
Notice that the set methods use the keyword this. The this keyword allows the compiler to
distinguish between the field name of the class (this) and the parameter name being passed
in as an argument. Without the keyword this, the compiler would complain: "Assignment to
self."
In this simple example, you could use the setName method to change the employee name
and the setSalary method to change the employee salary.

Java SE 7 Programming 2 - 22

Oracle Internal & Oracle Academy Use Only

When a class has data fields, a common practice is to provide


methods for storing data (setter methods) and retrieving data
(getter methods) from the fields.

Creating an Instance of an Object

/* In some other class, or a main method */


Employee emp = new Employee();
emp.empId = 101;
// legal if the field is public,
// but not good OO practice
emp.setEmpId(101); // use a method instead
emp.setName("John Smith");
emp.setSsn("011-22-3467");
emp.setSalary(120345.27);

In this fragment of Java code, you construct an instance of


the Employee class and assign the reference to the new
object to a variable called emp.
Then you assign values to the Employee object.
Copyright 2011, Oracle and/or its affiliates. All rights reserved.

Creating an instance of the Employee Class


In order to use the Employee class to hold the information of an employee, you need to
allocate memory for the Employee object and call a constructor method in the class. An
instance of an object is created when you use the new keyword. All of the fields declared in
the class are provided memory space and initialized to their default values. The constructor
method is then called. If the memory allocation and constructor are successful, a reference to
the object is returned as a result. In the example in the slide, the reference is assigned to a
variable called emp.
To store values (data) into the Employee object instance, you could just assign values to
each field. However, this is not a good practice and negates the principle of encapsulation.
Instead, you should use methods to set the value of each data field. Later in this lesson you
will look at restricting access to the fields to promote encapsulation.
Once all the data fields are set with values, you have an instance of an Employee with an
empId with a value of 101, name with the string John Smith, Social Security number string
(ssn) set to 011-22-3467, and salary with the value of 120,345.27.

Java SE 7 Programming 2 - 23

Oracle Internal & Oracle Academy Use Only

To construct or create an instance (object) of the Employee


class, use the new keyword.

Constructors

A simple no-argument (no-arg)


constructor.

Employee emp = new Employee();

The value returned from the constructor is a reference to a


Java object of the type created.
Constructors can take parameters.

Copyright 2011, Oracle and/or its affiliates. All rights reserved.

A constructor is a pseudo-method that creates an object. In the Java programming language,


constructors are methods with the same name as their class used to create an instance of an
object. Constructors are invoked using the new keyword.
Constructors are covered in more detail in the lesson titled Encapsulation and Subclassing.

Java SE 7 Programming 2 - 24

Oracle Internal & Oracle Academy Use Only

public class Employee {


public Employee() {
}
}

package Statement
The package keyword is used in Java to group classes
together. A package is implemented as a folder and, like a
folder, provides a namespace to a class.
folder view

com.example.domain
Employee

Manager

+com
|_+example
|_+domain
|_+Employee.java
|_+Manager.java

Copyright 2011, Oracle and/or its affiliates. All rights reserved.

Packages
In Java, a package is a group of (class) types. There can be only one package declaration
for a class.
Packages are more than just a convenience. Packages create a namespace, a logical
collection of things, like a directory hierarchy.
It is a good practice to always use a package declaration. The package declaration is
always at the top of the class.

Java SE 7 Programming 2 - 25

Oracle Internal & Oracle Academy Use Only

namespace view

import Statements
The import keyword is used to identify classes you want to
reference in your class.
The import statement provides a convenient way to
identify classes that you want to reference in your class.

You can import a single class or an entire package:

import java.util.*;

You can include multiple import statements:

import java.util.Date;
import java.util.Calendar;

It is good practice to use the full package and class name


rather than the wildcard * to avoid class name conflicts.
Copyright 2011, Oracle and/or its affiliates. All rights reserved.

Imports
You could refer to a class using its fully qualified namespace in your applications, as in the
following example:
java.util.Date date = new java.util.Date();
But that would quickly lead to a lot of typing! Instead, Java provides the import statement to
allow you to declare that you want to reference a class in another package.
Note: It is a good practice to use the specific, fully qualified package and class name to avoid
confusion when there are two classes with the same name, as in the following example:
java.sql.Date and java.util.Date. The first is a Date class used to store a Date type
in a database, and java.util.Date is a general purpose Date class. As it turns out,
java.sql.Date is a subclass of java.util.Date. This is covered in more detail later in
the course.
Note: Modern IDEs, like NetBeans and Eclipse, automatically search for and add import
statements for you. In NetBeans, for example, use the Ctrl + Shift + I key sequence to fix
imports in your code.

Java SE 7 Programming 2 - 26

Oracle Internal & Oracle Academy Use Only

import java.util.Date;

More on import

Import statements follow the package declaration and


precede the class declaration.
An import statement is not required.
By default, your class always imports java.lang.*
You do not need to import classes that are in the same
package:

package com.example.domain;
import com.example.domain.Manager; // unused import

Copyright 2011, Oracle and/or its affiliates. All rights reserved.

Details about this package and its classes are covered later in the course.

Java SE 7 Programming 2 - 27

Oracle Internal & Oracle Academy Use Only

Java Is Pass-By-Value
The Java language (unlike C++) uses pass-by-value for all
parameter passing.
To visualize this with primitives, consider the following:

The value of x is copied and passed to y:


3

y
copy the value of x

If x is modified (for example, x = 5;), the value of y


remains unchanged.
Copyright 2011, Oracle and/or its affiliates. All rights reserved.

The Java language uses pass-by-value for all assignment operations. This means that the
argument on the right side of the equal sign is evaluated, and the value of the argument is
assigned to the left side of the equal sign.
For Java primitives, this is straightforward. Java does not pass a reference to a primitive (such
as an integer), but rather a copy of the value.

Java SE 7 Programming 2 - 28

Oracle Internal & Oracle Academy Use Only

int x = 3;
int y = x;

Pass-By-Value for Object References


For Java objects, the value of the right side of an assignment is
a reference to memory that stores a Java object.
Employee x = new Employee();
Employee y = x;

The reference is some address in memory.


42

y = x;

memory address = 42
Employee
object

42

After the assignment, the value of y is the same as the


value of x: a reference to the same Employee object.
Copyright 2011, Oracle and/or its affiliates. All rights reserved.

For Java objects, the value of an object reference is the memory pointer to the instance of the
Employee object created.
When you assign the value of x to y, you are not creating a new Employee object, but rather
a copy of the value of the reference.
Note: An object is a class instance or an array. The reference values (references) are
pointers to these objects, and a special null reference, which refers to no object.

Java SE 7 Programming 2 - 29

Oracle Internal & Oracle Academy Use Only

Objects Passed as Parameters

Whenever a new object is created, a new reference is


created. Consider the following code fragments:

public void foo(Employee e) {


e = new Employee();
e.setSalary (1_000_000_00);
}

// What happens to x here?

The value of x is unchanged as a result of the method call


foo:
x

42

Employee
object

99

Employee
object

Copyright 2011, Oracle and/or its affiliates. All rights reserved.

Whenever a new value is created, such as the e = new Employee(); statement in the
foo method, a new object is created and the value of the parameter is changed to the new
value.
The value of x is simply copied into the parameter for the method, so x remains unchanged
during and after the execution of the foo method.
What is the value returned from x.getSalary(); after the call foo(x);?
As illustrated, the value of the reference x is unchanged, and the value returned would be the
same as before the call. This is because you used the new keyword to construct a new object
and assigned that object instance to e. Whatever value e had before (the reference to x) is
now overwritten.
The setSalary method is operating on the reference e, not on the object reference passed
in to the method.
If you were to remove the statement, e = new Employee();, then the e.setSalary
method would be operating on the x reference, and the employee represented by the variable
x would be making a lot of money!
Note: The memory locations 42 and 99 are simply for illustrative purposes!

Java SE 7 Programming 2 - 30

Oracle Internal & Oracle Academy Use Only

Employee x = new Employee();


foo(x);

How to Compile and Run


Java class files must be compiled before running them.
To compile a Java source file, use the Java compiler (javac).

You can use the CLASSPATH environment variable to the


directory above the location of the package hierarchy.
After compiling the source .java file, a .class file is
generated.
To run the Java application, run it using the Java
interpreter (java):

java classpath <path to other classes> <package


name>.<classname>

Copyright 2011, Oracle and/or its affiliates. All rights reserved.

CLASSPATH
The CLASSPATH variable is used by both the Java compiler and the Java interpreter
(runtime).
The classpath can include:

A list of directory names (separated by semicolons in Windows and colons in UNIX)


- The classes are in a package tree relative to any of the directories on the list.
- The classpath includes the current working directory (.) by default.
A .zip or .jar file name that is fully qualified with its path name
-

The classes in these files must be zipped with the path names that are derived
from the directories formed by their package names.

Note: The directory containing the root name of the package tree must be added to the
classpath. Consider putting classpath information in the command window or even in the
Java command, rather than hard-coding it in the environment.

Java SE 7 Programming 2 - 31

Oracle Internal & Oracle Academy Use Only

javac classpath <path to other classes> -d <complier


output path> <path to source>.java

Compiling and Running: Example

Assume that the class shown in the notes is in the


directory D:\test\com\example:

javac d D:\test D:\test\com\example\HelloWorld.java

To run the application, you use the interpreter and the fully
qualified classname:

java classpath D:\test com.example.HelloWorld


Hello World!
java classpath D:\test com.example.HelloWorld Tom
Hello Tom!

The advantage of an IDE like NetBeans is that


management of the classpath, compilation, and running
the Java application are handled through the tool.
Copyright 2011, Oracle and/or its affiliates. All rights reserved.

Example
Consider the following simple class in a file named HelloWorld.java in the
D:\test\com\example directory:
package com.example;
public class HelloWorld {
public static void main (String [] args) {
if (args.length < 1) {
System.out.println("Hello World!");
} else {
System.out.println("Hello " + args[0] + "!");
}
}
}

Java SE 7 Programming 2 - 32

Oracle Internal & Oracle Academy Use Only

Java Class Loader


During execution of a Java program, the Java Virtual Machine
loads the compiled Java class files using a Java class of its
own called the class loader (java.lang.ClassLoader).
When an object is instantiated, the class loader is called:

public class Test {


public void someOperation() {
Employee e = new Employee();
//...
}
The class loader is called to "load"
this class into memory.
}
Test.class.getClassLoader().loadClass("Employee");

Copyright 2011, Oracle and/or its affiliates. All rights reserved.

Typically, the use of the class loader is completely invisible to you. You can see the results of
the class loader by using the -verbose flag when you run your application. For example:
java verbose classpath D:\test com.example.HelloWorld
[Loaded java.lang.Object from shared objects file]
[Loaded java.io.Serializable from shared objects file]
[Loaded java.lang.Comparable from shared objects file]
[Loaded java.lang.CharSequence from shared objects file]
[Loaded java.lang.String from shared objects file]
[Loaded java.lang.reflect.GenericDeclaration from shared objects
file]
[Loaded java.lang.reflect.Type from shared objects file]
[Loaded java.lang.reflect.AnnotatedElement from shared objects file]
[Loaded java.lang.Class from shared objects file]
[Loaded java.lang.Cloneable from shared objects file]
[Loaded java.lang.ClassLoader from shared objects file]
... and many more
Java SE 7 Programming 2 - 33

Oracle Internal & Oracle Academy Use Only

Garbage Collection

public void someMethod() {


Employee e = new Employee();
// operations on e
Object e scope ends here.
}

When someMethod completes, the memory referenced by


e is no longer accessible.

Java's garbage collector recognizes when an instance is


no longer accessible and automatically frees this memory.

Copyright 2011, Oracle and/or its affiliates. All rights reserved.

Java's garbage collection scheme can be tuned depending on the type of application you are
creating. For more information, consider taking the Oracle University course Java
Performance Tuning and Optimization (D69518GC10).

Java SE 7 Programming 2 - 34

Oracle Internal & Oracle Academy Use Only

When an object is instantiated using the new keyword, memory


is allocated for the object. The scope of an object reference
depends on where the object is instantiated:

Summary
In this lesson, you should have learned how to:
Create simple Java classes

Iterate with loops


Create arrays

Use Java fields, constructors, and methods


Use package and import statements

Copyright 2011, Oracle and/or its affiliates. All rights reserved.

Java SE 7 Programming 2 - 35

Oracle Internal & Oracle Academy Use Only

Create primitive variables


Manipulate Strings
Use if-else and switch branching statements

Quiz

package com.oracle.test;
public class BrokenClass {
public boolean valid = "false";
public String s = new String ("A new string");
public int i = 40_000.00;
public BrokenClass() { }
}

a.
b.
c.
d.
e.
f.

An import statement is missing.


The boolean valid is assigned a String.
String s is created using new.
BrokenClass method is missing a return statement.
Need a method to create a new BrokenClass object.
The integer value i is assigned a double.
Copyright 2011, Oracle and/or its affiliates. All rights reserved.

Java SE 7 Programming 2 - 36

Oracle Internal & Oracle Academy Use Only

In the following fragment, what three issues can you identify?

Quiz

public Employee changeName (Employee e, String name) {


e.name = name;
return (e);
}
//... in another class
Employee e = new Employee();
e.name = "Fred";
e = changeName("Bob", e);
System.out.println (e.getName());

a. Fred
b. Bob
c. null
d. empty String
Copyright 2011, Oracle and/or its affiliates. All rights reserved.

Java SE 7 Programming 2 - 37

Oracle Internal & Oracle Academy Use Only

Using the Employee class defined in this lesson, determine the


value of e.name in the following fragment:

Quiz

public float average (int[] values) {


float result = 0;
for (int i = 1; i < values.length; i++)
result += values;
return (result/values.length);
}
int[] nums = {100, 200, 300};
System.out.prinln (average(avg));

a.
b.
c.
d.

100
150.33
166.67
200

Copyright 2011, Oracle and/or its affiliates. All rights reserved.

Java SE 7 Programming 2 - 38

Oracle Internal & Oracle Academy Use Only

In the following fragment, what is the result?

This practice covers the following topics:


Creating a Java class using the NetBeans IDE
Creating a Java class with a main method
Writing code in the body of the main method to create an
instance of the Employee object and print values from the
class to the console
Compiling and testing the application using the NetBeans
IDE

Copyright 2011, Oracle and/or its affiliates. All rights reserved.

Java SE 7 Programming 2 - 39

Oracle Internal & Oracle Academy Use Only

Practice 2-1 Overview:


Creating Java Classes

Oracle Internal & Oracle Academy Use Only

Copyright 2011, Oracle and/or its affiliates. All rights reserved.

Oracle Internal & Oracle Academy Use Only

Encapsulation and Subclassing

After completing this lesson, you should be able to do the


following:
Use encapsulation in Java class design
Model business problems using Java classes
Make classes immutable
Create and use Java subclasses
Overload methods
Use variable argument methods

Copyright 2011, Oracle and/or its affiliates. All rights reserved.

Java SE 7 Programming 3 - 2

Oracle Internal & Oracle Academy Use Only

Objectives

The term encapsulation means to enclose in a capsule, or to


wrap something around an object to cover it. In object-oriented
programming, encapsulation covers, or wraps, the internal
workings of a Java object.
Data variables, or fields, are hidden from the user of the
object.
Methods, the functions in Java, provide an explicit service
to the user of the object but hide the implementation.
As long as the services do not change, the implementation
can be modified without impacting the user.

Copyright 2011, Oracle and/or its affiliates. All rights reserved.

The term encapsulation is defined by the Java Technology Reference Glossary as follows:
The localization of knowledge within a module. Because objects encapsulate data and
implementation, the user of an object can view the object as a black box that provides
services. Instance variables and methods can be added, deleted, or changed, but if the
services provided by the object remain the same, the code that uses the object can continue
to use it without being rewritten.
An analogy for encapsulation is the steering wheel of a car. When you drive a car, whether it
is your car, a friend's car, or a rental car, you probably never worry about how the steering
wheel implements a right-turn or left-turn function. The steering wheel could be connected to
the front wheels in a number of ways: ball and socket, rack and pinion, or some exotic set of
servo mechanisms.
As long as the car steers properly when you turn the wheel, the steering wheel encapsulates
the functions you needyou do not have to think about the implementation.

Java SE 7 Programming 3 - 3

Oracle Internal & Oracle Academy Use Only

Encapsulation

Encapsulation: Example

Employee ID
Name
Social Security Number
Salary

Set Name
Raise Salary

Copyright 2011, Oracle and/or its affiliates. All rights reserved.

A Simple Model
Suppose that you are asked to create a model of a typical employee. What data might you
want to represent in an object that describes an employee?
Employee ID: You can use this as a unique identifier for the employee.
Name: Humanizing an employee is always a good idea!
Social Security Number: For United States employees only. You may want some other
identification for non-U.S. employees.
Salary: How much the employee makes is always good to record.
What operations might you allow on the employee object?
Change Name: If the employee gets married or divorced, there could be a name
change.
Raise Salary: Increases based on merit
After an employee object is created, you probably do not want to allow changes to the
Employee ID or Social Security fields. Therefore, you need a way to create an employee
without alterations except through the allowed methods.

Java SE 7 Programming 3 - 4

Oracle Internal & Oracle Academy Use Only

What data and operations would you encapsulate in an object


that represents an employee?

Encapsulation: Private Data, Public Methods

1 public class CheckingAccount {


Declaring fields private prevents
2
private int custID;
direct access to this data from a class
3
private String name;
instance.
// illegal!
4
private double amount;
ca.amount = 1_000_000_000.00;
5
public CheckingAccount {
6
}
7
public void setAmount (double amount) {
8
this.amount = amount;
9
}
10
public double getAmount () {
11
return amount;
12
}
13
//... other public accessor and mutator methods
14 }
Copyright 2011, Oracle and/or its affiliates. All rights reserved.

In this example, the fields custID, name, and amount are now marked private, making
them invisible outside of the methods in the class itself.

Java SE 7 Programming 3 - 5

Oracle Internal & Oracle Academy Use Only

One way to hide implementation details is to declare all of the


fields private.

Public and Private Access Modifiers

The public keyword, applied to fields and methods,


allows any class in any package to access the field or
method.
The private keyword, applied to fields and methods,
allows access only to other methods within the class itself.

CheckingAccount chk = new CheckingAccount ();


chk.amount = 200; // Compiler error amount is a private field
chk.setAmount (200); // OK

The private keyword can also be applied to a method to


hide an implementation detail.

// Called when a withdrawal exceeds the available funds


private void applyOverdraftFee () {
amount += fee;
}

Copyright 2011, Oracle and/or its affiliates. All rights reserved.

Java SE 7 Programming 3 - 6

Oracle Internal & Oracle Academy Use Only

Revisiting Employee
The Employee class currently uses public access for all of
its fields. To encapsulate the data, make the fields private.

Encapsulation step 1:
Hide the data (fields).

Copyright 2011, Oracle and/or its affiliates. All rights reserved.

Java SE 7 Programming 3 - 7

Oracle Internal & Oracle Academy Use Only

package come.example.model;
public class Employee {
private int empId;
private String name;
private String ssn;
private double salary;
//... constructor and methods
}

Although the fields are now hidden using private access,


there are some issues with the current Employee class.
The setter methods (currently public access ) allow any
other class to change the ID, SSN, and salary (up or
down).
The current class does not really represent the operations
defined in the original Employee class design.

Two best practices for methods:


Hide as many of the implementation details as possible.
Name the method in a way that clearly identifies its use or
functionality.

The original model for the Employee class had a Change


Name and Increase Salary operation.
Copyright 2011, Oracle and/or its affiliates. All rights reserved.

Choosing Well-Intentioned Methods


Just as fields should clearly define the type of data that they store, methods should clearly
identify the operations that they perform. One of the easiest ways to improve the readability of
your code (Java code or any other) is to write method names that clearly identify what they
do.

Java SE 7 Programming 3 - 8

Oracle Internal & Oracle Academy Use Only

Method Naming: Best Practices

1 package com.example.domain;
2 public class Employee {
3
// private fields ...
4
public Employee () {
5
}
6
// Remove all of the other setters
7
public void setName(String newName) {
Encapsulation step 2:
8
if (newName != null) {
These method names
9
this.name = newName;
make sense in the
context of an
10
}
Employee.
11
}
12
13
public void raiseSalary(double increase) {
14
this.salary += increase;
15
}
16 }

Copyright 2011, Oracle and/or its affiliates. All rights reserved.

The current setter methods in the class allow any class that uses an instance of Employee to
alter the objects ID, salary, and SSN fields. From a business standpoint, these are not
operations you would want on an employee. Once the employee is created, these fields
should be immutable (no changes allowed).
The Employee model as defined in the slide titled Encapsulation: Example had only two
operations: one for changing an employee name (as a result of a marriage or divorce) and
one for increasing an employee's salary.
To refine the Employee class, the first step is to remove the setter methods and create
methods that clearly identify their purpose. Here there are two methods, one to change an
employee name (setName) and the other to increase an employee salary (raiseSalary).
Note that the implementation of the setName method tests the string parameter passed in to
make sure that the string is not a null. The method can do further checking as necessary.

Java SE 7 Programming 3 - 9

Oracle Internal & Oracle Academy Use Only

Employee Class Refined

1 package com.example.domain;
Encapsulation step 3:
2 public class Employee {
Remove the default
constructor; implement
3
// private fields ...
a constructor to set
4
// Create an employee object
the value of all fields.
5
public Employee (int empId, String name,
6
String ssn, double salary) {
7
this.empId = empId;
8
this.name = name;
9
this.ssn = ssn;
10
this.salary = salary;
11
}
12
13
public void setName(String newName) { ... }
14
15
public void raiseSalary(double increase) { ... }
16 }

Copyright 2011, Oracle and/or its affiliates. All rights reserved.

Good Practice: Immutability


Finally, because the class no longer has setter methods, you need a way to set the initial
value of the fields. The answer is to pass each field value in the construction of the object. By
creating a constructor that takes all of the fields as arguments, you can guarantee that an
Employee instance is fully populated with data before it is a valid employee object. This
constructor replaces the no-arg constructor.
Granted, the user of your class could pass null values, and you need to determine if you want
to check for those in your constructor. Strategies for handling those types of situations are
discussed in later lessons.
Removing the setter methods and replacing the no-arg constructor also guarantees that an
instance of Employee has immutable Employee ID and Social Security Number (SSN) fields.

Java SE 7 Programming 3 - 10

Oracle Internal & Oracle Academy Use Only

Make Classes as Immutable as Possible

Creating Subclasses

1 package com.example.domain;
2 public class Manager {
3
private int empId;
4
private String name;
5
private String ssn;
6
private double salary;
7
private String deptName;
8
public Manager () { }
9
// access and mutator methods...
10 }

Copyright 2011, Oracle and/or its affiliates. All rights reserved.

Specialization Using Java Subclassing


The Manager class shown here closely resembles the Employee class, but with some
specialization. A Manager also has a department, with a department name. As a result, there
are likely to be additional operations as well.
What this demonstrates is that a Manager is an Employeebut an Employee with
additional features.
However, if we were to define Java classes this way, there would be a lot of redundant
coding!

Java SE 7 Programming 3 - 11

Oracle Internal & Oracle Academy Use Only

You created a Java class to model the data and operations of


an Employee. Now suppose you wanted to specialize the data
and operations to describe a Manager.

Subclassing
In an object-oriented language like Java, subclassing is used to
define a new class in terms of an existing one.

this means "inherits"


subclass: Manager,
is an Employee
("child" class)

Copyright 2011, Oracle and/or its affiliates. All rights reserved.

A Simple Java Program


When an existing class is subclassed, the new class created is said to inherit the
characteristics of the other class. This new class is called the subclass and is a specialization
of the superclass. All of the non-private fields and methods from the superclass are part of the
subclass.
So in this diagram, a Manager class gets empId, name, SSN, salary, and all of the public
methods from Employee.
It is important to grasp that although Manager specializes Employee, a Manager is still an
Employee.
Note: The term subclass is a bit of a misnomer. Most people think of the prefix sub- as
meaning less. However, a Java subclass is the sum of itself and its parent. When you create
an instance of a subclass, the resulting in-memory structure contains all codes from the
parent class, grandparent class, and so on all the way up the class hierarchy until you reach
the class Object.

Java SE 7 Programming 3 - 12

Oracle Internal & Oracle Academy Use Only

superclass: Employee
("parent" class)

1 package com.example.domain;
2 public class Manager extends Employee {
3
private String deptName;
4
public Manager (int empId, String name,
5
String ssn, double salary, String dept) {
6
super (empId, name, ssn, salary);
7
this.deptName = dept;
The super keyword is used to
call the constructor of the parent
8
}
class. It must be the first
9
statement in the constructor.
10
public String getDeptName () {
11
return deptName;
12
}
13
// Manager also gets all of Employee's public methods!
14 }

Copyright 2011, Oracle and/or its affiliates. All rights reserved.

Java Syntax for Subclassing


The keyword extends is used to create a subclass.
The Manager class, by extending the Employee class, inherits all of the non-private data
fields and methods from Employee. After all, if a manager is also an employee, then it follows
that Manager has all of the same attributes and operations of Employee.
Note that the Manager class declares its own constructor. Constructors are not inherited from
the parent class. There are additional details about this in the next slide.
The constructor that Manager declares in line 4 calls the constructor of its parent class,
Employee, using the super keyword. This sets the value of all of the Employee fields: id,
name, ssn, and salary. Manager is a specialization of Employee, so constructing a
Manager requires a department name, which is assigned to the deptName field in line 7.
What other methods might you want in a model of Manager? Perhaps you want a method that
adds an Employee to this Manager. You can use an array or a special class called a
collection to keep track of the employees for whom this manager is responsible. For details
about collections, see the lesson titled Generics and Collections.

Java SE 7 Programming 3 - 13

Oracle Internal & Oracle Academy Use Only

Manager Subclass

Constructors Are Not Inherited

If you do not declare a constructor, a default no-argument


constructor is provided for you.
If you declare your own constructor, the default constructor is
no longer provided.

Copyright 2011, Oracle and/or its affiliates. All rights reserved.

Constructors in Subclasses
Every subclass inherits the non-private fields and methods from its parent (superclass).
However, the subclass does not inherit the constructor from its parent. It must provide a
constructor.
The Java Language Specification includes the following description:
Constructor declarations are not members. They are never inherited and therefore are not
subject to hiding or overriding.

Java SE 7 Programming 3 - 14

Oracle Internal & Oracle Academy Use Only

Although a subclass inherits all of the methods and fields from


a parent class, it does not inherit constructors. There are two
ways to gain a constructor:
Write your own constructor.
Use the default constructor.

Using super
To construct an instance of a subclass, it is often easiest to call
the constructor of the parent class.
In its constructor, Manager calls the constructor of
Employee.

The super keyword is used to call a parent's constructor.

It must be the first statement of the constructor.


If it is not provided, a default call to super() is inserted
for you.
The super keyword may also be used to invoke a parent's
method or to access a parent's (non-private) field.

Copyright 2011, Oracle and/or its affiliates. All rights reserved.

The Manager class declares its own constructor and calls the constructor of the parent class
using the super keyword.
Note: The super call of the parent's constructor must appear first in the constructor.
The super keyword can also be used to explicitly call the methods of the parent class or
access fields.

Java SE 7 Programming 3 - 15

Oracle Internal & Oracle Academy Use Only

super (empId, name, ssn, salary);

Constructing a Manager Object


Creating a Manager object is the same as creating an
Employee object:
Manager mgr = new Manager (102, "Barbara Jones",
"107-99-9078", 109345.67, "Marketing");

All of the Employee methods are available to Manager:

mgr.raiseSalary (10000.00);

The Manager class defines a new method to get the


Department Name:

String dept = mgr.getDeptName();

Copyright 2011, Oracle and/or its affiliates. All rights reserved.

Even though the Manager.java file does not contain all of the methods from the
Employee.java class (explicitly), they are included in the definition of the object. Thus, after
you create an instance of a Manager object, you can use the methods declared in
Employee.
You can also call methods that are specific to the Manager class as well.

Java SE 7 Programming 3 - 16

Oracle Internal & Oracle Academy Use Only

What Is Polymorphism?
The word polymorphism, strictly defined, means many forms.
Employee emp = new Manager();

This assignment is perfectly legal. An employee can be a


manager.
However, the following does not compile:

emp.setDeptName ("Marketing"); // compiler error!

The Java compiler recognizes the emp variable only as an


Employee object. Because the Employee class does not
have a setDeptName method, it shows an error.

Copyright 2011, Oracle and/or its affiliates. All rights reserved.

In object-oriented programming languages such as Java, polymorphism is the ability to refer


to an object using either its actual form or a parent form.
This is particularly useful when creating a general-purpose business method. For example,
you can raise the salary of any Employee object (parent or child) by simply passing the
object reference to a general-purpose business method that accepts an Employee object as
an argument.

Java SE 7 Programming 3 - 17

Oracle Internal & Oracle Academy Use Only

Overloading Methods
Your design may call for several methods in the same class
with the same name but with different arguments.

Java permits you to reuse a method name for more than


one method.
Two rules apply to overloaded methods:
Argument lists must differ.
Return types can be different.

Therefore, the following is not legal:

public void print (int i)


public String print (int i)

Copyright 2011, Oracle and/or its affiliates. All rights reserved.

You might want to design methods with the same intent (method name), like print, to print
out several different types. You could design a method for each type:
printInt(int i)
printFloat(float f)
printString(String s)
But this would be tedious and not very object-oriented. Instead, you can create a reusable
method name and just change the argument list. This process is called overloading.
With overloading methods, the argument lists must be differentin order, number, or type.
And the return types can be different. However, two methods with the same argument list that
differ only in return type are not allowed.

Java SE 7 Programming 3 - 18

Oracle Internal & Oracle Academy Use Only

public void print (int i)


public void print (float f)
public void print (String s)

Methods Using Variable Arguments


A variation of method overloading is when you need a method
that takes any number of arguments of the same type:

These three overloaded methods share the same


functionality. It would be nice to collapse these methods
into one method.

Statistics
float avg1
float avg2
float avg3

stats = new Statistics ();


= stats.average(100, 200);
= stats.average(100, 200, 300);
= stats.average(100, 200, 300, 400);

Copyright 2011, Oracle and/or its affiliates. All rights reserved.

Methods with a Variable Number of the Same Type


One case of overloading is when you need to provide a set of overloaded methods that differ
in the number of the same type of arguments. For example, suppose you want to have
methods to calculate an average. You may want to calculate averages for 2, 3, or 4 (or more)
integers.
Each of these methods performs a similar type of computationthe average of the arguments
passed in, as in this example:
public class Statistics {
public float average(int x1, int x2) { return (x1 + x2) / 2; }
public float average(int x1, int x2, int x3) {
return (x1 + x2 + x3) / 3;
}
public float average(int x1, int x2, int x3, int x4) {
return (x1 + x2 + x3 + x4) / 4;
}
}

Java provides a convenient syntax for collapsing these three methods into just one and
providing for any number of arguments.
Java SE 7 Programming 3 - 19

Oracle Internal & Oracle Academy Use Only

public class Statistics {


public float average (int x1, int x2) {}
public float average (int x1, int x2, int x3) {}
public float average (int x1, int x2, int x3, int x4) {}
}

Methods Using Variable Arguments

Java provides a feature called varargs or variable


The varargs notation
arguments.

Note that the nums argument is actually an array object of


type int[]. This permits the method to iterate over and
allow any number of elements.
Copyright 2011, Oracle and/or its affiliates. All rights reserved.

Using Variable Arguments


The average method shown in the slide takes any number of integer arguments. The
notation (int... nums) converts the list of arguments passed to the average method into
an array object of type int.
Note: Methods that use varargs can also take no parametersan invocation of average()
is legal. You will see varargs as optional parameters in use in the NIO.2 API in the lesson
titled Java File I/O. To account for this, you could rewrite the average method in the slide
as follows:
public float average(int... nums) {
int sum = 0; float result = 0;
if (nums.length > 0) {
for (int x : nums)

// iterate int array nums

sum += x;
result = (float) sum / nums.length;
}
return (result);
}
}

Java SE 7 Programming 3 - 20

Oracle Internal & Oracle Academy Use Only

treats the nums

1 public class Statistics {


parameter as an array.
2
public float average(int... nums) {
3
int sum = 0;
4
for (int x : nums) { // iterate int array nums
5
sum += x;
6
}
7
return ((float) sum / nums.length);
8
}
9 }

Single Inheritance

Copyright 2011, Oracle and/or its affiliates. All rights reserved.

Although Java does not permit more than one class to a subclass, the language does provide
features that enable multiple classes to implement the features of other classes. You will see
this in the lesson on inheritance.
Single inheritance does not prevent continued refinement and specialization of classes as
shown above.
In the diagram shown in the slide, a manager can have employees, and a director has a
budget and can approve expenses.

Java SE 7 Programming 3 - 21

Oracle Internal & Oracle Academy Use Only

The Java programming language permits a class to extend only


one other class. This is called single inheritance.

In this lesson, you should have learned how to:


Create simple Java classes
Use encapsulation in Java class design
Model business problems using Java classes
Make classes immutable
Create and use Java subclasses
Overload methods
Use variable argument methods

Copyright 2011, Oracle and/or its affiliates. All rights reserved.

Java SE 7 Programming 3 - 22

Oracle Internal & Oracle Academy Use Only

Summary

Quiz
Given the diagram in the slide titled Single Inheritance and
the following Java statements, which statement does not
compile?

a. e.addEmployee (a);
b. m.addEmployee(a);
c. m.approveExpense(100000.00);
d. All of them fail to compile.

Copyright 2011, Oracle and/or its affiliates. All rights reserved.

Java SE 7 Programming 3 - 23

Oracle Internal & Oracle Academy Use Only

Employee e = new Director();


Manager m = new Director();
Admin a = new Admin();

Quiz

public class Account {


private double balance;
public Account(double balance) { this.balance = balance; }
//... getter and setter for balance
}
public class Savings extends Account {
private double interestRate;
public Savings(double rate) { interestRate = rate; }
}

What fix allows these classes to compile?


a. Add a no-arg constructor to Savings.
b. Call the setBalance method of Account from Savings.
c. Change the access of interestRate to public.
d. Add a constructor to Savings that calls the constructor of
Account using super.
Copyright 2011, Oracle and/or its affiliates. All rights reserved.

Java SE 7 Programming 3 - 24

Oracle Internal & Oracle Academy Use Only

Consider the following classes that do not compile:

Quiz
Which of the following declarations demonstrates the
application of good Java naming conventions?

d. public int calcOffset (int xCoord, int


yCoord) { }

Copyright 2011, Oracle and/or its affiliates. All rights reserved.

Java SE 7 Programming 3 - 25

Oracle Internal & Oracle Academy Use Only

a. public class repeat { }


b. public void Screencoord (int x, int y){}
c. private int XCOORD;

Quiz

public class Stock {


public String symbol;
public double price;
public int shares;
public double getStockValue() { }
public void setSymbol(String symbol) { }
public void setPrice(double price) { }
public void setShares(int number) { }
}

a.
b.
c.
d.

Make the fields symbol, shares, and price private.


Remove setSymbol, setPrice, and setShares.
Make the getStockValue method private.
Add a constructor that takes symbol, shares, and price
as arguments.
Copyright 2011, Oracle and/or its affiliates. All rights reserved.

Java SE 7 Programming 3 - 26

Oracle Internal & Oracle Academy Use Only

What changes would you perform to make this class


immutable? (Choose all that apply.)

This practice covers the following topics:


Applying encapsulation principles to the Employee class
that you created in the previous practice
Creating subclasses of Employee, including Manager,
Engineer, and Administrative assistant (Admin)
Creating a subclass of Manager called Director
Creating a test class with a main method to test your new
classes

Copyright 2011, Oracle and/or its affiliates. All rights reserved.

Java SE 7 Programming 3 - 27

Oracle Internal & Oracle Academy Use Only

Practice 3-1 Overview:


Creating Subclasses

(Optional) Practice 3-2 Overview:


Adding a Staff to a Manager

Creating a method to add an employee to the manager's


staff

Creating a method to remove an employee from the


manager's staff

Copyright 2011, Oracle and/or its affiliates. All rights reserved.

Java SE 7 Programming 3 - 28

Oracle Internal & Oracle Academy Use Only

This practice covers the following topics:


Creating an array of Employees called staff

Copyright 2011, Oracle and/or its affiliates. All rights reserved.

Oracle Internal & Oracle Academy Use Only

Java Class Design

After completing this lesson, you should be able to do the


following:
Use access levels: private, protected, default, and
public.
Override methods
Overload constructors and other methods appropriately
Use the instanceof operator to compare object types
Use virtual method invocation
Use upward and downward casts
Override methods from the
Object class to improve
the functionality of your class

Copyright 2011, Oracle and/or its affiliates. All rights reserved.

Java SE 7 Programming 4 - 2

Oracle Internal & Oracle Academy Use Only

Objectives

Using Access Control


You have seen the keywords public and private. There are
four access levels that can be applied to data fields and
methods. The following table illustrates access to a field or
method marked with the access modifier in the left column.
Same Class

Same
Package

private

Yes

default

Yes

Yes

protected

Yes

Yes

public

Yes

Yes

Subclass in
Another
Package

Yes

Universe

Yes

Yes

Classes can be default (no modifier) or public.


Copyright 2011, Oracle and/or its affiliates. All rights reserved.

The access modifier keywords shown in this table are private, protected, and public.
When a keyword is absent, the default access modifier is applied.
The private keyword provides the greatest control over access to fields and methods.
With private, a data field or method can be accessed only within the same Java class.
The public keyword provides the greatest access to fields and methods, making them
accessible anywhere: in the class, package, subclasses, and any other class.
The protected keyword is applied to keep access within the package and subclass. Fields
and methods that use protected are said to be subclass-friendly.

*Note: protected access is extended to subclasses that reside in a package different from
the class that owns the protected feature. As a result, protected fields or methods are actually
more accessible than those marked with default access control. You should use protected
access when it is appropriate for a classs subclass, but not unrelated classes.

Java SE 7 Programming 4 - 3

Oracle Internal & Oracle Academy Use Only

Modifier
(keyword)

Protected Access Control: Example

1
2
3
4
5
6
7
8
9

package test;
import demo.Foo;
public class Bar extends Foo {
private int sum = 10;
public void reportSum () {
sum += result;
sum += other;
}
}

subclass-friendly declaration

compiler error

Copyright 2011, Oracle and/or its affiliates. All rights reserved.

In this example, there are two classes in two packages. Class Foo is in the package demo,
and declares a data field called result with a protected access modifier.
In the class Bar, which extends Foo, there is a method, reportSum, that adds the value of
result to sum. The method then attempts to add the value of other to sum. The field
other is declared using the default modifier, and this generates a compiler error. Why?
Answer: The field result, declared as a protected field, is available to all
subclasseseven those in a different package. The field other is declared as using default
access and is only available to classes and subclasses declared in the same package.
This example is from the JavaAccessExample project.

Java SE 7 Programming 4 - 4

Oracle Internal & Oracle Academy Use Only

1 package demo;
2 public class Foo {
3
protected int result = 20;
4
int other = 25;
5 }

Field Shadowing: Example

1
2
3
4
5
6
7
8
9

package test;
import demo.Foo2;
public class Bar2 extends Foo2 {
private int sum = 10;
private int result = 30;
public void reportSum() {
sum += result;
}
}

result field shadows


the parent's field.

Copyright 2011, Oracle and/or its affiliates. All rights reserved.

In this example, the class Foo2 declares the field result. However, the class Bar2 declares
its own field result. The consequence is that the field result from class Foo2 is
shadowed by the field result in class Bar2. What is sum in this example? sum is now 40
(10 + 30). Modern IDEs (such as NetBeans) detect shadowing and produce a warning.
Methods with the same name are not shadowed but are overridden. You learn about
overriding later in this lesson.

Java SE 7 Programming 4 - 5

Oracle Internal & Oracle Academy Use Only

1 package demo;
2 public class Foo2 {
3
protected int result = 20;
4 }

Access Control: Good Practice

1 package demo;
2 public class Foo3 {
3
private int result = 20;
4
protected int getResult() { result = value; }
5 }
1
2
3
4
5
6
7
8

package test;
import demo.Foo3;
public class Bar3 extends Foo3 {
private int sum = 10;
public void reportSum() {
sum += getResult();
}
}
Copyright 2011, Oracle and/or its affiliates. All rights reserved.

A slightly modified version of the example using the protected keyword is shown in the
slide. If the idea is to limit access of the field result to classes within the package and the
subclasses (package-protected), you should make the access explicit by defining a method
purposefully written for package and subclass-level access.

Java SE 7 Programming 4 - 6

Oracle Internal & Oracle Academy Use Only

A good practice when working with fields is to make fields as


inaccessible as possible, and provide clear intent for the use of
fields through methods.

Overriding Methods

1 public class Employee {


2
private int empId;
3
private String name;
4
// ... other fields and methods
5
public String getDetails () {
6
return "Employee id: " + empId +
7
" Employee name:" + name;
8
}
9 }

Copyright 2011, Oracle and/or its affiliates. All rights reserved.

Although the Employee class has getters to return values for a print statement, it might be
nice to have a utility method to get specific details about the employee. Consider a method
added to the Employee class to print details about the Employee object.
In addition to adding fields or methods to a subclass, you can also modify or change the
existing behavior of a method of the parent (superclass).
You may want to specialize this method to describe a Manager object.

Java SE 7 Programming 4 - 7

Oracle Internal & Oracle Academy Use Only

Consider a requirement to provide a String that represents


some details about the Employee class fields.

Overriding Methods

1 public class Manager extends Employee {


2
private String deptName;
3
// ... other fields and methods
4
public String getDetails () {
5
return super.getDetails () +
6
" Department: " + deptName;
7
}
8 }

A subclass can invoke a parent method by using the super


keyword.

Copyright 2011, Oracle and/or its affiliates. All rights reserved.

When a method is overridden, it replaces the method in the superclass (parent) class.
This method is called for any Manager instance.
A call of the form super.getDetails() invokes the getDetails method of the parent
class.
Note: If, for example, a class declares two public methods with the same name, and a
subclass overrides one of them, the subclass still inherits the other method.

Java SE 7 Programming 4 - 8

Oracle Internal & Oracle Academy Use Only

In the Manager class, by creating a method with the same


signature as the method in the Employee class, you are
overriding the getDetails method:

Invoking an Overridden Method

Using the previous examples of Employee and Manager:

The correct getDetails method of each class is called:

Employee id: 101 Employee name: Jim Smith


Employee id: 102 Employee name: Joan Kern Department: Marketing

Copyright 2011, Oracle and/or its affiliates. All rights reserved.

During run time, the Java Virtual Machine invokes the getDetails method of the
appropriate class. If you comment out the getDetails method in the Manager class shown
in the previous slide, what happens when m.getDetails()is invoked?
Answer: Recall that methods are inherited from the parent class. So, at run time, the
getDetails method of the parent class (Employee) is executed.

Java SE 7 Programming 4 - 9

Oracle Internal & Oracle Academy Use Only

Employee e = new Employee (101, "Jim Smith", "011-12-2345",


100_000.00);
Manager m = new Manager (102, "Joan Kern", "012-23-4567",
110_450.54, "Marketing");
System.out.println (e.getDetails());
System.out.println (m.getDetails());

Virtual Method Invocation

What happens if you have the following?

Employee e = new Manager (102, "Joan Kern", "012-23-4567",


110_450.54, "Marketing");
System.out.println (e.getDetails());

During execution, the objects runtime type is determined


to be a Manager object:

Employee id: 102 Employee name: Joan Kern Department: Marketing

The compiler is satisfied because the Employee class has


a getDetails method, and at run time the method that is
executed is referenced from a Manager object.
This is an aspect of polymorphism called virtual method
invocation.

Copyright 2011, Oracle and/or its affiliates. All rights reserved.

Compiler Versus Runtime Behavior


The important thing to remember is the difference between the compiler (which checks that
each method and field is accessible based on the strict definition of the class) and the
behavior associated with an object determined at run time.
This distinction is an important and powerful aspect of polymorphism: The behavior of an
object is determined by its runtime reference.
Because the object you created was a Manager object, at run time, when the getDetails
method was invoked, the run time reference is to the getDetails method of a Manager
class, even though the variable e is of the type Employee.
This behavior is referred to as virtual method invocation.
Note: If you are a C++ programmer, you get this behavior in C++ only if you mark the method
using the C++ keyword virtual.

Java SE 7 Programming 4 - 10

Oracle Internal & Oracle Academy Use Only

Accessibility of Overridden Methods


An overriden method cannot be less accessible than the
method in the parent class.

public class Manager extends Employee {


//... other fields and methods
private String getDetails() { //... }
}
public class OverriddingTest {
Employee e = new Manager(102, "Joan Kern", "012-23-4567",
110_450.54, "Marketing");
e.getDetails(); // illegal method is private
}
}
Copyright 2011, Oracle and/or its affiliates. All rights reserved.

To override a method, the name and the order of arguments must be identical.
By changing the access of the Manager getDetails method to private, only that class
can execute the method. However, language semantics for the execution of e.getDetails
dictate that the Manager getDetails method is executed. The result is a runtime error.
What happens if you make the Employee method getDetails private and the Manager
method public?
Answer: Because the compiler does type checking, the compiler complains that you are
attempting to access a private method in Employee.

Java SE 7 Programming 4 - 11

Oracle Internal & Oracle Academy Use Only

public class Employee {


//... other fields and methods
public String getDetails() { ... }
}

Applying Polymorphism

1 public class EmployeeStockPlan {


2
public int grantStock (Manager m) {
3
// perform a calculation for a Manager
4
}
5
public int grantStock (Engineer e) {
6
// perform a calculation for an Engineer
7
}
8
public int grantStock (Admin a) {
9
// perform a calculation for an Admin
10
}
11
//... one method per employee type
12}

Copyright 2011, Oracle and/or its affiliates. All rights reserved.

Design Problem
What is the problem in the example in the slide? Each method performs the calculation
based on the type of employee passed in, and returns the number of shares.
Consider what happens if you add two or three more employee types. You would need to add
three additional methods, and possibly replicate code depending upon the business logic
required to compute shares.
Clearly, this is not a good way to treat this problem. Although the code will work, this is not
easy to read and is likely to create much duplicate code.

Java SE 7 Programming 4 - 12

Oracle Internal & Oracle Academy Use Only

Suppose that you are asked to create a new class that


calculates a stock grant for employees based on their salary
and their role (manager, engineer, or admin):

Applying Polymorphism
A good practice is to pass parameters and write methods that
use the most generic form of your object as possible.

// In the application class


EmployeeStockPlan esp = new EmployeeStockPlan ():
Manager m = new Manager ();
int stocksGranted = grantStock (m);
...

Copyright 2011, Oracle and/or its affiliates. All rights reserved.

Use the Most Generic Form


A good practice is to design and write methods that take the most generic form of your object
as possible.
In this case, Employee is a good base class to start from. But how do you know what object
type is passed in? You learn the answer in the next slide.

Java SE 7 Programming 4 - 13

Oracle Internal & Oracle Academy Use Only

public class EmployeeStockPlan {


public int grantStock (Employee e) {
// perform a calculation based on Employee data
}
}

Using the instanceof Keyword

1 public class EmployeeStockPlan {


2
public int grantStock (Employee e) {
3
// perform a calculation based on Employee data
4
if (e instanceof Manager) {
5
// process Manager stock grant
6
} else if (e instanceof Engineer) {
7
// process Engineer stock grant
8
} else if (e instanceof Admin) {
9
// process Admin stock grant
10
} else {
11
// perhaps an error a generic Employee?
12
}
13
}
14}
Copyright 2011, Oracle and/or its affiliates. All rights reserved.

In this modified EmployeeStockPlan, the grantStock method uses instanceof to


determine what type of Employee was passed to the method.
Another approach to this problem is to use the new capability in JDK 7 to switch on Strings:
String type = emp.getClass().getSimpleName();
switch (type) {
case "Engineer":
// process Engineer grant
case "Admin":
// process Admin grant
case "Manager":
// process Manager grant
case "Director":
// process Director grant
default:
// error result
}

Java SE 7 Programming 4 - 14

Oracle Internal & Oracle Academy Use Only

The Java language provides the instanceof keyword to


determine an objects class type at run time.

Casting Object References

1 public void modifyDeptForManager (Employee e, String dept) {


2
if (e instanceof Manager) {
3
Manager m = (Manager) e;
4
m.setDeptName (dept);
5
}
6 }

Without the cast to Manager, the setDeptName method


would not compile.

Copyright 2011, Oracle and/or its affiliates. All rights reserved.

Although a generic superclass reference is useful for passing objects around, you may need
to use a method from the subclass.
In the slide, for example, you need the setDeptName method of the Manager class. To
satisfy the compiler, you can cast a reference from the generic superclass to the specific
class.
However, there are rules for casting references. You see these in the next slide.

Java SE 7 Programming 4 - 15

Oracle Internal & Oracle Academy Use Only

After using the instanceof operator to verify that the object


you received as an argument is a subclass, you can access
the full functionality of the object by casting the reference:

Casting Rules
Upward casts are always permitted and do not require a cast
operator.

Employee e = m; // OK

Employee e = d; // OK
Manager m = d; // OK

Copyright 2011, Oracle and/or its affiliates. All rights reserved.

Java SE 7 Programming 4 - 16

Oracle Internal & Oracle Academy Use Only

Director d = new Director();


Manager m = new Manager();

Casting Rules
For downward casts, the compiler must be satisfied that the
cast is at least possible.

Manager m = (Manager)e;
// Would also work if
// e was a Director obj

Director d = (Director)m;
// fails at run time

Engineer eng = (Engineer)m;


// compiler error

Copyright 2011, Oracle and/or its affiliates. All rights reserved.

Downward Casts
With a downward cast, the compiler simply determines if the cast is possible; if the cast down
is to a subclass, then it is possible that the cast will succeed.
Note that at run time the cast results in a java.lang.ClassCastException if the object
reference is of a superclass and not of the class type or a subclass.
The cast of the variable e to a Manager reference m satisfies the compiler, because Manager
and Employee are in the same class hierarchy, so the cast will possibly succeed. This cast
also works at run time, because it turns out that the variable e is actually a Manager object.
This cast would also work at run time if e pointed to an instance of a Director object.
The cast of the variable m to a Director instance satisfies the compiler, but because m is
actually a Manager instance, this cast fails at run time with a ClassCastException.
Finally, any cast will fail that is outside the class hierarchy, such as the cast from a Manager
instance to an Engineer. A Manager and an Engineer are both employees, but a
Manager is not an Engineer.

Java SE 7 Programming 4 - 17

Oracle Internal & Oracle Academy Use Only

Employee e = new Manager();


Manager m = new Manager();

Overriding Object methods


One of the advantages of single inheritance is that every class
has a parent object by default. The root class of every Java
class is java.lang.Object.

You do not have to declare that your class extends


Object. The compiler does that for you.
is equivalent to:

public class Employee extends Object { //... }

The root class contains several non-final methods, but


there are three that are important to consider overriding:
toString, equals, and hashCode

Copyright 2011, Oracle and/or its affiliates. All rights reserved.

Best Practice: Overload Object Methods


The java.lang.Object class is the root class of all classes in the Java programming
language. All classes will subclass Object by default.
Object defines several non-final methods that are designed to be overridden by your class.
These are equals, hashCode, toString, clone, and finalize. Of these, there are three
methods that you should consider overriding.

Java SE 7 Programming 4 - 18

Oracle Internal & Oracle Academy Use Only

public class Employee { //... }

Object toString Method


The toString method is called whenever an instance of your
class is passed to a method that takes a String, such as
println:
Employee e = new Employee (101, "Jim Kern", ...)
System.out.println (e);

You can use toString to provide instance information:

public String toString () {


return "Employee id: " + empId + "\n"
"Employee name:" + name;
}

This is a better approach to getting details about your class


than creating your own getDetails method.

Copyright 2011, Oracle and/or its affiliates. All rights reserved.

Note: Sometimes you may want to be able to print out the name of the class that is executing
a method. The getClass() method is an Object method used to return the Class object
instance, and the getName() method provides the fully qualified name of the runtime class.
getClass().getName(); // returns the name of this class instance
These methods are in the Object class.

Java SE 7 Programming 4 - 19

Oracle Internal & Oracle Academy Use Only

Object equals Method


The Object equals method compares only object references.

If there are two objects x and y in any class, x is equal to y


if and only if x and y refer to the same object.
Example:

Employee
Employee
x.equals
Employee
x.equals

x = new
y = x;
(y); //
z = new
(z); //

Employee (1,"Sue","111-11-1111",10.0);
true
Employee (1,"Sue","111-11-1111",10.0);
false!

Because what we really want is to test the contents of the


Employee object, we need to override the equals method:

public boolean equals (Object o) { ... }

Copyright 2011, Oracle and/or its affiliates. All rights reserved.

The equals method of Object determines (by default) only if the values of two object
references point to the same object. Basically, the test in the Object class is simply as
follows:
If x == y, return true.
For an object (like the Employee object) that contains values, this comparison is not
sufficient, particularly if we want to make sure there is one and only one employee with a
particular ID.

Java SE 7 Programming 4 - 20

Oracle Internal & Oracle Academy Use Only

Overriding equals in Employee

1 public boolean equals (Object o) {


2
boolean result = false;
3
if ((o != null) && (o instanceof Employee)) {
4
Employee e = (Employee)o;
5
if ((e.empId == this.empId) &&
6
(e.name.equals(this.name)) &&
7
(e.ssn.equals(this.ssn)) &&
8
(e.salary == this.salary)) {
9
result = true;
10
}
11
}
12
return result;
13 }

Copyright 2011, Oracle and/or its affiliates. All rights reserved.

This simple equals test first tests to make sure that the object passed in is not null, and then
tests to make sure that it is an instance of an Employee class (all subclasses are also
employees, so this works). Then the Object is cast to Employee, and each field in
Employee is checked for equality.
Note: For String types, you should use the equals method to test the strings character by
character for equality.

Java SE 7 Programming 4 - 21

Oracle Internal & Oracle Academy Use Only

An example of overriding the equals method in the Employee


class compares every field for equality:

Overriding Object hashCode

1 // Generated by NetBeans
2 public int hashCode() {
3
int hash = 7;
4
hash = 83 * hash + this.empId;
5
hash = 83 * hash + Objects.hashCode(this.name);
6
hash = 83 * hash + Objects.hashCode(this.ssn);
7
hash = 83 * hash + (int)
(Double.doubleToLongBits(this.salary) ^
(Double.doubleToLongBits(this.salary) >>> 32));
8
return hash;
9 }

Copyright 2011, Oracle and/or its affiliates. All rights reserved.

Overriding hashCode
The Java documentation for the Object class states:
"... It is generally necessary to override the hashCode method whenever this method
[equals] is overridden, so as to maintain the general contract for the hashCode method,
which states that equal objects must have equal hash codes."
The hashCode method is used in conjunction with the equals method in hash-based
collections, such as HashMap, HashSet, and Hashtable.
This method is easy to get wrong, so you need to be careful. The good news is that IDEs
such as NetBeans can generate hashCode for you.
To create your own hash function, the following will help approximate a reasonable hash
value for equal and unequal instances:
1) Start with a non-zero integer constant. Prime numbers result in fewer hashcode
collisions.
2) For each field used in the equals method, compute an int hash code for the field.
Notice that for the Strings, you can use the hashCode of the String.
3) Add the computed hash codes together.
4) Return the result.
Java SE 7 Programming 4 - 22

Oracle Internal & Oracle Academy Use Only

The general contract for Object states that if two objects are
considered equal (using the equals method), then integer
hashcode returned for the two objects should also be equal.

In this lesson, you should have learned how to:


Use access levels: private, protected, default, and
public
Override methods
Overload constructors and other methods appropriately
Use the instanceof operator to compare object types

Use virtual method invocation


Use upward and downward casts
Override methods from the Object class
to improve the functionality of your class

Copyright 2011, Oracle and/or its affiliates. All rights reserved.

Java SE 7 Programming 4 - 23

Oracle Internal & Oracle Academy Use Only

Summary

Quiz
Suppose that you have an Account class with a withdraw()
method, and a Checking class that extends Account that
declares its own withdraw() method. What is the result of the
following code fragment?
Account acct = new Checking();
acct.withdraw(100);

a. The compiler complains about line 1.


b.
c.
d.
e.

The compiler complains about line 2.


Runtime error: incompatible assignment (line 1)
The Account.withdraw() method executes.
The Checking.withdraw() method executes.

Copyright 2011, Oracle and/or its affiliates. All rights reserved.

Java SE 7 Programming 4 - 24

Oracle Internal & Oracle Academy Use Only

1
2

Quiz
Suppose that you have an Account class and a Checking
class that extends Account. The body of the if statement in
line 2 will execute.
Account acct = new Checking();
if (acct instanceof Checking) { // will this block run? }

a. True
b. False

Copyright 2011, Oracle and/or its affiliates. All rights reserved.

Java SE 7 Programming 4 - 25

Oracle Internal & Oracle Academy Use Only

1
2

Quiz
Suppose that you have an Account class and a Checking
class that extends Account. You also have a Savings class
that extends Account. What is the result of the following code?
Account acct1 = new Checking();
Account acct2 = new Savings();
Savings acct3 = (Savings)acct1;

a.
b.
c.
d.

acct3 contains the reference to acct1.


A runtime ClassCastException occurs.
The compiler complains about line 2.
The compiler complains about the cast in line 3.

Copyright 2011, Oracle and/or its affiliates. All rights reserved.

Java SE 7 Programming 4 - 26

Oracle Internal & Oracle Academy Use Only

1
2
3

Quiz

10
11
12
13
14
15
16

package com.bank.type;
import com.bank.Account;
public class Savings extends Account {
private double interest;
Account acct = new Account();
public double getBalance (){ return (interest + balance); }
}

What change would make this code compile?

a.
b.
c.
d.

Make balance private in line 3.


Make balance protected in line 3.
Replace balance with acct.balance in line 15.
Replace balance with Account.balance in line 15.

Copyright 2011, Oracle and/or its affiliates. All rights reserved.

Java SE 7 Programming 4 - 27

Oracle Internal & Oracle Academy Use Only

1 package com.bank;
2 public class Account {
3
double balance;
4 }

Practice 4-1 Overview:


Overriding Methods and Applying Polymorphism

Copyright 2011, Oracle and/or its affiliates. All rights reserved.

Java SE 7 Programming 4 - 28

Oracle Internal & Oracle Academy Use Only

This practice covers the following topics:


Modifying the Employee, Manager, and Director
classes; overriding the toString() method
Creating an EmployeeStockPlan class with a grant
stock method that uses the instanceof keyword

Copyright 2011, Oracle and/or its affiliates. All rights reserved.

Oracle Internal & Oracle Academy Use Only

Advanced Class Design

After completing this lesson, you should be able to do the


following:
Design general-purpose base classes by using abstract
classes
Construct abstract Java classes and subclasses
Model business problems by using the static and final
keywords
Implement the singleton design pattern
Distinguish between top-level and nested classes

Copyright 2011, Oracle and/or its affiliates. All rights reserved.

Java SE 7 Programming 5 - 2

Oracle Internal & Oracle Academy Use Only

Objectives

Inheritance (or subclassing) is an essential feature of the Java


programming language. Inheritance provides code reuse
through:
Method inheritance: Subclasses avoid code duplication by
inheriting method implementations.
Generalization: Code that is designed to rely on the most
generic type possible is easier to maintain.

Class Inheritance Diagram


Copyright 2011, Oracle and/or its affiliates. All rights reserved.

Class Inheritance
When designing an object-oriented solution, you should attempt to avoid code duplication.
One technique to avoid duplication is to create library methods and classes. Libraries function
as a central point to contain often reused code. Another technique to avoid code duplication is
to use class inheritance. When there is a shared base type identified between two classes,
any shared code may be placed in a parent class.
When possible, use object references of the most generic base type possible. In Java,
generalization and specialization enable reuse through method inheritance and virtual method
invocation (VMI). VMI, sometimes called late-binding, enables a caller to dynamically call a
method as long as the method has been declared in a generic base type.

Java SE 7 Programming 5 - 3

Oracle Internal & Oracle Academy Use Only

Modeling Business Problems with Classes

Enabling Generalization
Coding to a common base type allows for the introduction of
new subclasses with little or no modification of any code that
depends on the more generic base type.

Always use the most generic reference type possible.

Copyright 2011, Oracle and/or its affiliates. All rights reserved.

Coding for Generalization


Always use the most generic reference type possible. Java IDEs may contain refactoring tools
that assist in changing existing references to a more generic base type.

Java SE 7 Programming 5 - 4

Oracle Internal & Oracle Academy Use Only

ElectronicDevice dev = new Television();


dev.turnOn(); // all ElectronicDevices can be turned on

Identifying the Need for Abstract Classes


Subclasses may not need to inherit a method implementation if
the method is specialized.

public void turnOn() {


changeChannel(1);
initializeScreen();
}
public void turnOff() {}
public void changeChannel(int channel) {}
public void initializeScreen() {}
}

Copyright 2011, Oracle and/or its affiliates. All rights reserved.

Method Implementations
When sibling classes have a common method, it is typically placed in a parent class. Under
some circumstances, however, the parent class's implementation will always need to be
overridden with a specialized implementation.
In these cases, inclusion of the method in a parent class has both advantages and
disadvantages. It allows the use of generic reference types, but developers can easily forget
to supply the specialized implementation in the subclasses.

Java SE 7 Programming 5 - 5

Oracle Internal & Oracle Academy Use Only

public class Television extends ElectronicDevice {

Defining Abstract Classes


A class can be declared as abstract by using the abstract
class-level modifier.
public abstract class ElectronicDevice { }

An abstract class can be subclassed.

public class Television extends ElectronicDevice { }

An abstract class cannot be instantiated.

ElectronicDevice dev = new ElectronicDevice(); // error

Copyright 2011, Oracle and/or its affiliates. All rights reserved.

Declaring a class as abstract prevents any instances of that class from being created. It is a
compile-time error to instantiate an abstract class. An abstract class will typically be extended
by a child class and may be used as a reference type.

Java SE 7 Programming 5 - 6

Oracle Internal & Oracle Academy Use Only

Defining Abstract Methods


A method can be declared as abstract by using the abstract
method-level modifier.

public abstract void turnOn();


public abstract void turnOff();
No braces

An abstract method:
Cannot have a method body
Must be declared in an abstract class
Is overridden in subclasses

Copyright 2011, Oracle and/or its affiliates. All rights reserved.

Inheriting Abstract Methods


When a child class inherits an abstract method, it is inheriting a method signature but no
implementation. For this reason, no braces are allowed when defining an abstract method.
An abstract method is a way to guarantee that any child class will contain a method with a
matching signature.

Java SE 7 Programming 5 - 7

Oracle Internal & Oracle Academy Use Only

public abstract class ElectronicDevice {

Validating Abstract Classes

Declare the child class as abstract.


Override all abstract methods inherited from the parent class.
Failure to do so will result in a compile-time error.
error: Television is not abstract and does not override
abstract method turnOn() in ElectronicDevice

Copyright 2011, Oracle and/or its affiliates. All rights reserved.

Making Use of Abstract Classes


While it is possible to avoid implementing an abstract method by declaring child classes as
abstract, this only serves to delay the inevitable. Applications require non-abstract methods to
create objects. Use abstract methods to outline functionality required in child classes.

Java SE 7 Programming 5 - 8

Oracle Internal & Oracle Academy Use Only

The following additional rules apply when you use abstract


classes and methods:
An abstract class may have any number of abstract and
non-abstract methods.
When inheriting from an abstract class, you must do either
of the following:

Quiz

Copyright 2011, Oracle and/or its affiliates. All rights reserved.

Java SE 7 Programming 5 - 9

Oracle Internal & Oracle Academy Use Only

To compile successfully, an abstract method must not have:


a. A return value
b. A method implementation
c. Method parameters
d. private access

The static modifier is used to declare fields and methods as


class-level resources. Static class members:
Can be used without object instances
Are used when a problem is best solved without objects
Are used when objects of the same type need to share
fields
Should not be used to bypass the object-oriented features
of Java unless there is a good reason

Copyright 2011, Oracle and/or its affiliates. All rights reserved.

Java: Object-oriented by Design


The Java programming language was designed as an object-oriented language, unlike
languages like Objective-C and C++, which inherited the procedural design of C. When
developing in Java, you should always attempt to design an object-oriented solution.

Java SE 7 Programming 5 - 10

Oracle Internal & Oracle Academy Use Only

static Keyword

Static Methods
Static methods are methods that can be called even if the class
they are declared in has not been instantiated. Static methods:
Are called class methods
Are useful for APIs that are not object oriented.

Are commonly used in place of constructors to perform


tasks related to object initialization
Cannot access non-static members within the same class
Can be hidden in subclasses but not overridden
No virtual method invocation

Copyright 2011, Oracle and/or its affiliates. All rights reserved.

Factory Methods
In place of directly invoking constructors, you will often use static methods to retrieve object
references. Unless something unexpected happens, a new object is created whenever a
constructor is called. A static factory method could maintain a cache of objects for reuse or
create new instances if the cache was depleted. A factory method may also produce an object
that subclasses the methods return type.
Example:
NumberFormat nf = NumberFormat.getInstance();

Java SE 7 Programming 5 - 11

Oracle Internal & Oracle Academy Use Only

java.lang.Math contains many static methods

Implementing Static Methods


public class StaticErrorClass {
private int x;

public void instanceMethod() {


x = 2;
}
}

Copyright 2011, Oracle and/or its affiliates. All rights reserved.

Static Method Limitations


Static methods can be used before any instances of their enclosing class have been created.
Chronologically speaking, this means that in a running Java Virtual Machine, there may not be
any occurrences of the containing classes instance variables. Static methods can never
access their enclosing classes instance variables or call their non-static methods.

Java SE 7 Programming 5 - 12

Oracle Internal & Oracle Academy Use Only

public static void staticMethod() {


x = 1; // compile error
instanceMethod(); // compile error
}

Calling Static Methods

When calling static methods, you should:


Qualify the location of the method with a class name if the
method is located in a different class than the caller
Not required for methods within the same class

Avoid using an object reference to call a static method

Copyright 2011, Oracle and/or its affiliates. All rights reserved.

Java SE 7 Programming 5 - 13

Oracle Internal & Oracle Academy Use Only

double d = Math.random();
StaticUtilityClass.printMessage();
StaticUtilityClass uc = new StaticUtilityClass();
uc.printMessage(); // works but misleading
sameClassMethod();

Static variables are variables that can be accessed even if the


class they are declared in has not been instantiated. Static
variables are:
Called class variables
Limited to a single copy per JVM
Useful for containing shared data
Static methods store data in static variables.
All object instances share a single copy of any static
variables.

Initialized when the containing class is first loaded

Copyright 2011, Oracle and/or its affiliates. All rights reserved.

Class Loading
Application developer-supplied classes are typically loaded on demand (first use). Static
variables are initialized when their enclosing class is loaded. An attempt to access a static
class member can trigger the loading of a class.

Java SE 7 Programming 5 - 14

Oracle Internal & Oracle Academy Use Only

Static Variables

Defining Static Variables


public class StaticCounter {
private static int counter = 0;
Only one copy in
memory

public static int getCount() {


return counter;
}
}

Copyright 2011, Oracle and/or its affiliates. All rights reserved.

Persisting Static Variables


Many technologies that are used to persist application state in Java only save instance
variables. Maintaining a single object that keeps track of shared state may be used as an
alternative to static variables.

Java SE 7 Programming 5 - 15

Oracle Internal & Oracle Academy Use Only

public StaticCounter() {
counter++;
}

Using Static Variables


double p = Math.PI;

When accessing static variables, you should:


Qualify the location of the variable with a class name if the
variable is located in a different class than the caller
Not required for variables within the same class

Avoid using an object reference to access a static variable

Copyright 2011, Oracle and/or its affiliates. All rights reserved.

Object References to Static Members


Just as using object references to static methods should be avoided, you should also avoid
using object references to access static variables. If all the members of a class are static,
consider using a private constructor to prevent object instantiation.

Java SE 7 Programming 5 - 16

Oracle Internal & Oracle Academy Use Only

new StaticCounter();
new StaticCounter();
System.out.println("count: " + StaticCounter.getCount());

Static Imports
A static import statement makes the static members of a class
available under their simple name.
Given either of the following lines:

Calling the Math.random()method can be written as:

public class StaticImport {


public static void main(String[] args) {
double d = random();
}
}

Copyright 2011, Oracle and/or its affiliates. All rights reserved.

Overusing static import can negatively affect the readability of your code. Avoid adding
multiple static imports to a class.

Java SE 7 Programming 5 - 17

Oracle Internal & Oracle Academy Use Only

import static java.lang.Math.random;


import static java.lang.Math.*;

Quiz

Copyright 2011, Oracle and/or its affiliates. All rights reserved.

Java SE 7 Programming 5 - 18

Oracle Internal & Oracle Academy Use Only

The number of instances of a static variable is related to the


number of objects that have been created.
a. True
b. False

Final Methods

public class MethodParentClass {


public final void printMessage() {
System.out.println("This is a final method");
}
}
public class MethodChildClass extends MethodParentClass {
// compile-time error
public void printMessage() {
System.out.println("Cannot override method");
}
}
Copyright 2011, Oracle and/or its affiliates. All rights reserved.

Performance Myths
There is little to no performance benefit when you declare a method as final. Methods should
be declared as final only to disable method overriding.

Java SE 7 Programming 5 - 19

Oracle Internal & Oracle Academy Use Only

A method can be declared final. Final methods may not be


overridden.

Final Classes
A class can be declared final. Final classes may not be
extended.
public final class FinalParentClass { }

Copyright 2011, Oracle and/or its affiliates. All rights reserved.

Java SE 7 Programming 5 - 20

Oracle Internal & Oracle Academy Use Only

// compile-time error
public class ChildClass extends FinalParentClass { }

Final Variables

Final fields with compile-time constant expressions are


constant variables.
Static can be combined with final to create an alwaysavailable, never-changing variable.

Method parameters
Local variables
Note: Final references must always reference the same object,
but the contents of that object may be modified.

Copyright 2011, Oracle and/or its affiliates. All rights reserved.

Benefits and Drawbacks of Final Variables


Bug Prevention
Final variables can never have their values modified after they are initialized. This behavior
functions as a bug-prevention mechanism.
Thread Safety
The immutable nature of final variables eliminates any of the concerns that come with
concurrent access by multiple threads.
Final Reference to Objects
A final object reference only serves to prevent a reference from pointing to another object.
If you are designing immutable objects, you must prevent the object's fields from being
modified. Final references also prevent you from assigning a value of null to the reference.
Maintaining an object's references prevents that object from being available for garbage
collection.

Java SE 7 Programming 5 - 21

Oracle Internal & Oracle Academy Use Only

The final modifier can be applied to variables. Final variables


may not change their values after they are initialized. Final
variables can be:
Class fields

Declaring Final Variables


public class VariableExampleClass {
private final int field;
private final int forgottenField;
private final Date date = new Date();
public static final int JAVA_CONSTANT = 10;

public void changeValues(final int param) {


param = 1; // compile-time error
date.setTime(0); // allowed
date = new Date(); // compile-time error
final int localVar;
localVar = 42;
localVar = 43; // compile-time error
}
}
Copyright 2011, Oracle and/or its affiliates. All rights reserved.

Final Fields
Initializing
Final fields (instance variables) must be either of the following:
Assigned a value when declared
Assigned a value in every constructor
Static and Final Combined
A field that is both static and final is considered a constant. By convention, constant fields use
identifiers consisting of only uppercase letters and underscores.

Java SE 7 Programming 5 - 22

Oracle Internal & Oracle Academy Use Only

public VariableExampleClass() {
field = 100;
}

Quiz

Copyright 2011, Oracle and/or its affiliates. All rights reserved.

Java SE 7 Programming 5 - 23

Oracle Internal & Oracle Academy Use Only

A final field (instance variable) can be assigned a value either


when declared or in all constructors.
a. True
b. False

When to Avoid Constants

Computer comp = new Computer();


comp.setState(Computer.POWER_SUSPEND);

that equals 2.

The following lines of code still compile:

Computer comp = new Computer();


comp.setState(42);

Copyright 2011, Oracle and/or its affiliates. All rights reserved.

Runtime Range Checking


In the example in the slide, you must perform a runtime range check when using an int to
represent state. Within the setState method, an if statement can be used to validate that
only the values 0, 1, or 2 are accepted. This type of check is performed every time the
setState method is called, resulting in additional overhead.

Java SE 7 Programming 5 - 24

Oracle Internal & Oracle Academy Use Only

public static final variables can be very useful, but there


is a particular usage pattern you should avoid. Constants may
provide a false sense of input validation or value range
checking.
Consider a method that should receive only one of three
possible values:
This is an int constant

Typesafe Enumerations

public enum PowerState {


OFF,
These are references to the
ON,
only three PowerState
objects that can exist.
SUSPEND;
}

An enum can be used in the following way:


Computer comp = new Computer();
comp.setState(PowerState.SUSPEND);

This method takes a


PowerState reference .

Copyright 2011, Oracle and/or its affiliates. All rights reserved.

Compile-Time Range Checking


In the example in the slide, the compiler performs a compile-time check to ensure that only
valid PowerState instances are passed to the setState method. No range checking
overhead is incurred at run time.

Java SE 7 Programming 5 - 25

Oracle Internal & Oracle Academy Use Only

Java 5 added a typesafe enum to the language. Enums:


Are created using a variation of a Java class
Provide a compile-time range check

Enum Usage
Enum references can be statically imported.

public class Computer extends ElectronicDevice {


private PowerState powerState = OFF;
//...
PowerState.OFF
}

Enums can be used as the expression in a switch statement.


public void setState(PowerState state) {
switch(state) {
case OFF:
//...
Statically imported
}
}
Copyright 2011, Oracle and/or its affiliates. All rights reserved.

Java SE 7 Programming 5 - 26

Oracle Internal & Oracle Academy Use Only

import static com.example.PowerState.*;

Complex Enums
Enums can have fields, methods, and private constructors.

private String description;


private PowerState(String d) {
description = d;
}
public String getDescription() {
return description;
}

The constructor may not be


public or protected.

Copyright 2011, Oracle and/or its affiliates. All rights reserved.

Enum Constructors
You may not instantiate an enum instance with new.

Java SE 7 Programming 5 - 27

Oracle Internal & Oracle Academy Use Only

public enum PowerState {


Call a PowerState constructor
to
initialize the public static
OFF("The power is off"),
final OFF reference.
ON("The usage power is high"),
SUSPEND("The power usage is low");

An enum can have a constructor with the following access


levels:
a. public
b. protected
c. Default (no declared access level)
d. private

Copyright 2011, Oracle and/or its affiliates. All rights reserved.

Java SE 7 Programming 5 - 28

Oracle Internal & Oracle Academy Use Only

Quiz

Design Patterns
Design patterns are:
Reusable solutions to common software development
problems
Documented in pattern catalogs

A vocabulary used to discuss design

Copyright 2011, Oracle and/or its affiliates. All rights reserved.

Design Pattern Catalogs


Pattern catalogs are available for many programming languages. Most of the traditional
design patterns apply to any object-oriented programming language. One of the most popular
books, Design Patterns: Elements of Reusable Object-Oriented Software, uses a combination
of C++, Smalltalk, and diagrams to show possible pattern implementations. Many Java
developers still reference this book because the concepts translate to any object-oriented
language.
You learn more about design patterns and other Java best practices in the Java Design
Patterns course.

Java SE 7 Programming 5 - 29

Oracle Internal & Oracle Academy Use Only

Design Patterns: Elements of Reusable Object-Oriented


Software, written by Erich Gamma et al. (the Gang of Four)

Singleton Pattern
The singleton design pattern details a class implementation
that can be instantiated only once.

2 private SingletonClass() {}
public static SingletonClass getInstance() {
3
return instance;
}
}

Copyright 2011, Oracle and/or its affiliates. All rights reserved.

Implementing the Singleton Pattern


The singleton design pattern is one of the creational design patterns that are categorized in
Design Patterns: Elements of Reusable Object-Oriented Software.
To implement the singleton design pattern:
1. Use a static reference to point to the single instance. Making the reference final ensures
that it will never reference a different instance.
2. Add a single private constructor to the singleton class. The private modifier allows only
"same class" access, which prohibits any attempts to instantiate the singleton class
except for the attempt in step 1.
3. A public factory method returns a copy of the singleton reference. This method is
declared static to access the static field declared in step 1. Step 1 could use a public
variable, eliminating the need for the factory method. Factory methods provide greater
flexibility (for example, implementing a per-thread singleton solution) and are typically
used in most singleton implementations.
To obtain a singleton reference, call the getInstance method:
SingletonClass ref = SingletonClass.getInstance();

Java SE 7 Programming 5 - 30

Oracle Internal & Oracle Academy Use Only

public class SingletonClass {


private static final SingletonClass instance =
1
new SingletonClass();

Nested Classes

Inner classes
Member classes
Local classes
Anonymous classes
Static nested classes

Are commonly used in applications with GUI elements


Can limit utilization of a "helper class" to the enclosing toplevel class

Copyright 2011, Oracle and/or its affiliates. All rights reserved.

Reasons to Use Nested Classes


The following information is taken from
http://download.oracle.com/javase/tutorial/java/javaOO/nested.html.
Logical Grouping of Classes
If a class is useful to only one other class, then it is logical to embed it in that class and keep
the two together. Nesting such "helper classes" makes their package more streamlined.
Increased Encapsulation
Consider two top-level classes, A and B, where B needs access to members of A that would
otherwise be declared private. By hiding class B within class A, A's members can be declared
private and B can access them. In addition, B itself can be hidden from the outside world.
More Readable, Maintainable Code
Nesting small classes within top-level classes places the code closer to where it is used.

Java SE 7 Programming 5 - 31

Oracle Internal & Oracle Academy Use Only

A nested class is a class declared within the body of another


class. Nested classes:
Have multiple categories

Inner Class: Example

private class Engine {


public void start() {
running = true;
}
}
public void start() {
engine.start();
}
}

Copyright 2011, Oracle and/or its affiliates. All rights reserved.

Inner Classes Versus Static Nested Classes


An inner class is considered part of the outer class and inherits access to all the private
members of the outer class. The example in the slide shows an inner class, which is a
member class. Inner classes can also be declared inside a method block (local classes).
A static nested class is not an inner class, but its declaration appears similar with an
additional static modifier on the nested class. Static nested classes can be instantiated
before the enclosing outer class and, therefore, are denied access to all non-static members
of the enclosing class.

Java SE 7 Programming 5 - 32

Oracle Internal & Oracle Academy Use Only

public class Car {


private boolean running = false;
private Engine engine = new Engine();

Anonymous Inner Classes

public class AnonymousExampleClass {


public Object o = new Object() {
@Override
public String toString() {
return "In an anonymous class method";
}
};
}

Copyright 2011, Oracle and/or its affiliates. All rights reserved.

A Class with No Name


In the example in the slide, the java.lang.Object class is being subclassed, and it is that
subclass that is being instantiated. When you compile an application with anonymous
classes, a separate class file following a naming convention of Outer$1.class will be
generated, where 1 is the index number of anonymous classes in an enclosing class and
Outer is the name of the enclosing class.
Anonymous inner classes can also be local classes.

Java SE 7 Programming 5 - 33

Oracle Internal & Oracle Academy Use Only

An anonymous class is used to define a class with no name.

Quiz

Copyright 2011, Oracle and/or its affiliates. All rights reserved.

Java SE 7 Programming 5 - 34

Oracle Internal & Oracle Academy Use Only

Which of the following nested class types are inner classes?


a. anonymous
b. local
c. static
d. member

In this lesson, you should have learned how to:


Design general-purpose base classes by using abstract
classes
Construct abstract Java classes and subclasses
Model business problems by using the static and final
keywords
Implement the singleton design pattern
Distinguish between top-level and nested classes

Copyright 2011, Oracle and/or its affiliates. All rights reserved.

Java SE 7 Programming 5 - 35

Oracle Internal & Oracle Academy Use Only

Summary

Practice 5-1 Overview:


Applying the Abstract Keyword

Copyright 2011, Oracle and/or its affiliates. All rights reserved.

Java SE 7 Programming 5 - 36

Oracle Internal & Oracle Academy Use Only

This practice covers the following topics:


Identifying potential problems that can be solved using
abstract classes
Refactoring an existing Java application to use abstract
classes and methods

Practice 5-2 Overview:


Applying the Singleton Design Pattern

Copyright 2011, Oracle and/or its affiliates. All rights reserved.

Java SE 7 Programming 5 - 37

Oracle Internal & Oracle Academy Use Only

This practice covers using the static and final keywords and
refactoring an existing application to implement the singleton
design pattern.

Practice 5-3 Overview:


(Optional) Using Java Enumerations

Copyright 2011, Oracle and/or its affiliates. All rights reserved.

Java SE 7 Programming 5 - 38

Oracle Internal & Oracle Academy Use Only

This practice covers taking an existing application and


refactoring the code to use an enum.

(Optional) Practice 5-4 Overview:


Recognizing Nested Classes

Copyright 2011, Oracle and/or its affiliates. All rights reserved.

Java SE 7 Programming 5 - 39

Oracle Internal & Oracle Academy Use Only

This practice covers analyzing an existing Java application and


identifying the number and types of classes present.

Oracle Internal & Oracle Academy Use Only

Copyright 2011, Oracle and/or its affiliates. All rights reserved.

Oracle Internal & Oracle Academy Use Only

Inheritance with Java Interfaces

After completing this lesson, you should be able to do the


following:
Model business problems by using interfaces
Define a Java interface
Choose between interface inheritance and class
inheritance
Extend an interface
Refactor code to implement the DAO pattern

Copyright 2011, Oracle and/or its affiliates. All rights reserved.

Java SE 7 Programming 6 - 2

Oracle Internal & Oracle Academy Use Only

Objectives

Implementation Substitution
The ability to outline abstract types is a powerful feature of
Java. Abstraction enables:
Ease of maintenance
Classes with logic errors can be substituted with new and
improved classes.

Implementation substitution
The java.sql package outlines the methods used by
developers to communicate with databases, but the
implementation is vendor-specific.

Division of labor
Outlining the business API needed by an applications UI
allows the UI and the business logic to be developed in
tandem.

Copyright 2011, Oracle and/or its affiliates. All rights reserved.

Abstraction
You just learned how to define abstract types by using classes. There are two ways to define type
abstraction in Java: abstract classes and interfaces. By writing code to reference abstract types,
you no longer depend on specific implementing classes. Defining these abstract types may seem
like extra work in the beginning but can reduce refactoring at a later time if used appropriately.

Java SE 7 Programming 6 - 3

Oracle Internal & Oracle Academy Use Only

Java Interfaces
Java interfaces are used to define abstract types. Interfaces:
Are similar to abstract classes containing only public
abstract methods
Outline methods that must be implemented by a class

Can contain constant fields


Can be used as a reference type
Are an essential component of many design patterns

Copyright 2011, Oracle and/or its affiliates. All rights reserved.

In Java, an interface outlines a contract for a class. The contract outlined by an interface
mandates the methods that must be implemented in a class. Classes implementing the contract
must fulfill the entire contract or be declared abstract.

Java SE 7 Programming 6 - 4

Oracle Internal & Oracle Academy Use Only

Methods must not have an implementation {braces}.

Developing Java Interfaces

public interface ElectronicDevice {


public void turnOn();
public void turnOff();
}
public class Television implements ElectronicDevice {
public void turnOn() { }
public void turnOff() { }
public void changeChannel(int channel) {}
private void initializeScreen() {}
}

Copyright 2011, Oracle and/or its affiliates. All rights reserved.

Rules for Interfaces


Access Modifiers
All methods in an interface are public, even if you forget to declare them as public. You may
not declare methods as private or protected in an interface. The contract that an interface
outlines is a public API that must be provided by a class.
Abstract Modifier
Because all methods are implicitly abstract, it is redundant (but allowed) to declare a method
abstract. Because all interface methods are abstract, you may not provide any method
implementation, not even an empty set of braces.
Implements and Extends
A class can extend one parent class and then implement a comma-separated list of interfaces.

Java SE 7 Programming 6 - 5

Oracle Internal & Oracle Academy Use Only

Public, top-level interfaces are declared in their own .java file.


You implement interfaces instead of extending them.

Constant Fields

public interface ElectronicDevice {


public static final String WARNING =
"Do not open, shock hazard";
public void turnOn();
public void turnOff();
}

Copyright 2011, Oracle and/or its affiliates. All rights reserved.

Only constant fields are permitted in an interface. When you declare a field in an interface, it is
implicitly public, static, and final. You may redundantly specify these modifiers. Avoid
grouping all the constant values for an application in a single interface; good design distributes the
constant values of an application across many classes and interfaces. Creating monolithic classes
or interfaces that contain large groupings of unrelated code does not follow best practices for
object-oriented design.

Java SE 7 Programming 6 - 6

Oracle Internal & Oracle Academy Use Only

Interfaces can have constant fields.

Interface References

ElectronicDevice ed = new Television();


ed.turnOn();
ed.turnOff();
ed.changeChannel(2); // fails to compile
String s = ed.toString();

Copyright 2011, Oracle and/or its affiliates. All rights reserved.

An interface-typed reference can be used only to reference an object that implements that
interface. If an object has all the methods outlined in the interface but does not implement the
interface, you may not use the interface as a reference type for that object. Interfaces implicitly
include all the methods from java.lang.Object.

Java SE 7 Programming 6 - 7

Oracle Internal & Oracle Academy Use Only

You can use an interface as a reference type. When using an


interface reference type, you must use only the methods
outlined in the interface.

instanceof Operator
You can use instanceof with interfaces.

Implements

Television is an instance of an ElectronicDevice.

Copyright 2011, Oracle and/or its affiliates. All rights reserved.

Previously, you used instanceof on class types. Any type that can be used as a reference can
be used as an operand for the instanceof operator. In the slide, a Television implements
ElectronicDevice . Therefore, a Television is an instance of a Television, an
ElectronicDevice, and a java.lang.Object.

Java SE 7 Programming 6 - 8

Oracle Internal & Oracle Academy Use Only

Television t = new Television();


if (t instanceof ElectronicDevice) { }

Marker Interfaces

Marker interfaces define a type but do not outline any


methods that must be implemented by a class.

The only reason these type of interfaces exist is type


checking.

Person p = new Person();


if (p instanceof Serializable) {
}

Copyright 2011, Oracle and/or its affiliates. All rights reserved.

java.io.Serializable is a marker interface used by Java's I/O library to determine if an


object can have its state serialized. When implementing Serializable, you are not required to
provide method implementations. Testing (in the form of the instanceof operator) for the
serializability of an object is built into the standard I/O libraries. You use this interface in the lesson
titled Java I/O Fundamentals.

Java SE 7 Programming 6 - 9

Oracle Internal & Oracle Academy Use Only

public class Person implements java.io.Serializable { }

Casting to Interface Types

public static void turnObjectOn(Object o) {


if (o instanceof ElectronicDevice) {
ElectronicDevice e = (ElectronicDevice)o;
e.turnOn();
}
}

Copyright 2011, Oracle and/or its affiliates. All rights reserved.

Casting Guidelines
Just as you do when casting to class types, if you cast to a type that is invalid for that object, your
application generates an exception and is even likely to crash. To verify that a cast will succeed,
you should use an instanceof test.
The example in the slide shows poor design because the turnObjectOn() method operates
only on ElectronicDevices. Using instanceof and casting adds overhead at run time. When
possible, use a compile-time test by rewriting the method as:
public static void turnObjectOn(ElectronicDevice e) {
e.turnOn();
}

Java SE 7 Programming 6 - 10

Oracle Internal & Oracle Academy Use Only

You can cast to an interface type.

Using Generic Reference Types

Use the most generic type of reference wherever possible:

EmployeeDAO dao = new EmployeeDAOMemoryImpl();


dao.delete(1);

By using an interface reference type, you can use a


different implementing class without running the risk of
breaking subsequent lines of code:

EmployeeDAOMemoryImpl dao = new EmployeeDAOMemoryImpl();


dao.delete(1);
It is possible that you could be using
EmployeeDAOMemoryImpl only methods here.

Copyright 2011, Oracle and/or its affiliates. All rights reserved.

When creating references, you should use the most generic type possible. This means that, for the
object you are instantiating, you should declare the reference to be of an interface type or of a
parent class type. By doing this, all usage of the reference is not tied to a particular implementing
class and, if need be, you could use a different implementing class. By using an interface that
several classes implement as the reference type, you have the freedom to change the
implementation without affecting your code. An EmployeeDAOMemoryImpl typed reference could
be used to invoke a method that appears only in the EmployeeDAOMemoryImpl class.
References typed to a specific class cause your code to be more tightly coupled to that class and
potentially cause greater refactoring of your code when changing implementations.

Java SE 7 Programming 6 - 11

Oracle Internal & Oracle Academy Use Only

EmployeeDAOMemoryImpl implements
EmployeeDAO

Implementing and Extending

Classes can extend a parent class and implement an


interface:

public class AmphibiousCar extends BasicCar implements


MotorizedBoat { }

You can also implement multiple interfaces:

public class AmphibiousCar extends BasicCar implements


MotorizedBoat, java.io.Serializable { }

Use a comma to separate your list


of interfaces.

Copyright 2011, Oracle and/or its affiliates. All rights reserved.

Extends First
If you use both extends and implements, extends must come first.

Java SE 7 Programming 6 - 12

Oracle Internal & Oracle Academy Use Only

Extending Interfaces

Interfaces can extend interfaces:

public interface Boat { }

By implementing MotorizedBoat, the AmphibiousCar


class must fulfill the contract outlined by both
MotorizedBoat and Boat:

public class AmphibiousCar extends BasicCar implements


MotorizedBoat, java.io.Serializable { }

Copyright 2011, Oracle and/or its affiliates. All rights reserved.

Java SE 7 Programming 6 - 13

Oracle Internal & Oracle Academy Use Only

public interface MotorizedBoat extends Boat { }

Extends

Implements

Copyright 2011, Oracle and/or its affiliates. All rights reserved.

Interface Inheritances
Interfaces are used for a form of inheritance that is referred to as interface inheritance. Java allows
multiple interface inheritance but only single class inheritance.
Extending an Implementing Class
If you write a class that extends a class that implements an interface, the class you authored also
implements the interface. For example, AmphibiousCar extends BasicCar. BasicCar
implements Car; therefore, AmphibiousCar also implements Car.
Interfaces Extending Interfaces
An interface can extend another interface. For example, the interface MotorizedBoat can
extend the Boat interface. If the AmphibiousCar class implements MotorizedBoat, then it
must implement all methods from Boat and MotorizedBoat.
Duplicate Methods
When you have a class that implements multiple interfaces, directly or indirectly, the same method
signature may appear in different implemented interfaces. If the signatures are the same, there is
no conflict and only one implementation is required.

Java SE 7 Programming 6 - 14

Oracle Internal & Oracle Academy Use Only

Interfaces in Inheritance Hierarchies

Quiz

Copyright 2011, Oracle and/or its affiliates. All rights reserved.

Java SE 7 Programming 6 - 15

Oracle Internal & Oracle Academy Use Only

A class can implement multiple interfaces.


a. True
b. False

Design Patterns and Interfaces

One of the principles of object-oriented design is to:


Program to an interface, not an implementation.

This is a common theme in many design patterns. This


principle plays a role in:

Copyright 2011, Oracle and/or its affiliates. All rights reserved.

Object-Oriented Design Principles


Program to an interface, not an implementation is a practice that was popularized in the book
Design Patterns: Elements of Reusable Object-Oriented Software.
You can learn more about object-oriented design principles and design patterns in the Java
Design Patterns course.

Java SE 7 Programming 6 - 16

Oracle Internal & Oracle Academy Use Only

The DAO design pattern


The Factory design pattern

The Data Access Object (DAO) pattern is used when creating


an application that must persist information. The DAO pattern:
Separates the problem domain from the persistence
mechanism
Uses an interface to define the methods used for
persistence. An interface allows the persistence
implementation to be replaced with:

Memory-based DAOs as a temporary solution


File-based DAOs for an initial release
JDBC-based DAOs to support database persistence
Java Persistence API (JPA)based DAOs to support
database persistence

Copyright 2011, Oracle and/or its affiliates. All rights reserved.

Why Separate Business and Persistence Code?


Just as the required functionality of an application will influence the design of your classes, so will
other concerns. A desire for ease of maintenance and for the ability to enhance an application also
influences its design. Modular code that is separated by functionality is easier to update and
maintain.
By separating business and persistence logic, applications become easier to implement and
maintain at the expense of additional classes and interfaces. Often these two types of logic have
different maintenance cycles. For example, the persistence logic might need to be modified if the
database used by the application was migrated from MySQL to Oracle 11g.
If you create interfaces for the classes containing the persistence logic, it becomes easier for you
to replace your persistence implementation.

Java SE 7 Programming 6 - 17

Oracle Internal & Oracle Academy Use Only

DAO Pattern

Before the DAO Pattern

Before the DAO pattern

Copyright 2011, Oracle and/or its affiliates. All rights reserved.

The Single-Responsibility Principle


The Employee class shown in the slide has methods that focus on two different principles or
concerns. One set of methods focuses on manipulating the representation of a person, and the
other deals with persisting Employee objects. Because these two sets of responsibilities may be
modified at different points in the lifetime of your applications, it makes sense to split them up into
different classes.

Java SE 7 Programming 6 - 18

Oracle Internal & Oracle Academy Use Only

Notice the persistence methods mixed in with the business


methods.

After the DAO Pattern

After refactoring to the DAO pattern


Copyright 2011, Oracle and/or its affiliates. All rights reserved.

DAO Implementations
If you think that you might need to change your DAO implementation at a later time to use a
different persistence mechanism, it is best to use an interface to define the contract that all DAO
implementations must meet.
Your DAO interfaces outline methods to create, read, update, and delete data, although the
method names can vary. When you first implement the DAO pattern, you will not see the benefit
immediately. The payoff comes later, when you start modifying or replacing code. In the lesson
titled Building Database Applications with JDBC, we discuss replacing the memory-based DAO
with file- and database-enabled DAOs.

Java SE 7 Programming 6 - 19

Oracle Internal & Oracle Academy Use Only

The DAO pattern moves the persistence logic out of the


domain classes and into separate classes.

The Need for the Factory Pattern


The DAO pattern depends on using interfaces to define an
abstraction. Using a DAO implementations constructor ties you
to a specific implementation.

With use of an interface


type, any subsequent
lines are not tied to a
single implementation.

This constructor invocation is


tied to an implementation and
will appear in many places
throughout an application.

Copyright 2011, Oracle and/or its affiliates. All rights reserved.

Java SE 7 Programming 6 - 20

Oracle Internal & Oracle Academy Use Only

EmployeeDAO dao = new EmployeeDAOMemoryImpl();

Using the Factory Pattern


Using a factory prevents your application from being tightly
coupled to a specific DAO implementation.

The EmployeeDAO
implementation is hidden.

Copyright 2011, Oracle and/or its affiliates. All rights reserved.

This pattern eliminates direct constructor calls in favor of invoking a method. A factory is often
used when implementing the DAO pattern.
In the example in the slide, you have no idea what type of persistence mechanism is used by
EmployeeDAO because it is just an interface. The factory could return a DAO implementation that
uses files or a database to store and retrieve data. As a developer, you want to know what type of
persistence is being used because it factors into the performance and reliability of your
application. But you do not want the majority of the code you write to be tightly coupled with the
type of persistence.

Java SE 7 Programming 6 - 21

Oracle Internal & Oracle Academy Use Only

EmployeeDAOFactory factory = new EmployeeDAOFactory();


EmployeeDAO dao = factory.createEmployeeDAO();

The Factory
The implementation of the factory is the only point in the
application that should depend on concrete DAO classes.
Returns an interface typed
reference

public EmployeeDAO createEmployeeDAO() {


return new EmployeeDAOMemoryImpl();
}
}

Copyright 2011, Oracle and/or its affiliates. All rights reserved.

For simplicity, this factory hardcodes the name of a concrete class to instantiate. You could
enhance this factory by putting the class name in an external source such as a text file and use
the java.lang.Class class to instantiate the concrete subclass. A basic example of using the
java.lang.Class is the following:
String name = "com.example.dao.EmployeeDAOMemoryImpl";
Class clazz = Class.forName(name);
EmployeDAO dao = (EmployeeDAO)clazz.newInstance();

Java SE 7 Programming 6 - 22

Oracle Internal & Oracle Academy Use Only

public class EmployeeDAOFactory {

Clients depending only on abstract DAOs

Copyright 2011, Oracle and/or its affiliates. All rights reserved.

Java SE 7 Programming 6 - 23

Oracle Internal & Oracle Academy Use Only

The DAO and Factory Together

Quiz

Copyright 2011, Oracle and/or its affiliates. All rights reserved.

Java SE 7 Programming 6 - 24

Oracle Internal & Oracle Academy Use Only

A typical singleton implementation contains a factory method.


a. True
b. False

Code Reuse

Refactor commonly used routines into libraries.


Move the behavior shared by sibling classes into their parent
class.
Create new combinations of behaviors by combining multiple
types of objects together (composition).

Copyright 2011, Oracle and/or its affiliates. All rights reserved.

Copying and pasting code is not something that must always be avoided. If duplicated code
serves as a starting point and is heavily modified, that may be an acceptable situation for you to
copy and paste lines of code. You should be aware of how much copying and pasting is occurring
in a project. Besides performing manual code audits, there are tools you can use to detect
duplicated code. For one such example, refer to http://pmd.sourceforge.net/cpd.html.

Java SE 7 Programming 6 - 25

Oracle Internal & Oracle Academy Use Only

Code duplication (copy and paste) can lead to maintenance


problems. You do not want to fix the same bug multiple times.
Dont repeat yourself! (DRY principle)
Reuse code in a good way:

Design Difficulties

Method implementations located across different classes

Copyright 2011, Oracle and/or its affiliates. All rights reserved.

Limitations with Inheritance


Java supports only single class inheritance, which eliminates the possibility of inheriting different
implementations of a method with the same signature. Multiple interface inheritance does not pose
the same problem as class inheritance because there can be no conflicting method
implementations in interfaces.

Java SE 7 Programming 6 - 26

Oracle Internal & Oracle Academy Use Only

Class inheritance allows for code reuse but is not very modular
How do you create a SpyCarWithSunRoof?

Composition

composition

Combining multiple classes' methods


through composition and forwarding

Copyright 2011, Oracle and/or its affiliates. All rights reserved.

Delegation
Method delegation and method forwarding are two terms that are often used interchangeably.
Method forwarding is when you write a method that does nothing except pass execution over to
another method. In some cases, delegation may imply more than simple forwarding. For more on
the difference between the two, refer to page 20 of the book Design Patterns: Elements of
Reusable Object-Oriented Software.

Java SE 7 Programming 6 - 27

Oracle Internal & Oracle Academy Use Only

Object composition allows you to create more complex objects.


To implement composition, you:
1. Create a class with references to other classes.
2. Add same signature methods that forward to the
referenced objects.

Composition Implementation

public void start() {


car.start();
}

Method
forwarding

// other forwarded methods


}

Copyright 2011, Oracle and/or its affiliates. All rights reserved.

IDE Wizards Make Implementing Composition Easy


To implement composition with the NetBeans IDE, use the Insert Code tool as follows:
1.

Right-click within the braces of the complex class and choose "Insert Code.

2.

Select "Delegate Method.


The Generate Delegate Methods dialog box appears.

3.

Select the method calls that you want to forward.


The methods are inserted for you.

Repeat these steps for each delegate class.

Java SE 7 Programming 6 - 28

Oracle Internal & Oracle Academy Use Only

public class SpyCarWithSunRoof {


private BasicCar car = new BasicCar();
private SpyCarAddon spyAddon = new SpyCarAddon();
private SunRoofAddon roofAddon = new SunRoofAddon();

Polymorphism and Composition

A complex car object that cannot be passed


to a method expecting a simple car

Copyright 2011, Oracle and/or its affiliates. All rights reserved.

Code Reuse
The ability to use the addCar method for any type of Car, no matter how complex, is another form
of code reuse. We cannot currently say the following:
addCar(new SpyCarWithSunRoof());

Java SE 7 Programming 6 - 29

Oracle Internal & Oracle Academy Use Only

Polymorphism should enable us to pass any type of Car to the


addCar method. Composition does not enable polymorphism
unless

Polymorphism and Composition

Composition with interfaces to


support polymorphism

Copyright 2011, Oracle and/or its affiliates. All rights reserved.

Each delegate class that you use in a composition should have an interface defined. When
creating the composing class, you declare that it implements all of the delegate interface types.
By doing this, you create an object that is a composition of other objects and has many types.
Now we can say:
addCar(new SpyCarWithSunRoof());

Java SE 7 Programming 6 - 30

Oracle Internal & Oracle Academy Use Only

Use interfaces for all delegate classes to support polymorphism.

Quiz

Copyright 2011, Oracle and/or its affiliates. All rights reserved.

Java SE 7 Programming 6 - 31

Oracle Internal & Oracle Academy Use Only

Method delegation is required to create complex objects using:


a. Polymorphism
b. Composition

In this lesson, you should have learned how to:


Model business problems by using interfaces
Define a Java interface
Choose between interface inheritance and class
inheritance
Extend an interface
Refactor code to implement the DAO pattern

Copyright 2011, Oracle and/or its affiliates. All rights reserved.

Java SE 7 Programming 6 - 32

Oracle Internal & Oracle Academy Use Only

Summary

Practice 6-1 Overview:


Implementing an Interface

Copyright 2011, Oracle and/or its affiliates. All rights reserved.

Java SE 7 Programming 6 - 33

Oracle Internal & Oracle Academy Use Only

This practice covers the following topics:


Writing an interface
Implementing an interface
Creating references of an interface type
Casting to interface types

Practice 6-2 Overview:


Applying the DAO Pattern

Copyright 2011, Oracle and/or its affiliates. All rights reserved.

Java SE 7 Programming 6 - 34

Oracle Internal & Oracle Academy Use Only

This practice covers the following topics:


Rewriting an existing domain object with a memory-based
persistence implementation using the DAO pattern
Leveraging an abstract factory to avoid depending on
concrete implementations

(Optional) Practice 6-3 Overview:


Implementing Composition

Copyright 2011, Oracle and/or its affiliates. All rights reserved.

Java SE 7 Programming 6 - 35

Oracle Internal & Oracle Academy Use Only

This practice covers the following topics:


Rewriting an existing application to better support code
reuse through composition
Using interfaces to enable polymorphism

Oracle Internal & Oracle Academy Use Only

Copyright 2011, Oracle and/or its affiliates. All rights reserved.

Oracle Internal & Oracle Academy Use Only

Generics and Collections

After completing this lesson, you should be able to:


Create a custom generic class
Use the type inference diamond to create an object
Create a collection without using generics
Create a collection by using generics
Implement an ArrayList
Implement a Set
Implement a HashMap
Implement a stack by using a deque
Use enumerated types

Copyright 2011, Oracle and/or its affiliates. All rights reserved.

Java SE 7 Programming 7 - 2

Oracle Internal & Oracle Academy Use Only

Objectives

Generics
Provide flexible type safety to your code
Move many common errors from runtime to compile time
Provide cleaner, easier-to-write code
Reduce the need for casting with collections
Are used heavily in the Java Collections API

Copyright 2011, Oracle and/or its affiliates. All rights reserved.

Java SE 7 Programming 7 - 3

Oracle Internal & Oracle Academy Use Only

Simple Cache Class Without Generics


public class CacheString {
private String message = "";

public String get(){


return this.message;
}

public class CacheShirt {


private Shirt shirt;

}
public void add(Shirt shirt){
this.shirt = shirt;
}
public Shirt get(){
return this.shirt;
}
}

Copyright 2011, Oracle and/or its affiliates. All rights reserved.

The two examples in the slide show very simple caching classes. Even though each class is very
simple, a separate class is required for any object type.

Java SE 7 Programming 7 - 4

Oracle Internal & Oracle Academy Use Only

public void add(String message){


this.message = message;
}

1 public class CacheAny <T>{


2
3
private T t;
4
5
public void add(T t){
6
this.t = t;
7
}
8
9
public T get(){
10
return this.t;
11
}
12 }

Copyright 2011, Oracle and/or its affiliates. All rights reserved.

To create a generic version of the CacheAny class, a variable named T is added to the class
definition surrounded by angle brackets. In this case, T stands for type and can represent any
type. As the example shows, the code has changed to use t instead of a specific type information.
This change allows the CacheAny class to store any type of object.
T was chosen not by accident but by convention. A number of letters are commonly used with
generics.
Note: You can use any identifier you want. The following values are merely strongly suggested.
Here are the conventions:

T: Type
E: Element
K: Key
V: Value
S, U: Used if there are second types, third types, or more

Java SE 7 Programming 7 - 5

Oracle Internal & Oracle Academy Use Only

Generic Cache Class

Generics in Action

1 public static void main(String args[]){


2
CacheString myMessage = new CacheString(); // Type
3
CacheShirt myShirt = new CacheShirt();
// Type
4
5
//Generics
6
CacheAny<String> myGenericMessage = new CacheAny<String>();
7
CacheAny<Shirt> myGenericShirt = new CacheAny<Shirt>();
8
9
myMessage.add("Save this for me"); // Type
10
myGenericMessage.add("Save this for me"); // Generic
11
12 }

Copyright 2011, Oracle and/or its affiliates. All rights reserved.

Note how the one generic version of the class can replace any number of type-specific caching
classes. The add() and get() functions work exactly the same way. In fact, if the myMessage
declaration is changed to generic, no changes need to be made to the remaining code.
The example code can be found in the Generics project in the TestCacheAny.java file.

Java SE 7 Programming 7 - 6

Oracle Internal & Oracle Academy Use Only

Compare the type-restricted objects to their generic


alternatives.

Generics with Type Inference Diamond

Syntax

Simplifies generic declarations


Saves typing

//Generics
CacheAny<String> myMessage = new CacheAny<>();
}

Copyright 2011, Oracle and/or its affiliates. All rights reserved.

The type inference diamond is a new feature in JDK 7. In the generic code, notice how the
right-side type definition is always equivalent to the left-side type definition. In JDK 7, you can use
the diamond to indicate that the right type definition is equivalent to the left. This helps to avoid
typing redundant information over and over again.
Example: TestCacheAnyDiamond.java
Note: In a way, it works in an opposite way from a normal Java type assignment. For example,
Employee emp = new Manager(); makes emp object an instance of Manager.
But in the case of generics:
ArrayList<Manager> managementTeam = new ArrayList<>();
It is the left side of the expression (rather than the right side) that determines the type.

Java SE 7 Programming 7 - 7

Oracle Internal & Oracle Academy Use Only

There is no need to repeat types on the right side of the


statement.
Angle brackets indicate that type parameters are mirrored.

Which of the following is not a conventional abbreviation for


use with generics?
a. T: Table
b. E: Element
c. K: Key
d. V: Value

Copyright 2011, Oracle and/or its affiliates. All rights reserved.

Java SE 7 Programming 7 - 8

Oracle Internal & Oracle Academy Use Only

Quiz

Collections

A collection is a single object designed to manage a group


of objects.
Objects in a collection are called elements.
Primitives are not allowed in a collection.

Various collection types implement many common data


structures:
Stack, queue, dynamic array, hash

The Collections API relies heavily


on generics for its implementation.

Copyright 2011, Oracle and/or its affiliates. All rights reserved.

A collection is a single object that manages a group of objects. Objects in the collection are called
elements. Various collection types implement standard data structures including stacks, queues,
dynamic arrays, and hashes. All the collection objects have been optimized for use in Java
applications.
Note: The Collections classes are all stored in the java.util package. The import statements
are not shown in the following examples, but the import statements are required for each
collection type:
import java.util.List;
import java.util.ArrayList;
import java.util.Map;

Java SE 7 Programming 7 - 9

Oracle Internal & Oracle Academy Use Only

Copyright 2011, Oracle and/or its affiliates. All rights reserved.

The diagram in the slide shows all the collection types that descend from Collection. Some
sample methods are provided for both Collection and List. Note the use of generics.
Characteristics of Implementation Classes
HashSet: A collection of elements that contains no duplicate elements
TreeSet: A sorted collection of elements that contains no duplicate elements
ArrayList: A dynamic array implementation
Deque: A collection that can be used to implement a stack or a queue
Note: The Map interface is a separate inheritance tree and is discussed later in the lesson.

Java SE 7 Programming 7 - 10

Oracle Internal & Oracle Academy Use Only

Collection Types

List Interface

List is an interface that defines generic list behavior.


An ordered collection of elements

List behaviors include:

Adding elements at a specific index


Adding elements at the end of the list
Getting an element based on an index
Removing an element based on an index
Overwriting an element based on an index
Getting the size of the list

Use List as an instance object to hide implementation


details.

Copyright 2011, Oracle and/or its affiliates. All rights reserved.

The List interface is the basis for all Collections classes that exhibit list behavior.

Java SE 7 Programming 7 - 11

Oracle Internal & Oracle Academy Use Only

ArrayList Implementation Class

Is a dynamically growable array


The list automatically grows if elements exceed initial size.

Has a numeric index


Elements are accessed by index.
Elements can be inserted based on index.
Elements can be overwritten.

Allows duplicate items

Copyright 2011, Oracle and/or its affiliates. All rights reserved.

An ArrayList implements a List collection. The implementation exhibits characteristics of a


dynamically growing array. A to-do list application is a good example of an application that can
benefit from an ArrayList.

Java SE 7 Programming 7 - 12

Oracle Internal & Oracle Academy Use Only

1 public class OldStyleArrayList {


2 public static void main(String args[]){
3
List partList = new ArrayList(3);
4
5
partList.add(new Integer(1111));
6
partList.add(new Integer(2222));
7
partList.add(new Integer(3333));
8
partList.add("Oops a string!");
9
10
Iterator elements = partList.iterator();
11
while (elements.hasNext()) {
12
Integer partNumberObject = (Integer) (elements.next()); // error?
13
int partNumber = (int) partNumberObject.intValue();
14
15
System.out.println("Part number: " + partNumber);
16
}
17 }
18 }

Copyright 2011, Oracle and/or its affiliates. All rights reserved.

In the example in the slide, a part number list is created using an ArrayList. Using syntax prior
to Java version 1.5, there is no type definition. So any type can be added to the list as shown on
line 8. So it is up to the programmer to know what objects are in the list and in what order. If an
assumption were made that the list was only for Integer objects, a runtime error would occur on
line 12.
On lines 1016, with a non-generic collection, an Iterator is used to iterate through the list of
items. Notice that a lot of casting is required to get the objects back out of the list so you can print
the data.
In the end, there is a lot of needless syntactic sugar (extra code) working with collections in this
way.
If the line that adds the String to the ArrayList is commented out, the program produces the
following output:
Part number: 1111
Part number: 2222
Part number: 3333

Java SE 7 Programming 7 - 13

Oracle Internal & Oracle Academy Use Only

ArrayList Without Generics

1 import java.util.ArrayList;
2 import java.util.List;
3
4 public class GenericArrayList {
5 public static void main(String args[]){
6
7
List<Integer> partList = new ArrayList<>(3);
8
9
partList.add(new Integer(1111));
10
partList.add(new Integer(2222));
11
partList.add(new Integer(3333));
12
partList.add(new Integer(4444)); // ArrayList auto grows
13
14
System.out.println("First Part: " + partList.get(0)); // First item
15
partList.add(0, new Integer(5555)); // Insert an item by index
16
17
// partList.add("Bad Data"); // compile error now

Copyright 2011, Oracle and/or its affiliates. All rights reserved.

With generics, things are much simpler. When the ArrayList is initialized on line 6, any attempt
to add an invalid value (line 15) results in a compile-time error.
The example in the slide shows a number of ArrayList features.
Line 12 demonstrates how an ArrayList grows automatically when an item is added
beyond its original size.
Line 14 shows how elements can be accessed by their index.
Line 15 shows how elements can be inserted into the list based on their index.
Note: On line 7, the ArrayList is assigned to a List type. Using this style enables you to swap
out the List implementation without changing other code.

Java SE 7 Programming 7 - 14

Oracle Internal & Oracle Academy Use Only

Generic ArrayList

Generic ArrayList: Iteration and Boxing

The enhanced for loop, or for-each loop, provides


cleaner code.
No casting is done because of autoboxing and unboxing.

Copyright 2011, Oracle and/or its affiliates. All rights reserved.

Using the for-each loop is much easier and provides much cleaner code. No casts are done
because of the autounboxing feature of Java.

Java SE 7 Programming 7 - 15

Oracle Internal & Oracle Academy Use Only

for (Integer partNumberObj:partList){


int partNumber = partNumberObj; // Demos auto unboxing
System.out.println("Part number: " + partNumber);
}

Autoboxing and Unboxing


Simplifies syntax
Produces cleaner, easier-to-read code
1 public class AutoBox {
2
public static void main(String[] args){
3
Integer intObject = new Integer(1);
4
int intPrimitive = 2;
5
6
Integer tempInteger;
7
int tempPrimitive;
8
9
tempInteger = new Integer(intPrimitive);
10
tempPrimitive = (int) intObject.intValue();
11
12
tempInteger = intPrimitive; // Auto box
13
tempPrimitive = intObject; // Auto unbox

Copyright 2011, Oracle and/or its affiliates. All rights reserved.

Lines 9 and 10 show a traditional method for moving between objects and primitives. Lines 12 and
13 show boxing and unboxing.
Autoboxing and Unboxing
Autoboxing and unboxing are Java language features that enable you to make sensible
assignments without formal casting syntax. Java provides the casts for you at compile time.
Note: Be careful when using autoboxing in a loop. There is a performance cost to using this
feature.

Java SE 7 Programming 7 - 16

Oracle Internal & Oracle Academy Use Only

Quiz
Which of the following declares an Integer ArrayList with
three elements?
List<Integer>
List<Integer>
List<Integer>
List<Integer>

partList
partList
partList
partList

=
=
=
=

new
new
new
new

ArrayList<>(three);
ArrayList<>[3];
ArrayList<>(three);
ArrayList<>(3);

Copyright 2011, Oracle and/or its affiliates. All rights reserved.

Java SE 7 Programming 7 - 17

Oracle Internal & Oracle Academy Use Only

a.
b.
c.
d.

Set Interface
A set is a list that contains only unique elements.
A set has no index.
Duplicate elements are not allowed in a set.
You can iterate through elements to access them.
TreeSet provides sorted implementation.

Copyright 2011, Oracle and/or its affiliates. All rights reserved.

As an example, a set can be used to track a list of unique part numbers.

Java SE 7 Programming 7 - 18

Oracle Internal & Oracle Academy Use Only

Set Interface: Example

1 public class SetExample {


2
public static void main(String[] args){
3
Set<String> set = new TreeSet<>();
4
5
set.add("one");
6
set.add("two");
7
set.add("three");
8
set.add("three"); // not added, only unique
9
10
for (String item:set){
11
System.out.println("Item: " + item);
12
}
13
}
14 }

Copyright 2011, Oracle and/or its affiliates. All rights reserved.

A set is a collection of unique elements. This example uses a TreeSet, which sorts the items in
the set. If the program is run, the output is as follows:
Item: one
Item: three
Item: two

Java SE 7 Programming 7 - 19

Oracle Internal & Oracle Academy Use Only

A set is a collection of unique elements.

Map Interface

A collection that stores multiple key-value pairs


Key: Unique identifier for each element in a collection
Value: A value stored in the element associated with the key

Called associative arrays in other languages

Key

Value

101

Blue Shirt

102

Black Shirt

103

Gray Shirt

Copyright 2011, Oracle and/or its affiliates. All rights reserved.

A Map is good for tracking things like part lists and their descriptions (as shown in the slide).

Java SE 7 Programming 7 - 20

Oracle Internal & Oracle Academy Use Only

Copyright 2011, Oracle and/or its affiliates. All rights reserved.

The Map interface does not extend the Collection interface because it represents mappings
and not a collection of objects. Some of the key implementation classes include:
TreeMap: A map where the keys are automatically sorted
HashTable: A classic associative array implementation with keys and values. HashTable
is synchronized.
HashMap: An implementation just like HashTable except that it accepts null keys and
values. Also, it is not synchronized.

Java SE 7 Programming 7 - 21

Oracle Internal & Oracle Academy Use Only

Map Types

1 public class MapExample {


2
public static void main(String[] args){
3
Map <String, String> partList = new TreeMap<>();
4
partList.put(S001", "Blue Polo Shirt");
5
partList.put(S002", "Black Polo Shirt");
6
partList.put(H001", "Duke Hat");
7
8
partList.put(S002", "Black T-Shirt"); // Overwrite value
9
Set<String> keys = partList.keySet();
10
11
System.out.println("=== Part List ===");
12
for (String key:keys){
13
System.out.println("Part#: " + key + " " +
partList.get(key));
14
}
15
}
16 }

Copyright 2011, Oracle and/or its affiliates. All rights reserved.

The example shows how to create a Map and perform standard operations on it. The output from
the program is:
=== Part List ===
Part#: 111111 Blue Polo Shirt
Part#: 222222 Black T-Shirt
Part#: 333333 Duke Hat

Java SE 7 Programming 7 - 22

Oracle Internal & Oracle Academy Use Only

Map Interface: Example

Deque Interface
A collection that can be used as a stack or a queue
Means double-ended queue (and is pronounced deck)
A queue provides FIFO (first in, first out) operations
add(e) and remove() methods

A stack provides LIFO (last in, first out) operations


push(e) and pop() methods

Copyright 2011, Oracle and/or its affiliates. All rights reserved.

Deque is a child interface of Collection (just like Set and List).


A queue is often used to track asynchronous message requests so they can be processed in
order. A stack can be very useful for traversing a directory tree or similar structures.

Java SE 7 Programming 7 - 23

Oracle Internal & Oracle Academy Use Only

1 public class TestStack {


2
public static void main(String[] args){
3
Deque<String> stack = new ArrayDeque<>();
4
stack.push("one");
5
stack.push("two");
6
stack.push("three");
7
8
int size = stack.size() - 1;
9
while (size >= 0 ) {
10
System.out.println(stack.pop());
11
size--;
12
}
13
}
14 }

Copyright 2011, Oracle and/or its affiliates. All rights reserved.

A deque (pronounced deck) is a doubled-ended queue. Essentially this means that a deque
can be used as a queue (first in, first out [FIFO] operations) or as a stack (last in,
first out [LIFO] operations).

Java SE 7 Programming 7 - 24

Oracle Internal & Oracle Academy Use Only

Stack with Deque: Example

Ordering Collections

The Comparable and Comparator interfaces are used to


sort collections.
Both are implemented using generics.

Using the Comparable interface:


Overrides the compareTo method

Using the Comparator interface:


Is implemented by using the compare method
Enables you to create multiple Comparator classes
Enables you to create and use numerous sorting options

Copyright 2011, Oracle and/or its affiliates. All rights reserved.

The Collections API provides two interfaces for ordering elements: Comparable and
Comparator.
The Comparable interface is implemented in a class and provides a single sorting option for the
class.
The Comparator interface enables you to create multiple sorting options. You plug in the
designed option whenever you want.
Both interfaces can be used with sorted collections, such as TreeSet and TreeMap.

Java SE 7 Programming 7 - 25

Oracle Internal & Oracle Academy Use Only

Provides only one sort option

Comparable Interface
Using the Comparable interface:
Overrides the compareTo method
Provides only one sort option

Copyright 2011, Oracle and/or its affiliates. All rights reserved.

The slide shows how the ComparableStudent class relates to the Comparable interface and
TreeSet.

Java SE 7 Programming 7 - 26

Oracle Internal & Oracle Academy Use Only

1 public class ComparableStudent implements Comparable<ComparableStudent>{


2
private String name; private long id = 0; private double gpa = 0.0;
3
4
public ComparableStudent(String name, long id, double gpa){
5
// Additional code here
6
}
7
public String getName(){ return this.name; }
8
// Additional code here
9
10
public int compareTo(ComparableStudent s){
11
int result = this.name.compareTo(s.getName());
12
if (result > 0) { return 1; }
13
else if (result < 0){ return -1; }
14
else { return 0; }
15
}
16 }

Copyright 2011, Oracle and/or its affiliates. All rights reserved.

This example in the slide implements the Comparable interface and its compareTo method.
Notice that because the interface is designed using generics, the angle brackets define the class
type that is passed into the compareTo method. The if statements are included to demonstrate
the comparisons that take place. You can also merely return a result.
The returned numbers have the following meaning.
Negative number: s comes before the current element.
Positive number: s comes after the current element.
Zero: s is equal to the current element.
In cases where the collection contains equivalent values, replace the code that returns zero with
additional code that returns a negative or positive number.

Java SE 7 Programming 7 - 27

Oracle Internal & Oracle Academy Use Only

Comparable: Example

1 public class TestComparable {


2
public static void main(String[] args){
3
Set<ComparableStudent> studentList = new TreeSet<>();
4
5
studentList.add(new ComparableStudent("Thomas Jefferson", 1111,
3.8));
6
studentList.add(new ComparableStudent("John Adams", 2222, 3.9));
7
studentList.add(new ComparableStudent("George Washington", 3333,
3.4));
8
9
for(ComparableStudent student:studentList){
10
System.out.println(student);
11
}
12
}
13 }

Copyright 2011, Oracle and/or its affiliates. All rights reserved.

In the example in the slide, an ArrayList of ComparableStudent elements is created. After


the list is initialized, it is sorted using the Comparable interface. The output of the program is as
follows:
Name: George Washington
Name: John Adams

ID: 3333

ID: 2222

Name: Thomas Jefferson

GPA:3.4

GPA:3.9

ID: 1111

GPA:3.8

Note: The ComparableStudent class has overridden the toString() method.

Java SE 7 Programming 7 - 28

Oracle Internal & Oracle Academy Use Only

Comparable Test: Example

Comparator Interface

Copyright 2011, Oracle and/or its affiliates. All rights reserved.

The slide shows two Comparator classes that can be used with the Student class. The
example in the next slide shows how to use Comparator with an unsorted interface like
ArrayList by using the Collections utility class.

Java SE 7 Programming 7 - 29

Oracle Internal & Oracle Academy Use Only

Using the Comparator interface:


Is implemented by using the compare method
Enables you to create multiple Comparator classes
Enables you to create and use numerous sorting options

public class StudentSortName implements Comparator<Student>{


public int compare(Student s1, Student s2){
int result = s1.getName().compareTo(s2.getName());
if (result != 0) { return result; }
else {
return 0; // Or do more comparing
}
}
}
public class StudentSortGpa implements Comparator<Student>{
public int compare(Student s1, Student s2){
if (s1.getGpa() < s2.getGpa()) { return 1; }
else if (s1.getGpa() > s2.getGpa()) { return -1; }
else { return 0; }
}
}

Copyright 2011, Oracle and/or its affiliates. All rights reserved.

The example in the slide shows the Comparator classes that are created to sort based on Name
and GPA. For the name comparison, the if statements have been simplified.

Java SE 7 Programming 7 - 30

Oracle Internal & Oracle Academy Use Only

Comparator: Example

1 public class TestComparator {


2
public static void main(String[] args){
3
List<Student> studentList = new ArrayList<>(3);
4
Comparator<Student> sortName = new StudentSortName();
5
Comparator<Student> sortGpa = new StudentSortGpa();
6
7
// Initialize list here
8
9
Collections.sort(studentList, sortName);
10
for(Student student:studentList){
11
System.out.println(student);
12
}
13
14
Collections.sort(studentList, sortGpa);
15
for(Student student:studentList){
16
System.out.println(student);
17
}
18
}
19 }

Copyright 2011, Oracle and/or its affiliates. All rights reserved.

The example in the slide shows how the two Comparator objects are used with a collection.
Note: Some code has been commented out to save space.
Notice how the Comparator objects are initialized on lines 4 and 5. After the sortName and
sortGpa variables are created, they can be passed to the sort() method by name. Running the
program produces the following output.
Name: George Washington ID: 3333 GPA:3.4
Name: John Adams ID: 2222 GPA:3.9
Name: Thomas Jefferson ID: 1111 GPA:3.8
Name: John Adams ID: 2222 GPA:3.9
Name: Thomas Jefferson ID: 1111 GPA:3.8
Name: George Washington ID: 3333 GPA:3.4
Notes
The Collections utility class provides a number of useful methods for various collections.
Methods include min(), max(), copy(), and sort().
The Student class has overridden the toString() method.

Java SE 7 Programming 7 - 31

Oracle Internal & Oracle Academy Use Only

Comparator Test: Example

Which interface would you use to create multiple sort options


for a collection?
a. Comparable
b. Comparison
c. Comparator
d. Comparinator

Copyright 2011, Oracle and/or its affiliates. All rights reserved.

Java SE 7 Programming 7 - 32

Oracle Internal & Oracle Academy Use Only

Quiz

In this lesson, you should have learned how to:


Create a custom generic class
Use the type inference diamond to create an object
Create a collection without using generics
Create a collection by using generics
Implement an ArrayList
Implement a Set
Implement a HashMap
Implement a stack by using a deque

Use enumerated types

Copyright 2011, Oracle and/or its affiliates. All rights reserved.

Java SE 7 Programming 7 - 33

Oracle Internal & Oracle Academy Use Only

Summary

Practice 7-1 Overview:


Counting Part Numbers by Using a HashMap

Copyright 2011, Oracle and/or its affiliates. All rights reserved.

Java SE 7 Programming 7 - 34

Oracle Internal & Oracle Academy Use Only

This practice covers the following topics:


Creating a map to store a part number and count
Creating a map to store a part number and description
Processing the list of parts and producing a report

Practice 7-2 Overview:


Matching Parentheses by Using a Deque

Copyright 2011, Oracle and/or its affiliates. All rights reserved.

Java SE 7 Programming 7 - 35

Oracle Internal & Oracle Academy Use Only

This practice covers processing programming statements to


ensure that the number of parentheses matches.

Practice 7-3 Overview:


Counting Inventory and Sorting with Comparators

Copyright 2011, Oracle and/or its affiliates. All rights reserved.

Java SE 7 Programming 7 - 36

Oracle Internal & Oracle Academy Use Only

This practice covers processing inventory transactions that


generate two reports sorted differently using Comparators.

Copyright 2011, Oracle and/or its affiliates. All rights reserved.

Oracle Internal & Oracle Academy Use Only

String Processing

Objectives

Search strings by using regular expressions


Parse strings by using regular expressions
Replace strings by using regular expressions

Copyright 2011, Oracle and/or its affiliates. All rights reserved.

Java SE 7 Programming 8 - 2

Oracle Internal & Oracle Academy Use Only

After completing this lesson, you should be able to:


Read data from the command line
Search strings
Parse strings
Create strings by using a StringBuilder

Command-Line Arguments

Any Java technology application can use command-line


arguments.
These string arguments are placed on the command line to
launch the Java interpreter after the class name:

Each command-line argument is placed in the args array


that is passed to the static main method:
public static void main(String[] args)

Copyright 2011, Oracle and/or its affiliates. All rights reserved.

When a Java program is launched from a terminal window, you can provide the program with zero
or more command-line arguments.
These command-line arguments enable the user to specify the configuration information for the
application. These arguments are strings: either stand-alone tokens (such as arg1) or quoted
strings (such as "another arg").

Java SE 7 Programming 8 - 3

Oracle Internal & Oracle Academy Use Only

java TestArgs arg1 arg2 "another arg"

public class TestArgs {


public static void main(String[] args) {
for ( int i = 0; i < args.length; i++ ) {
System.out.println("args[" + i + "] is '" +
args[i] + "'");
}
}
}

Example execution:
java TestArgs "Ted Baxter" 45 100.25
args[0] is 'Ted Baxter'
args[1] is '45'
args[2] is '100.25'

Copyright 2011, Oracle and/or its affiliates. All rights reserved.

Command-line arguments are always passed to the main method as strings, regardless of their
intended type. If an application requires command-line arguments other than type String (for
example, numeric values), the application should convert the string arguments to their respective
types using the wrapper classes, such as the Integer.parseInt method, which can be used to
convert the string argument that represents the numeric integer to type int.

Java SE 7 Programming 8 - 4

Oracle Internal & Oracle Academy Use Only

Command-Line Arguments

Properties

The java.util.Properties class is used to load and


save key-value pairs in Java.
Can be stored in a simple text file:

File name ends in .properties.


File can be anywhere that compiler can find it.

Copyright 2011, Oracle and/or its affiliates. All rights reserved.

The benefit of a properties file is the ability to set values for your application externally. The
properties file is typically read at the start of the application and is used for default values. But the
properties file can also be an integral part of a localization scheme, where you store the values of
menu labels and text for various languages that your application may support.
The convention for a properties file is <filename>.properties, but the file can have any
extension you want. The file can be located anywhere that the application can find it.

Java SE 7 Programming 8 - 5

Oracle Internal & Oracle Academy Use Only

hostName = www.example.com
userName = user
password = pass

Loading and Using a Properties File


public static void main(String[] args) {
Properties myProps = new Properties();
try {
FileInputStream fis = new FileInputStream("ServerInfo.properties");
myProps.load(fis);
} catch (IOException e) {
System.out.println("Error: " + e.getMessage());
}
// Print Values
System.out.println("Server: " + myProps.getProperty("hostName"));
System.out.println("User: " + myProps.getProperty("userName"));
System.out.println("Password: " + myProps.getProperty("password"));
}

Copyright 2011, Oracle and/or its affiliates. All rights reserved.

In the code fragment, you create a Properties object. Then, using a try statement, you open a
file relative to the source files in your NetBeans project. When it is loaded, the name-value pairs
are available for use in your application.
Properties files enable you to easily inject configuration information or other application data into
the application.

Java SE 7 Programming 8 - 6

Oracle Internal & Oracle Academy Use Only

1
2
3
4
5
6
7
8
9
10
11
12
13
14

Loading Properties from the Command Line

Property information can also be passed on the command


line.
Use the D option to pass key-value pairs:

java Dpropertyname=value Dpropertyname=value myApp

For example, pass one of the previous values

java Dusername=user myApp

Get the Properties data from the System object:

String userName = System.getProperty("username");

Copyright 2011, Oracle and/or its affiliates. All rights reserved.

Property information can also be passed on the command line. The advantage to passing
properties from the command line is simplicity. You do not have to open a file and read from it.
However, if you have more than a few parameters, a properties file is preferable.

Java SE 7 Programming 8 - 7

Oracle Internal & Oracle Academy Use Only

PrintWriter and the Console


If you are tired of using System.out.println() to print text
to the console, there is an alternative.

public class PrintWriterExample {


public static void main(String[] args){
PrintWriter pw = new PrintWriter(System.out, true);
pw.println("This is some output.");
}
}

Copyright 2011, Oracle and/or its affiliates. All rights reserved.

If you do not want to type System.out.whatever over and over again, you can use
PrintWriter to save you some typing. The example in the slide shows how to create the object.
The true option is required to force PrintWriter to flush each line printed to the console.

Java SE 7 Programming 8 - 8

Oracle Internal & Oracle Academy Use Only

import java.io.PrintWriter;

printf format

public class PrintfExample {


public static void main(String[] args){
PrintWriter pw = new PrintWriter(System.out, true);
double price = 24.99; int quantity = 2; String color = "Blue";
System.out.printf("We have %03d %s Polo shirts that cost
$%3.2f.\n", quantity, color, price);
System.out.format("We have %03d %s Polo shirts that cost
$%3.2f.\n", quantity, color, price);
String out = String.format("We have %03d %s Polo shirts that cost
$%3.2f.", quantity, color, price);
System.out.println(out);
pw.printf("We have %03d %s Polo shirts that cost $%3.2f.\n",
quantity, color, price);
}
}

Copyright 2011, Oracle and/or its affiliates. All rights reserved.

You can perform the printf format using both the String class and any output stream. The slide
shows several different string formatting examples. See the Java API documentation for details
about all the options.
%s: String
%d: Decimal
%f: Float
The program output is the following:
We have 002 Blue Polo shirts
We have 002 Blue Polo shirts
We have 002 Blue Polo shirts
We have 002 Blue Polo shirts

that
that
that
that

cost
cost
cost
cost

$24.99.
$24.99.
$24.99.
$24.99.

Java SE 7 Programming 8 - 9

Oracle Internal & Oracle Academy Use Only

Java provides many ways to format strings:


printf and String.format

Quiz

a. System.out.printf("%s Polo shirts cost


$%3.2f.\n", "Red", "35.00");
b. System.out.format("%s Polo shirts cost
$%3.2f.\n", "Red", "35.00");
c. System.out.println("Red Polo shirts cost
$35.00.\n");
d. System.out.print("Red Polo shirts cost
$35.00.\n");

Copyright 2011, Oracle and/or its affiliates. All rights reserved.

Java SE 7 Programming 8 - 10

Oracle Internal & Oracle Academy Use Only

Which two of the following are valid formatted print statements?

String Processing

StringBuilder for constructing string

Built-in string methods

Parsing with StringTokenizer

Copyright 2011, Oracle and/or its affiliates. All rights reserved.

The first part of this section covers string functions that are not regular expressions. When you
perform simple string manipulations, there are a number of very useful built-in methods.

Java SE 7 Programming 8 - 11

Oracle Internal & Oracle Academy Use Only

Searching
Parsing
Extracting substring

StringBuilder and StringBuffer

StringBuilder and StringBuffer are the preferred


tools when string concatenation is nontrivial.
More efficient than +

Concurrency

Set capacity to the size you actually need.


Constant buffer resizing can also lead to performance
problems.

Copyright 2011, Oracle and/or its affiliates. All rights reserved.

The StringBuilder and StringBuffer classes are the preferred way to concatenate strings.

Java SE 7 Programming 8 - 12

Oracle Internal & Oracle Academy Use Only

StringBuilder (not thread-safe)


StringBuffer (thread-safe)

StringBuilder: Example
public class StringBuilding {
public static void main(String[] args){
StringBuilder sb = new StringBuilder(500);

sb.append("The lightning struck...\n").append("[


for(int i = 1; i < 11; i++){
sb.append(i).append(" ");
}
sb.append("] times");

");

System.out.println(sb.toString());
}
}
Copyright 2011, Oracle and/or its affiliates. All rights reserved.

The example in the slide shows some common StringBuilder methods. You can use
StringBuilder to insert text in position. Chaining append calls together is a best practice for
building strings.
The output from the program is as follows:
It was a dark and stormy night, the lightning flashed and the thunder
rumbled.
The lightning struck...
[

10 ] times

Java SE 7 Programming 8 - 13

Oracle Internal & Oracle Academy Use Only

sb.append(", the lightning flashed and the thunder


rumbled.\n");
sb.insert(0, "It was a dark and stormy night");

Sample String Methods


public class StringMethodsExample {
public static void main(String[] args){
PrintWriter pw = new PrintWriter(System.out, true);
String tc01 = "It was the best of times";
String tc02 = "It was the worst of times";
if (tc01.equals(tc02)){
pw.println("Strings match..."); }
if (tc01.contains("It was")){
pw.println("It was found"); }
String temp = tc02.replace("w", "zw");
pw.println(temp);
pw.println(tc02.substring(5, 12));
}
}

Copyright 2011, Oracle and/or its affiliates. All rights reserved.

The code in the slide demonstrates some of the more useful string methods of the String class.
equals(): Tests the equality of the contents of two strings. This is preferable to ==, which
tests whether two objects point to the same reference.
contains(): Searches a string to see if it contains the string provided
replace(): Searches for the string provided and replaces all instances with the target
string provided. There is a replaceFirst() method for replacing only the first instance.
substring(): Returns a string based on its position in the string
Running the programs in the slide returns the following output:
It was found
It zwas the zworst of times
s the w

Java SE 7 Programming 8 - 14

Oracle Internal & Oracle Academy Use Only

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15

Using the split() Method

4
5
6
7
8
9
10

public class StringSplit {


public static void main(String[] args){
String shirts = "Blue Shirt, Red Shirt, Black
Shirt, Maroon Shirt";
String[] results = shirts.split(", ");
for(String shirtStr:results){
System.out.println(shirtStr);
}
}
}

Copyright 2011, Oracle and/or its affiliates. All rights reserved.

The simplest way to parse a string is using the split() method. Call the method with the
character (or characters) that will split the string apart. The result is captured in an array.
Note: The delimiter can be defined using regular expressions.
The output of the program in the slide is as follows:
Blue Shirt
Red Shirt
Black Shirt
Maroon Shirt

Java SE 7 Programming 8 - 15

Oracle Internal & Oracle Academy Use Only

1
2
3

Parsing with StringTokenizer

4
5
6
7
8
9
10
11

public class StringTokenizerExample {


public static void main(String[] args){
String shirts = "Blue Shirt, Red Shirt, Black Shirt, Maroon
Shirt";
StringTokenizer st = new StringTokenizer(shirts, ", ");
while(st.hasMoreTokens()){
System.out.println(st.nextToken());
}
}
}

Copyright 2011, Oracle and/or its affiliates. All rights reserved.

The StringTokenizer class does the same thing as split() but takes a different approach.
You must iterate the tokens to get access to them. Also note that the delimiter ", " in this case
means use both commas and spaces as delimiters. Thus, the result from parsing is the following:
Blue
Shirt
Red
Shirt
Black
Shirt
Maroon
Shirt

Java SE 7 Programming 8 - 16

Oracle Internal & Oracle Academy Use Only

1
2
3

Scanner
A Scanner can tokenize a string or a stream.
public static void main(String[] args) {
Scanner s = null;
StringBuilder sb = new StringBuilder(64);
String line01 = "1.1, 2.2, 3.3";
float fsum = 0.0f;
s = new Scanner(line01).useDelimiter(", ");
try {
while (s.hasNextFloat()) {
float f = s.nextFloat();
fsum += f;
sb.append(f).append(" ");
}
System.out.println("Values found: " + sb.toString());
System.out.println("FSum: " + fsum);
} catch (Exception e) {
System.out.println(e.getMessage());
}

Copyright 2011, Oracle and/or its affiliates. All rights reserved.

A Scanner can be used to tokenize an input stream or a string. In addition, a Scanner can be
used to tokenize numbers and convert them into any primitive number type. Note how the
Scanner is defined on line 7. The resulting object can be iterated over based on a specific type.
In this case, a float is used.
The output from this code segment is as follows:
Values found: 1.1 2.2 3.3
FSum: 6.6000004

Java SE 7 Programming 8 - 17

Oracle Internal & Oracle Academy Use Only

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18

Regular Expressions

A language for matching strings of text


Very detailed vocabulary
Search, extract, or search and replace

With Java, the backslash (\) is not fun.


Java objects

Pattern
Matcher
PatternSyntaxException
java.util.regex

Copyright 2011, Oracle and/or its affiliates. All rights reserved.

Java SE 7 Programming 8 - 18

Oracle Internal & Oracle Academy Use Only

Pattern: Defines a regular expression


Matcher: Specifies a string to search

1
2
3
4
5
6
7
8
9
10
11
12
13

import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class PatternExample {
public static void main(String[] args){
String t = "It was the best of times";
Pattern pattern = Pattern.compile("the");
Matcher matcher = pattern.matcher(t);
if (matcher.find()) { System.out.println("Found match!"); }
}
}

Copyright 2011, Oracle and/or its affiliates. All rights reserved.

The Pattern and Matcher objects work together to provide a complete solution.
The Pattern object defines the regular expression that will be used for the search. As shown in
the example, a regular expression can be as simple as a word or phrase.
The Matcher object is then used to select the target string to be searched. A number of methods
are available for matcher. They are covered in the following slides.
When run, the example produces the following output:
Found match!

Java SE 7 Programming 8 - 19

Oracle Internal & Oracle Academy Use Only

Pattern and Matcher

Character Classes

Matches any single character (letter, digit, or special character), except


end-of-line markers

[abc]

Would match any a, b, or c in that position

[^abc]

Would match any character that is not a, b, or c in that position

[a-c]

A range of characters (in this case, a, b, and c)

Alternation; essentially an or indicator

Copyright 2011, Oracle and/or its affiliates. All rights reserved.

Character classes enable you to match one character in a number of ways.

Java SE 7 Programming 8 - 20

Oracle Internal & Oracle Academy Use Only

Character Description

Character Class: Examples

Pattern

It was the best of times


Description

Text Matched

w.s

Any sequence that starts with a


w followed by any character
followed by s.

It was the best of


times

w[abc]s

Any sequence that starts with a


It was the best of
w followed by a, b, or c and times
then s.

t[^aeo]mes

Any sequence that starts with a


t followed any character that is
not a, e, or o followed by
mes.

It was the best of


times

Copyright 2011, Oracle and/or its affiliates. All rights reserved.

The code for this example can be found in the StringExamples project in the
CustomCharClassExamples.java file.

Java SE 7 Programming 8 - 21

Oracle Internal & Oracle Academy Use Only

Target String

Character Class Code: Examples


public class CustomCharClassExamples {
public static void main(String[] args) {
String t = "It was the best of times";
Pattern p1 = Pattern.compile("w.s");
Matcher m1 = p1.matcher(t);
if (m1.find()) { System.out.println("Found: " + m1.group());
}
Pattern p2 = Pattern.compile("w[abc]s");
Matcher m2 = p2.matcher(t);
if (m2.find()) { System.out.println("Found: " + m2.group());
}
Pattern p3 = Pattern.compile("t[^eou]mes");
Matcher m3 = p3.matcher(t);
if (m3.find()) { System.out.println("Found: " + m3.group());
}

Copyright 2011, Oracle and/or its affiliates. All rights reserved.

The example in the slide shows two ways to find was and a way to find times.
To make this happen in Java:
1. Create a Pattern object to store the regular expression that you want to search with.
2. Create a Matcher object by passing the text to be searched to your Pattern object and
returning a Matcher.
3. Call Matcher.find() to search the text with the Pattern you defined.
4. Call Matcher.group() to display the characters that match your pattern.

Java SE 7 Programming 8 - 22

Oracle Internal & Oracle Academy Use Only

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18

Predefined
Character

Character Class

Negated
Negated Class
Character

\d (digit)

[0-9]

\D

[^0-9]

\w (word char)

[a-zA-Z0-9_]

\W

[^a-zA-Z0-9_]

\S

[^ \r\t\n\f\0XB]

\s (white space) [ \r\t\n\f\0XB]

Copyright 2011, Oracle and/or its affiliates. All rights reserved.

A number of character classes are used repeatedly. These classes are turned into predefined
character classes. Classes exist to identify digits, word characters, and white space.
White-Space Characters
\t: Tab character
\n: New-line character
\r: Carriage return
\f: Form feed
\x0B: Vertical tab

Java SE 7 Programming 8 - 23

Oracle Internal & Oracle Academy Use Only

Predefined Character Classes

Predefined Character Class: Examples


Jo told me 20 ways to San Jose in 15 minutes.

Pattern

Description

Text Matched

\\d\\d

Find any two digits.**

Jo told me 20 ways
to San Jose in 15
minutes.

\\sin\\s

Find in surrounded by two


spaces and then the next three
characters.

Jo told me 20 ways
to San Jose in 15
minutes.

\\Sin\\S

Find in surrounded by two


non-space characters and then
the next three characters.

Jo told me 20 ways
to San Jose in 15
minutes.

Copyright 2011, Oracle and/or its affiliates. All rights reserved.

** If there are additional matches in the current line, additional calls to find() will return the next
match on that line.
Example:
Pattern p1 = Pattern.compile("\\d\\d");
Matcher m1 = p1.matcher(t);
while (m1.find()){
System.out.println("Found: " + m1.group());
}
Produces:
Found: 20
Found: 15
The code for this example can be found in the StringExamples project in the
PredefinedCharClassExample.java file.

Java SE 7 Programming 8 - 24

Oracle Internal & Oracle Academy Use Only

Target String

Quantifiers

The previous character is repeated zero or more times.

The previous character is repeated one or more times.

The previous character must appear once or not at all.

{n}

The previous character appears exactly n times.

{m,n}

The previous character appears from m to n times.

{m,}

The previous character appears m or more times.

(xx){n}

This group of characters repeats n times.

Copyright 2011, Oracle and/or its affiliates. All rights reserved.

Quantifiers enable you to easily select a range of characters in your queries.

Java SE 7 Programming 8 - 25

Oracle Internal & Oracle Academy Use Only

Quantifier Description

Quantifier: Examples

Pattern

Longlonglong ago, in a galaxy far far away


Description

Text Matched

ago.*

Find ago and then 0 or all the


characters remaining on the line.

Longlonglong ago, in
a galaxy far far away

gal.{3}

Match gal plus the next three


characters. This replaces as
used in a previous example.

Longlonglong ago, in
a galaxy far far away

(long){2}

Find long repeated twice.

Longlonglong ago, in
a galaxy far far away

Copyright 2011, Oracle and/or its affiliates. All rights reserved.

The code for this example can be found in the StringExamples project in the
QuantifierExample.java file.

Java SE 7 Programming 8 - 26

Oracle Internal & Oracle Academy Use Only

Target String

Greediness

A regular expression always tries to grab as many


characters as possible.
Use the ? operator to limit the search to the shortest
possible match.

Target String
Pattern

Longlonglong ago, in a galaxy far far away.


Description

Text Matched

ago.*far

A regular expression always


grabs the most characters
possible.

Longlonglong ago, in
a galaxy far far away.

ago.*?far

The ? character essentially


turns off greediness.

Longlonglong ago, in
a galaxy far far away.

Copyright 2011, Oracle and/or its affiliates. All rights reserved.

A regular expression always tries to match the characters that return the most characters. This is
known as the greediness principle. Use the ? operator to limit the result to the fewest characters
needed to match the pattern.
The code for this example can be found in the StringExamples project in the
GreedinessExample.java file.

Java SE 7 Programming 8 - 27

Oracle Internal & Oracle Academy Use Only

Which symbol means that the character is repeated one or


more times?
a. *
b. +
c. .
d. ?

Copyright 2011, Oracle and/or its affiliates. All rights reserved.

Java SE 7 Programming 8 - 28

Oracle Internal & Oracle Academy Use Only

Quiz

Anchor

Description

Matches the beginning of a line

Matches the end of a line

\b

Matches the start or the end of a word

\B

Does not match the start or end of a word

Copyright 2011, Oracle and/or its affiliates. All rights reserved.

Boundary characters can be used to match different parts of a line.

Java SE 7 Programming 8 - 29

Oracle Internal & Oracle Academy Use Only

Boundary Matchers

Boundary: Examples

Pattern
^it.*?times

it was the best of times or it was the worst of times


Description
The sequence that starts a line
with it followed by some
characters and times, with
greediness off

\\sit.*times$ The sequence that starts with it


followed by some characters and
ends the line with times
\\bor\\b.{3}

Find or surrounded by word


boundaries, plus the next three
characters.

Text Matched
It was the best of
times or it was the
worst of times
It was the best of
times or it was the
worst of times
It was the best of
times or it was the
worst of times

Copyright 2011, Oracle and/or its affiliates. All rights reserved.

The code for this example can be found in the StringExamples project in the
BoundaryCharExample.java file.

Java SE 7 Programming 8 - 30

Oracle Internal & Oracle Academy Use Only

Target String

Quiz

Copyright 2011, Oracle and/or its affiliates. All rights reserved.

Java SE 7 Programming 8 - 31

Oracle Internal & Oracle Academy Use Only

Which symbol matches the end of a line?


a. *
b. +
c. $
d. ^

Target String

george.washington@example.com

Match 3 Parts

(george).(washington)@(example.com)

Group Numbers

( 1 ).( 2 )@( 3 )

Pattern

(\\S+?)\\.(\\S+?)\\@(\\S+)

Copyright 2011, Oracle and/or its affiliates. All rights reserved.

With regular expressions, you can use parentheses to identify parts of a string to match. This
example matches the component parts of an email address. Notice how each pair of parentheses
is numbered. In a regular expression, group(0) matches all the text matched when groups are
used. Here is the source code for the example:
public class MatchingExample {
public static void main(String[] args){
String email = "george.washington@example.com";
Pattern p1 = Pattern.compile("(\\S+?)\\.(\\S+?)\\@(\\S+)");
Matcher m1 = p1.matcher(email);
if (m1.find()){
System.out.println("First: " + m1.group(1));
System.out.println("Last: " + m1.group(2));
System.out.println("Domain: " + m1.group(3));
System.out.println("Everything Matched: " + m1.group(0));
}
}
}

Java SE 7 Programming 8 - 32

Oracle Internal & Oracle Academy Use Only

Matching and Groups

Using the replaceAll Method


Using the replaceAll method, you can search and replace.

Pattern p1 = Pattern.compile("h1");
Matcher m1 = p1.matcher(header);
if (m1.find()){
header = m1.replaceAll("p");
System.out.println(header);
}
}
}

Copyright 2011, Oracle and/or its affiliates. All rights reserved.

You can do a search-and-replace by using the replaceAll method after performing a find.
The output from the program is as follows:
<p>This is an H1</p>

Java SE 7 Programming 8 - 33

Oracle Internal & Oracle Academy Use Only

public class ReplacingExample {


public static void main(String[] args){
String header = "<h1>This is an H1</h1>";

Summary

Search strings by using regular expressions


Parse strings by using regular expressions
Replace strings by using regular expressions

Copyright 2011, Oracle and/or its affiliates. All rights reserved.

Java SE 7 Programming 8 - 34

Oracle Internal & Oracle Academy Use Only

In this lesson, you should have learned how to:


Read data from the command line
Search strings
Parse strings
Create strings by using a StringBuilder

Practice 8-1 Overview:


Parsing Text with split()

Copyright 2011, Oracle and/or its affiliates. All rights reserved.

Java SE 7 Programming 8 - 35

Oracle Internal & Oracle Academy Use Only

This practice covers using the String.split() method to


parse text.

Practice 8-2 Overview:


Creating a Regular Expression Search Program

Copyright 2011, Oracle and/or its affiliates. All rights reserved.

Java SE 7 Programming 8 - 36

Oracle Internal & Oracle Academy Use Only

This practice covers creating a program that searches through


a text file using a regular expression.

Practice 8-3 Overview:


Transforming HTML by Using
Regular Expressions

Copyright 2011, Oracle and/or its affiliates. All rights reserved.

Java SE 7 Programming 8 - 37

Oracle Internal & Oracle Academy Use Only

This practice covers transforming the HTML of a file by using


several regular expressions.

Oracle Internal & Oracle Academy Use Only

You might also like