You are on page 1of 576

e10g: Java Programming

Oracle

Instructorr Guide - Volume 1

D17249GC11
Edition 1.1
August 2004
D39815
Authors Copyright © 2004, Orac
cle. All rights reserved.

Jeff Gallus This documentation contains proprietary information of Oracle Corporation. It is


provided under a license e agreement containing restrictions on use and disclosure and
Glenn Stokol is also protected by copyyright law. Reverse engineering of the software is prohibited.
If this documentation is delivered
d to a U.S. Government Agency of the Department of
Technical Contributors Defense, then it is delive
ered with Restricted Rights and the following legend is
applicable:
and Reviewers
Restricted Rights Lege
end
Kenneth Cooper
Peter Driver Use, duplication or disclo
osure by the Government is subject to restrictions for
Christian Dugas commercial computer so oftware and shall be deemed to be Restricted Rights software
Craig Hollister under Federal law, as seet forth in subparagraph (c)(1)(ii) of DFARS 252.227-7013,
Rights in Technical Dataa and Computer Software (October 1988).
Chika Izumi
Pete Laseau This material or any porttion of it may not be copied in any form or by any means
Glenn Maslen without the express prior written permission of Oracle Corporation. Any other copying
Monica Motley is a violation of copyright law and may result in civil and/or criminal penalties.
Gayathri Rajagopal If this documentation is delivered
d to a U.S. Government Agency not within the
Department of Defense, then it is delivered with “Restricted Rights,” as defined in
Publisher FAR 52.227-14, Rights in Data-General, including Alternate III (June 1987).

Poornima G The information in this document is subject to change without notice. If you find any
problems in the documentation,
ntation please report them in writing to Education Products
Products,
Oracle Corporation, 500 Oracle Parkway, Box SB-6, Redwood Shores, CA 94065.
Oracle Corporation does s not warrant that this document is error-free.

All references to Oracle and Oracle products are trademarks or registered trademarks
of Oracle Corporation.

All other products or com


mpany names are used for identification purposes only, and
may be trademarks of th heir respective owners.
Contents

Preface

I Introduction
Objectives I-2
Course Overview I-3

1 Introducing
t oduc g the
t e Java
Ja a a
anddOOracle
ac e Platforms
at o s
Objectives 1-2
What Is Java? 1-3
Key Benefits of Java 1-4
An Object-Oriented Approach 1-6
Platform Independence 1-7
Using Java with Enterprise Internet Computing 1-8
Using the Java Virtual Machine 1-10
How Does JVM Work? 1-12
Benefits of Just-In-Time (JIT) Compilers 1-14
Implementing Security in the Java Environment 1-16
Deployment of Java Applications 1-18
Using Java with Oracle 10g 1-19
Java Software Development Kit 1-20
Using the Appropriate Development Kit 1-211 21
Integrated Development Environment 1-22
Exploring the JDeveloper Environment 1-23
Oracle10g Products 1-24
Summary 1-25

2 Defining Object-Oriented Principles


Objectives 22-22
What Is Modeling? 2-4
What Are Classes and Objects? 2-5
An Object’s Attributes Maintain Its State 2-6
Objects Have Behavior 2-8
Objects Are Modeled as Abstractions 2-9
Defining Object Composition 2-11
The Donut Diagram 2-13 2 13
Guided Practice: Spot the Operations and Attributes 2-14
Collaborating Objects 2-15
Objects Interact Through Messages 2-16
What Is a Class? 2-17
How Do You Identify a Class? 2-18
Comparing Classes and Objects 2-19
Wh t IIs Encapsulation?
What E l ti ? 2-21
2 21
What Is Inheritance? 2-22

iii
Using the “Is-a-Kind-of” Relationship 2-23
What Is Polymorphism? 2-24
Architecture Rules for Reuse 2-26
Engineering for a Black Box Environment 2-27
Order Entry UML Diagram 2-28
Summary 2-29
Practice 2: Overview 2-30
Order Entry System Partial UML Class Model 2-33

3 Basic Java Syntax and Coding Conventions


Objectives 3-2
Examining Toolkit Components 3-4
Exploring Packages in J2SE/J2EE 3-5
Documenting Using the J2SE 3-6
Contents of a Java Source 3-7
Establishing Naming Conventions 3-8
More About Naming g Conventions 3-10
Defining a Class 3-12
Rental Class: Example 3-13
Creating Code Blocks 3-15
Defining Java Methods 3-16
Examples of a Method 3-17
Declaring Variables 3-18
Examples of Variables in the Context of a Method 3
3-19
19
Rules for Creating Statements 3-20
What Are JavaBeans? 3-21
Managing Bean Properties 3-22
Exposing Properties and Methods 3-23
JavaBean Standards at Design Time 3-24
Compiling and Running a Java Application 3-25
The CLASSPATH Variable 3-26
CLASSPATH: Example 3-27
Summary 3-28
Practice 3: Overview 3-29

4 Exploring Primitive Data Types and Operators


Objectives 4-2
Reserved Keywords 4 4-4
4
Variable Types 4-5
Primitive Data Types 4-7
What Are Variables? 4-9
Declaring Variables 4-10
Local Variables 4-11
Defining Variable Names 4-12
What Are Numeric Literals? 4-13
What Are Nonnumeric Literals? 4-15

iv
Guided Practice: Declaring Variables 4-17
What Are Operators? 4-19
Categorizing
g g Operators
p 4-20
Using the Assignment Operator 4-21
Working with Arithmetic Operators 4-22
More on Arithmetic Operators 4-23
Examining Conversions and Casts 4-24
Incrementing and Decrementing Values 4-26
Relational and Equality Operators 4-27
Using the Conditional Operator (?:) 4
4-28
28
Using Logical Operators 4-29
Compound Assignment Operators 4-30
Operator Precedence 4-31
More on Operator Precedence 4-32
Concatenating Strings 4-33
Summary 4-34
Practice 4: Overview 4-35
4 35

5 Controlling Program Flow


Objectives 5-2
Categorizing Basic Flow Control Types 5-4
Using Flow Control in Java 5-6
Using the if Statement 5-7
Nesting if Statements 5 5-8
8
Guided Practice: Spot the Mistakes 5-9
Defining the switch Statement 5-10
More About the switch Statement 5-12
Looping in Java 5-13
Using the while Loop 5-14
Using the do…while Loop 5-15
Using the for Loop 5-16
More About the for Loop 5-17
Guided Practice: Spot the Mistakes 5-18
The break Statement 5-19
Summary 5-20
Practice 5: Overview 5-21

6 Building Applications with Oracle JDeveloper 10g


Objectives 6-2
What Is Oracle JDeveloper 10g? 6-3
Exploring the JDeveloper Environment 6-4
Examining Workspaces 6-5
What Are Projects? 6-7
Creating JDeveloper Items 6-8
Creating an Application Workspace 6-9
Specifying Project Details 6-10
Selecting Additional Libraries 6-11

v
Adding a New J2SE 6-12
Looking at the Directory Structure 6-13
Exploring
p g the Skeleton Java Application
pp 6-14
Finding Methods and Fields 6-15
Supporting Code Development with Profiler and Code Coach 6-16
Customizing JDeveloper 6-17
Using the Help System 6-18
Obtaining Help on a Topic 6-19
Oracle JDeveloper 10g Debugger 6-20
Setting Breakpoints 6 6-22
22
Using the Debugger Windows 6-24
Stepping Through a Program 6-25
Watching Data and Variables 6-26
Summary 6-27
Practice 6: Overview 6-28

7 Creating g Classes and Objects


j
Objectives 7-2
Using Java Classes 7-4
Comparing Classes and Objects 7-5
Creating Objects 7-6
Using the new Operator 7-7
Comparing Primitives and Objects 7-8
Using the null Reference 7 7-9
9
Assigning References 7-10
Declaring Instance Variables 7-11
Accessing public Instance Variables 7-12
Defining Methods 7-13
Calling a Method 7-14
Specifying Method Arguments: Examples 7-15
Returning a Value from a Method 7-16
7 16
Calling Instance Methods 7-17
Applying Encapsulation in Java 7-18
Passing Primitives into Methods 7-19
Passing Object References into Methods 7-20
What Are Class Variables? 7-21
Initializing Class Variables 7-22
Wh t A
What Are Cl
Class M
Methods?
th d ? 7-23
7 23
Guided Practice: Class Methods or Instance Methods 7-24
Examples in Java 7-25
Creating Classes Using the Class Editor 7-26
What Are Java Packages? 7-27
Grouping Classes in a Package 7-28

vi
Setting the CLASSPATH with Packages 7-29
Access Modifiers 7-30
Summary y 7-32
Practice 7: Overview 7-33

8 Object Life Cycle and Inner Classes


Objectives 8-2
Overloading Methods 8-4
Using the this Reference 8-5
Initializing Instance Variables 8-6
What Are Constructors? 8-7
Defining and Overloading Constructors 8-8
Sharing Code Between Constructors 8-9
final Variables, Methods, and Classes 8-10
Reclaiming Memory 8-11
Using the finalize() Method 8-12
What Are Inner Classes? 8-13
Using Member Inner Class 8-14
Using Local Inner Class 8-15
Defining Anonymous Inner Classes 8-16
Using the Calendar Class 8-17
Summary 8-18
Practice 8: Overview 8-19

9 Using Strings, String Buffer, Wrapper, and Text-Formatting Classes


Objectives 9-2
What Is a String? 9-3
Creating a String 9-4
Concatenating Strings 9-5
Performing Operations on Strings 9-6
Performingg More Operations
p on Strings
g 9-7
Comparing String Objects 9-8
Producing Strings from Other Objects 9-9
Producing Strings from Primitives 9-10
Producing Primitives from Strings 9-11
Wrapper Class Conversion Methods 9-12
Changing the Contents of a String 9-13
Formatting Classes 9 9-14
14
Using the SimpleDateFormat Class 9-15
Using the MessageFormat Class 9-16
Using DecimalFormat 9-17
Guided Practice 9-18
Using Regular Expressions 9-20

vii
About System.out.println 9-23
About OutputStream and PrintStream 9-24
j
What Is Object Serialization? 9-25
Serialization Streams, Interfaces, and Modifiers 9-28
Summary 9-29
Practice 9: Overview 9-30

10 Reusing Code with Inheritance and Polymorphism


Objectives 10-2
Key Object-Oriented Components 10-3
Example of Inheritance 10-4
Specifying Inheritance in Java 10-5
Defining Inheritance by Using Oracle JDeveloper 10g 10-6
What Does a Subclass Object Look Like? 10-7
Default Initialization 10-8
The super Reference 10-9
The super Reference Example p 10-10
Using Superclass Constructors 10-11
Specifying Additional Methods 10-13
Overriding Superclass Methods 10-15
Invoking Superclass Methods 10-17
Example of Polymorphism in Java 10-19
Treating a Subclass as Its Superclass 10-20
Browsing Superclass References by Using Oracle JDeveloper 10g 10
10-21
21
Acme Video and Polymorphism 10-22
Using Polymorphism for Acme Video 10-23
Using the instanceof Operator 10-25
Limiting Methods and Classes with final 10-26
Ensuring Genuine Inheritance 10-27
Summary 10-28

11 Using Arrays and Collections


Objectives 11-2
What Is an Array? 11-3
Creating an Array of Primitives 11-4
Declaring an Array of Primitives 11-5
Creating an Array Object for an Array of Primitives 11-6
Initializing Array Elements 11 11-8
8
Creating an Array of Object References 11-9
Initializing the Objects in the Array 11-10
Using an Array of Object References 11-11
Arrays and Exceptions 11-12
Multidimensional Arrays 11-13
main() Revisited 11-14

viii
Working with Variable-Length Structures 11-15
Modifying a Vector 11-16
Accessingg a Vector 11-17
Java Collections Framework 11-18
Collections Framework Components 11-20
Using ArrayList and Hashtable 11-21
Using Iterators 11-22
Summary 11-23
Practice 11: Overview 11-24

12 Structuring Code by Using Abstract Classes and Interfaces


Objectives 12-2
Defining Abstract Classes 12-3
Creating Abstract Classes 12-4
What Are Abstract Methods? 12-5
Defining Abstract Methods 12-7
Defining
g and Usingg Interfaces 12-8
Examples of Interfaces 12-9
Creating Interfaces 12-10
Implementing Interfaces 12-12
Sort: A Real-World Example 12-13
Overview of the Classes 12-14
How the Sort Works 12-15
The Sortable Interface 12 12-16
16
The Sort Class 12-17
The Movie Class 12-18
Using the Sort 12-19
Using instanceof with Interfaces 12-20
Summary 12-21
Practice 12: Overview 12-22

13 Throwing and Catching Exceptions


Objectives 13-2
What Is an Exception? 13-3
How Does Java Handle Exceptions? 13-4
Advantages of Java Exceptions: Separating Error Handling Code 13-5
Advantages of Java Exceptions: Passing Errors Up the Call Stack 13-7
Advantages of Java Exceptions: Exceptions Cannot Be Ignored 13 13-8
8
Checked Exceptions, Unchecked Exceptions, and Errors 13-9
What to Do with an Exception 13-11
Catching and Handling Exceptions 13-12
Catching a Single Exception 13-13
Catching Multiple Exceptions 13-14

ix
Cleaning Up with a finally Block 13-15
Catching and Handling Exceptions: Guided Practice 13-16
Allowing
g an Exception
p to Pass to the Calling
g Method 13-18
Throwing Exceptions 13-19
Creating Exceptions 13-20
Catching an Exception and Throwing a Different Exception 13-21
Summary 13-22
Practice 13: Overview 13-23

14 User Interface Design: Swing Basics Planning the Application Layout


Objectives 14-2
Running Java UI Applications 14-3
AWT, Swing, and JFC 14-4
Swing Features 14-6
Lightweight or Heavyweight Components? 14-8
Planning the UI Layout 14-9
The Containment Hierarchyy 14-10
Top-Level Containers 14-12
Intermediate Containers 14-14
Atomic Components 14-15
Layout Management Overview 14-16
Border Layout 14-18
GridBag Layout 14-19
GridBag Constraints 14
14-20
20
Using Layout Managers 14-22
Combining Layout Managers 14-24
Using Frames or Dialogs 14-25
Using JPanel Containers 14-27
Adding Borders to Components 14-29
Using Internal Frames 14-30
Swing Text Controls 14-32
14 32
Adding Components with Oracle JDeveloper 10g 14-33
Creating a Frame 14-34
Adding Components 14-35
Setting Pluggable Look and Feel 14-37
Summary 14-39
Practice 14: Overview 14-40

15 Adding User Interface Components and Event Handling


Objectives 15-2
Swing Components 15-3
Swing Components in JDeveloper 15-5
Invoking the UI Editor 15-7
How to Add a Component to a Form 15-8
Edit the Properties of a Component 15-9
Code Generated by JDeveloper 15-10

x
Creating a Menu 15-12
Using JDeveloper Menu Editor 15-13
Practice 15-1: Overview 15-14
UI for Java Application 15-15
Java Event Handling Model 15-20
Event Handling Code Basics 15-21
Event Handling Process: Registration 15-22
Event Handling Process: The Event Occurs 15-24
Event Handling Process: Running the Event Handler 15-25
Using Adapter Classes for Listeners 15
15-26
26
Swing Model View Controller Architecture 15-27
Basic Text Component Methods 15-30
Basic JList Component Methods 15-31
What Events Can a Component Generate? 15-32
How to Define an Event Handler in JDeveloper 15-33
Default Event Handling Code Style Generated by JDeveloper 15-34
Completing the Event Handler Method 15-35
15 35
Summary 15-36
Practice 15-2: Overview 15-37

16 Using JDBC to Access the Database


Objectives 16-2
Java, J2EE, and Oracle 10g 16-3
Connecting to a Database with Java 1616-4
4
What Is JDBC? 16-5
Preparing the Environment 16-6
Steps for Using JDBC to Execute SQL Statements 16-8
Step 1: Registering the Driver 16-9
Connecting to the Database 16-10
Oracle JDBC Drivers: Thin Client Driver 16-11
Oracle JDBC Drivers: OCI Client Drivers 16-12
16 12
Choosing the Right Driver 16-13
Step 2: Getting a Database Connection 16-14
About JDBC URLs 16-15
JDBC URLs with Oracle Drivers 16-16
Step 3: Creating a Statement 16-17
Using the Statement Interface 16-18
St 4a:
Step 4 Executing
E ti a Query
Q 16 19
16-19
The ResultSet Object 16-20
Step 4b: Submitting DML Statements 16-21
Step 5: Processing the Query Results 16-23
Step 6: Closing Connections 16-24
A Basic Query Example 16-25

xi
Mapping Database Types to Java Types 16-26
Handling an Unknown SQL Statement 16-28
Handlingg Exceptions
p 16-29
Managing Transactions 16-30
The PreparedStatement Object 16-31
How to Create a PreparedStatement 16-32
How to Execute a PreparedStatement 16-33
Maximize Database Access 16-34
Connection Pooling 16-35
Summary 16 16-38
38
Practice 16: Overview 16-39
17 Deploying Applications by Using Java Web Start
Objectives 17-2
What Is Java Web Start? 17-3
Running a Web Start Application 17-4
Advantages of Web Start 17-5
Examining the JNLP File 17-6
Deploying Applications with JDeveloper 17-7
Creating the Deployment Profile File 17-8
Saving the Deployment Profile 17-9
Selecting Files to Deploy 17-10
Making an Executable .jar File 17-11
Creating
g and Deploying
p y g the Archive File 17-12
Using JDeveloper to Deploy an Application to Java Web Start 17-13
Step 1: Generate Deployment Profiles and Archive Application 17-14
Step 2a: Start OC4J 17-15
Step 2b: Creating a Connection 17-16
Step 3: Use Web Start Wizard to Create a JNLP File 17-17
Step 4: Archive and Deploy the Application to the OC4J Server 17-18
Summary 17 17-19
19
Practice 17: Overview 17-20
Appendix A: Practice Solutions
Appendix B: Java Language Quick-Reference Guide
Appendix C: Order Entry Solution

xii
Preface
Profile

Prerequisites
• Required: Previous experience with another 3GL programming language, preferably a structured
l
language suchh as Pascal
P l or C
• Suggested: Familiarity with basic HTML

How This Course Is Organized


Oracle 10g: Java Programming is an instructor-led course featuring lectures and hands-on exercises. Online
demonstrations and written practice sessions reinforce the concepts and skills introduced.

Preface - 3
Related Publications

Oracle Publications
Title Part Number
Oracle 10g: Build J2EE Applications (inClass course) D17247GC10
Oracle JDeveloper 10g: Build Applications with Oracle ADF (inClass course) D16975GC10
Oracle JDeveloper Handbook (Oracle Press)

Additional Publications
• System release bulletins
• Installation and user’s guides
• Read-me files
• International Oracle User’s Group (IOUG) articles
• Oracle Magazine

Preface - 4
Typographic Conventions

Typographic Conventions In Text

Convention Element Example


Bold Emphasized words and phrases To navigate within this application , do not
in Web content only click the Back and Forward buttons.

Bold italic Glossary terms (if there is a The algorithm inserts the new key.
glossary)

Brackets Key names Press [Enter].

Caps and Buttons, Click the Executable button.


lowercase check boxes, Select the Registration Required check
triggers, box.
windows
i d
Assign a When -Validate-Item trigger.
Open the Master Schedule window.

Carets Menu paths Select File > Save.

Commas Key sequences Press and release these keys one at a


time:
[Alt], [F], [D]

Preface - 5
Typographic Conventions (continued)

Typographic Conventions In Text (continued)

Convention Object or Term Example


Courier New, Code output, Code output: debug.seti (‘I’,300);
case sensitive SQL and PL/SQL SQL code elements: Use the SELECT command to view
code elements, Java
information stored in the last_name column of the emp
code elements,
table.
directory names, file
names, passwords, Java code elements: Java programming involves the
path
h names, St i and StringBuffer
String St i B ff classes.classes
user input, Directory names: bin (DOS), $FMHOME (UNIX)
usernames
File names: Locate the init.ora file.
Passwords: Use tiger as your password.
Path names: Open c:\my_docs\projects.
U iinput:
User t Enter
E t 300.
300
Usernames: Log on as scott.

Initial cap Graphics labels Customer address (but Oracle Payables)


(unless the term is a
proper noun)
Italic Emphasized words Do not save changes to the database
database.
and phrases in print For further information, see Oracle7 Server SQL
publications, titles Language Reference Manual.
of books and
courses, variables Enter user_id@us.oracle.com, where user_id is
the name of the user.
Plus signs Key combinations Press and hold these keys simultaneously:
[Control] + [Alt] + [Delete]

Quotation Lesson and chapter This subject is covered in Unit II, Lesson 3, “Working
marks titles in cross with Objects.”
references, interface
elements with long Select the “Include a reusable module component” and
names that have click Finish.
only initial caps
Use the “WHERE clause of query” property.

Preface - 6
Typographic Conventions (continued)

Typographic Conventions in Navigation Paths


This course uses simplified navigation paths, such as the following example, to direct you through Oracle
A li i
Applications.
Example:
Invoice Batch Summary
(N) Invoice > Entry > Invoice Batches Summary (M) Query > Find (B) Approve

This simplified
p ppath translates to the following:
g
1. (N) From the Navigator window, select Invoice > Entry > Invoice Batches Summary.
2. (M) From the menu, select Query > Find.
3. (B) Click the Approve button.
Notation:
(N) = Navigator (I) = Icon
(M) = M
Menu (H) = Hyperlink
H li k
(T) = Tab (B) = Button

Preface - 7
Introduction

Copyright © 2004, Oracle. All rights reserved.

Schedule: Timing Topic


10 minutes Lecture
10 minutes Total
Objectives

After completing this course, you should be able to do


the following:
• Write stand-alone applications with the Java
programming language
• Develop and deploy an application
• Build, generate, and test application components
by using Oracle JDeveloper 10g

I-2 Copyright © 2004, Oracle. All rights reserved.

Oracle10g: Java Programming I-2


Course Overview

• This course teaches you how to write Java


applications.
• You also learn how to build, debug, and deploy
applications by using Oracle JDeveloper 10g.
• The development environment is Oracle
JDeveloper 10g and the Oracle Database.

I-3 Copyright © 2004, Oracle. All rights reserved.

Instructor Note
The database used for this course is 9.2. It is the latest edition supported by the Development
Tools.

Oracle10g: Java Programming I-3


Introducing the Java
and Oracle Platforms

Copyright © 2004, Oracle. All rights reserved.

Schedule: Timing Topic


60 minutes Lecture
00 minutes Practice
60 minutes Total
Objectives

After completing this lesson, you should be able to do


the following:
• Identify the key elements of Java
• Describe the Java Virtual Machine (JVM)
• Examine how Java is used to build applications
• Identify the key components of the J2SE Java
Development Kit (known as JDK or SDK)
• Describe Java deployment options

1-2 Copyright © 2004, Oracle. All rights reserved.

Lesson Aim
This lesson introduces the background and usefulness of the Java language. It discusses Java’s
position with the Oracle10g. Java is the programming language of choice for Internet
applications. It has gained this status because of its robust nature, the object-orientation of the
language, the depth of its predefined classes, and its “write once, run anywhere” deployment
model. You learn how Java supports object-oriented programming and architectural neutral
deployment.

Oracle10g: Java Programming 1-2


What Is Java?

Java:
• Is a platform and an object-oriented language
• Was originally designed by Sun Microsystems for
consumer electronics
• Contains a class library
• Uses a virtual machine for program execution

1-3 Copyright © 2004, Oracle. All rights reserved.

What Is Java?
Designed by Sun Microsystems
Java is a platform and an object-oriented programming language, which was originally
developed by Sun Microsystems, Inc. It was created by James Gosling for use in consumer
electronics. Because of the robustness and platform-independent nature of the language, Java
soon moved beyond the consumer electronics industry and found a home on the World Wide
Web. Java is a platform, which means that it is a complete development and deployment
environment.
Class Libraries
Java contains a broad set of predefined classes, which contain attributes and methods that handle
most of the fundamental requirements of programs. Window management, input/output, and
network communication classes are included in the Java Developer’s Kit (JDK). The class
library makes Java programming significantly easier and faster to develop when compared with
other languages. JDK also contains several utilities to facilitate development processes. These
utilities handle operations, such as debugging, deployment, and documentation.
Java Uses a Virtual Machine
One of the key elements of the Java language is platform independence. A Java program that is
written on one platform can be deployed on any other platform. This is usually referred to as
“write once, run anywhere” (WORA). This task is accomplished through the use of the Java
Virtual Machine (JVM). JVM runs on a local machine and interprets the Java bytecode and
converts it into platform-specific machine code.
Oracle10g: Java Programming 1-3
Key Benefits of Java

• Object-oriented
• Interpreted and platform-independent
• Dynamic and distributed
• Multithreaded
• Robust and secure

1-4 Copyright © 2004, Oracle. All rights reserved.

Key Benefits of Java


Object-Oriented
An object is an entity that has data attributes, plus a set of functions that are used to manipulate
the object. Java is a strongly typed language, which means that almost everything in Java is an
object. The main exceptions are the primitive data types, such as integers and characters.
Interpreted and Platform Independent
Java programs are interpreted to the native machine’s instruction set at run time. Because Java
executes under the control of a JVM, Java programs can run on any operating system that
provides a JVM.
Dynamic and Distributed
Java classes can be downloaded dynamically over the network when required. In addition, Java
provides extensive support for client-server and distributed programming.

Oracle10g: Java Programming 1-4


Key Benefits of Java (continued)
Multithreaded
Java programs can contain multiple threads to carry out many tasks in parallel. Multithreading
capability is built into Java and is under the control of the platform-dependent JVM.
Robust and Secure
Java has built-in capabilities to prevent memory corruption. Java automatically manages the
processes of memory allocation and array bounds checking. It prohibits pointer arithmetic, and
restricts objects to named spaces in memory.
Instructor Note
Historically speaking, Gosling’s team started using C++ initially, but soon found that C++
programs were too liable to crash, partly due to language complexity, and also because of the
destructive capabilities of C++ constructs, such as pointers. To overcome these problems,
Gosling’s team invented their own object-oriented language, called Oak. To make it robust, they
eliminated problematic language constructs, and made it architecturally neutral, by fully
specifying the semantics of the language and creating a virtual machine to execute the programs.
Oak was designed from the ground up to look like C++ but also to reduce the learning curve for
those who knew C++. Oak was renamed Java, when it gained popularity in the World Wide Web
and the revolution began. The robustness, compactness, platform independence, and flexibility
that had been designed for the electronics consumer market make Java the ideal language for
creating Web-based programs. Because Java is an interpreted language, it is slower than C++ in
terms of execution speed, but this is often unimportant when dealing with user interactions.

Oracle10g: Java Programming 1-5


An Object-Oriented Approach

• Objects and classes


– An object is a run-time representation of a “thing.”
– A class is a “static definition of things.”
• Class models elaborate:
– Existing classes and objects
– Behaviour, purpose, and structure
– Relationships between classes
– Relationships between run-time objects
• Same models exist throughout the project.
Integration
Analysis Design Implementation
and testing

CLASS MODELS

1-6 Copyright © 2004, Oracle. All rights reserved.

An Object-Oriented Approach
Object-oriented programming is a powerful and natural paradigm that is used to write
application programs. The approach ensures that programs survive the changes accompanying
the growth of a business and its systems. After you understand the function of each object and
develop clean, reliable interfaces between the functions, you can decommission older parts of an
application system without concern.
Classes provide a means to capture the structure and behavior of a real-world person, place, or
thing, and represent a one-to-one mapping between the real-world object and its implementation.
This one-to-one mapping tends to eliminate the typical transformations that are found in
nonobject-oriented design approaches.

Oracle10g: Java Programming 1-6


Platform Independence

• Java source code is stored as text in a .java file.


• The .java file is compiled into .class files.
• A .class file contains Java bytecodes
(instructions).
• The bytecodes are interpreted at run time.
– The Java .class file is the executable code.

Compile JVM
(javac) (java)

Movie.java Movie.class Running program

1-7 Copyright © 2004, Oracle. All rights reserved.

Platform Independence
Java Is an Interpreted Language
Java program source code is stored in .java files. For example, a Java program dealing with
movies in a video rental company may have files called Movie.java, Customer.java, and
Rental.java.
Each .java file is compiled into a corresponding .class file with the same name. For
example, a Movie.java compiles to at least one class file. (Inner classes is quite common.)
But, the public Movie.java compiles to one Movie.class. These .class files contain
Java bytecodes, which are platform-independent machine instructions.
Java Virtual Machine (JVM)
JVM provides the environment for running Java programs. The JVM interprets Java bytecodes
into the native instruction set for the machine on which the program is currently running.
The same .class files can be executed unaltered on any platform for which a JVM is provided.
For this reason, JVM is sometimes referred to as a virtual processor.
Traditional Compiled Languages
When compiling a traditional language such as C, the code written by the programmer is
converted into machine instructions for the platform on which the compilation takes place. This
compiled program can then run only on machines that have the same processor as that on which
it was compiled, such as Intel, SPARC, or Alpha.

Oracle10g: Java Programming 1-7


Using Java with Enterprise
Internet Computing
Web Application
Client server server Data
Business
Presentation
logic

• Servlets • Enterprise
• JavaServer JavaBeans (EJB)
Pages (JSPs) • CORBA

1-8 Copyright © 2004, Oracle. All rights reserved.

Java and Enterprise Internet Computing


You can design Java programs as server-based components that form scalable Internet
applications.
The currently accepted model for Java Internet computing divides the end-to-end application
process into several logical tiers. To utilize this model, JavaSoft defined the Java2, Enterprise
Edition (J2EE). There are four logical tiers:
Client Tier
When Java is needed to execute on client machines, it is typically implemented as a browser-
based application. But a thin client can be just Web pages that are delivered from a server as
HTML.
Presentation Tier
This is executed on a Web server. Code in this tier handles the application’s presentation to the
client. Common Java features for this function are servlets and JavaServer Pages (JSPs). Servlets
and JSPs can each generate dynamic HTML for display as Web pages to clients.

Oracle10g: Java Programming 1-8


Java and Enterprise Internet Computing (continued)
Application (Business Logic) Tier
You can use Java on an application server to implement shareable, reusable business logic as
application components. A common way to implement this is to use component models, such as
Enterprise JavaBeans (EJB) and Common Object Request Broker Architecture (CORBA)
objects. These two components are also to be considered during design time, when a distributed
environment is required.
Data Tier
The data server not only stores data, but can also store and execute Java code, particularly where
this code is data intensive or enforces validation rules pertaining to the data. You can also use
Business Components, from Oracle’s Application Development Framework (ADF), to support
the data access of your application.

Oracle10g: Java Programming 1-9


Using the Java Virtual Machine

Operating system

JVM

Application

1-10 Copyright © 2004, Oracle. All rights reserved.

Running Java Applications


All Java applications run within a Java Virtual Machine (JVM). JVM is invoked differently
depending on whether the Java program is an application or an applet.
Applications
You can run stand-alone applications by invoking a local JVM directly from the operating
system command line and supplying the name of the main class for the application. After loading
the applications main class file, JVM runs the program by calling a known entry point in the
class; that is, a public static method called main(...). JVM runs the code by interpreting the
bytecodes in the Java program and converting bytecode into platform-specific machine
instructions.

Oracle10g: Java Programming 1-10


Running Java Applications (continued)
Running Java Applets
A Java applet is a special type of Java program that is used in Web pages. When a Web browser
reads an HTML page with an applet tag, it downloads the applet over the network to the local
system and runs the applet in a JVM that is built into the browser. The browser invokes a
specific call sequence of known methods in the Java applet class to execute the Java code in the
context of the browser’s JVM. The applet entry points differ from the entry point that is used by
JVM to run stand-alone applications.
In the case of an applet, the presentation server is not necessarily used. A Java application is
quite capable, and typically is configured, to connect directly to the business logic.
Applets are not covered in this course, and are only presented here for completeness. In this
course, during deployment of your application, you use the Java Web Start product.

Oracle10g: Java Programming 1-11


How Does JVM Work?

• The class loader loads all required classes.


– JVM uses a CLASSPATH setting to locate class files.
• JVM Verifier checks for illegal bytecodes.
• JVM Verifier executes bytecodes.
– JVM may invoke a Just-In-Time (JIT) compiler.
• Memory Manager releases memory used by the
dereferenced object back to the OS.
– JVM handles Garbage collection.

1-12 Copyright © 2004, Oracle. All rights reserved.

How Does JVM Work?


JVM Class Loader
When a .class file is run, it may require other classes to help perform its task. These classes
are loaded automatically by the class loader in JVM. The required classes may reside on the
local disk or on another system across the network. JVM uses the CLASSPATH environment
variable to determine the location of local .class files. The classpath can be added in run time
by using the java -cp or -classpath option.
Classes that are loaded from the network are kept in a separate namespace from those on the
local system. This prevents name clashes and the replacement or overriding of standard classes,
malicious or otherwise.
JVM Verifier
It is the job of the verifier to make sure that the Java code that is being interpreted does not
violate any of the basic rules of the Java language and that the code is from a trusted source. A
trusted source is an option; and if used, the check is not performed.
This validation ensures that there are no memory access violations or other illegal actions
performed.

Oracle10g: Java Programming 1-12


How Does JVM Work? (continued)
Bytecode Interpreter
JVM is the bytecode interpreter that executes the bytecodes for the loaded class. If enabled, JVM
can use just-in-time (JIT) technology to translate Java bytecodes into native machine
instructions.
Memory Management
JVM keeps track of all instances in use. After an instance is no longer in use, JVM is allowed to
release the memory that is used by that object. It performs the release of memory after the object
is no longer needed, but not necessarily immediately. The process (thread) that JVM uses to
manage dereferenced objects is called garbage collection.

Oracle10g: Java Programming 1-13


Benefits of Just-In-Time (JIT) Compilers

JIT compilers:
• Improve performance
• Are useful if the same bytecodes are executed
repeatedly
• Translate bytecodes to native instruction
• Optimize repetitive code, such as loops
• Use Java HotSpot VM for better performance and
reliability

1-14 Copyright © 2004, Oracle. All rights reserved.

Just-In-Time (JIT) Compilers


JVMs translate Java bytecodes into native machine instructions. What happens if the same code
is executed again, later in the program? In an environment without JIT compilers, the code is
interpreted every time it is encountered, even if it has already been interpreted earlier in the
program.
The compilers are designed to easily translate bytecode into machine code, which is optimized to
run on the target platform.
Benefits of Just-In-Time Compilers
Most JVMs now support JIT compilation. JIT compilers translate bytecodes only the first time
that they are encountered; if the same code is executed later, then it is automatically mapped to
the corresponding native machine instruction.
JIT compilers enable Java programs to run more quickly because they obviate the need for
repeated translation of bytecodes to native machine instructions. This is especially effective in
repetitive code, such as loops or recursive functions. Some JIT compilers are intelligent enough
to optimize groups of related bytecodes into more efficient native machine instructions.

Oracle10g: Java Programming 1-14


Just-In-Time (JIT) Compilers (continued)
Java HotSpot
The Java HotSpot virtual machine (VM) is a key component in maximizing the deployment of
enterprise applications. It is a core component of Java 2, Standard Edition (J2SE) software,
which is supported by leading application vendors and technologies. Java HotSpot VM supports
virtually all aspects of development, deployment, and management of corporate applications.

Oracle10g: Java Programming 1-15


Implementing Security
in the Java Environment

Language and compiler

Class loader

Bytecode verifier

Interface-specific access

1-16 Copyright © 2004, Oracle. All rights reserved.

Java Security Layers


Language and Compiler
The Java language was designed to be a safe language. The constructs that allow direct
manipulation of memory pointers have been eliminated, thereby reducing or even eliminating
run-time program crashes and, as a consequence, memory leaks.
Class Loader
The class loader ensures that each class coming from a local source (built-ins) and the classes
from each network source are stored separately. During execution, the run-time system first
looks up the built-ins for referenced classes; if they are not found, then it consults the referencing
class. This ensures that built-in classes are not overridden by network-loaded classes. This
prevents “spoofing,” or overriding the expected and trusted behavior of a built-in class. Inside a
JVM, there can be several classloaders controlling each applications namespace.

Oracle10g: Java Programming 1-16


Java Security Layers (continued)
Bytecode Verifier
During the execution of a Java program, JVM can import code from anywhere. Java must make
sure that the imported code is from a trustworthy source. To accomplish this task, the run-time
system performs a series of checks called bytecode verification.
Interface-Specific Access
Built-in classes and methods control access to the local file system and network resources. These
classes are restrictive by default. If imported code tries to access the local file system, then the
security mechanism prompts the user.

Oracle10g: Java Programming 1-17


Deployment of Java Applications

• Client-side deployment:
– JVM runs stand-alone applications from the
command line.
– Classes load from a local disk, eliminating the need
to load classes over a network.
• Server-side deployment:
– Serves multiple clients from a single source
– Is compatible with a multitier model for Internet
computing.

1-18 Copyright © 2004, Oracle. All rights reserved.

Java Applications
Java originally gained popular acceptance because of the success of its applets. Today, however,
it is also possible to write stand-alone applications in Java. A Java application is invoked by
using a JVM and is not run from within a browser.
Client-Side Deployment
Java applications can be deployed to run stand-alone applications within a local operating
system, from the command line. For example, Java applications can access the local file system
or establish connections with other machines on the network.
Server-Side Deployment
Java applications can also execute on the server machine, as long as a JVM is available on that
platform. The use of server-side Java applications is compatible with the multitier model for
Internet computing.

Oracle10g: Java Programming 1-18


Using Java with Oracle 10g

Web Application
Client server server Data
Business
Presentation
logic

Oracle
database
Oracle
Application Server

1-19 Copyright © 2004, Oracle. All rights reserved.

Java and Oracle 10g


Oracle 10g is a complete and integrated platform, which supports all the server-side
requirements for Java applications. Oracle 10g comprises the following:
Oracle Database 10g
In addition to its database management features, the Oracle Database (currently, version 10g)
provides support for a variety of Java-based structures including Java components and Java
stored procedures. These Java structures are executed in the database by its built-in Java Virtual
Machine, called the Enterprise Java Engine (EJE).
Oracle Application Server 10g
The Oracle Application Server 10g maintains and executes all your application logic, including
Enterprise JavaBeans, through its own built-in JVM. Oracle Application Server 10g uses the
OC4J J2EE server to execute servlets and JSPs. Oracle Application Server 10g Enterprise
Manager is the tool that is used to manage and distribute applications, for ease of use.
Instructor Note
For more architectural information about Oracle Application Server 10g, direct students to the
various eClasses that are available on the Oracle Learning Network.

Oracle10g: Java Programming 1-19


Java Software Development Kit

Sun Java J2SE (known as JDK and Java SDK)


provides:
• Compiler (javac)
• Core class library
– classes.zip
– rt.jar
• Debugger (jdb)
• Bytecode interpreter: The JVM (java)
• Documentation generator (javadoc) J2SE
• Java Archive utility (jar)
• Others

1-20 Copyright © 2004, Oracle. All rights reserved.

Java Software Development Kit


Sun provides the Java 2, Standard Edition (J2SE), which is also known as Java Software
Development Kit (Java SDK) or the Java Development Kit (JDK). The components that are
provided by the J2SE include the following:
• The Java compiler is javac. It compiles Java source code into Java bytecodes.
• The Java bytecode interpreter, java, is the engine that runs Java applications.
• The program that generates documentation in HTML from Java source code comments is
javadoc.
Core Class Library
The J2SE provides core Java class in the following class library files:
• classes.zip located in the jdk_home\lib for JDK 1.1.x or earlier
• rt.jar located in the jdk_home\jre\lib for Java SDK 1.2.x or later
Other Java J2SE Tools
• jdb is the Java class debugger. It is similar to the dbx or gdb debuggers on UNIX.
• jar is used to create Java Archive (JAR) files, which are zipped Java programs.
• javah is used to generate C files for native methods.
• javakey supports the generation of certification keys for trusted Java code.
• javap is used to disassemble Java bytecodes into human-readable format.
• native2ascii converts Java source code to Latin 1 characters.
• serialver is used to generate version numbers for classes.
Oracle10g: Java Programming 1-20
Using the Appropriate Development Kit

Java2 comes in three sizes:


• J2ME (Micro Edition): Version specifically targeted
at the consumer space
• J2SE (Standard Edition): Complete ground-up
development environment for the Internet
• J2EE (Enterprise Edition): Everything in the J2SE
plus an application server and prototyping tools

1-21 Copyright © 2004, Oracle. All rights reserved.

A Size for Every Need


Java 2, Micro Edition
The technology that Java 2, Micro Edition (J2ME) uses covers the range of extremely tiny
commodities, such as smart cards or a pager, all the way up to the set-top box, which is an
appliance that is almost as powerful as a computer. Like the other editions, the J2ME platform
maintains the qualities for which Java technology has become famous.
Java 2, Standard Edition
The J2SE technology has revolutionized computing with the introduction of a stable, secure, and
feature-complete development and deployment environment that is designed from the ground up
for the Web. It provides cross-platform compatibility, safe network delivery, and smart card to
supercomputer scalability. It provides software developers with a platform for rapid application
development.
Java 2, Enterprise Edition
The J2EE platform is intended as a proof of concept, and a guide for implementations in the
application server marketplace. The J2EE SDK includes a J2EE application server and various
tools to help developers prototype J2EE applications.

Oracle10g: Java Programming 1-21


Integrated Development Environment

Development Debug

UML Exchange

ADF Database

XML Synchronized changes HTML

SCM Deployment

1-22 Copyright © 2004, Oracle. All rights reserved.

Integrated Development Environment


The add-in API architecture of Integrated Development Environment (IDE) means that all the
tool components (for example, navigator, editor, and modeller) share memory models and event
systems. In this way, an update in one tool is notified to another tool so that it can refresh its
image or take other appropriate actions.
In Oracle 10g, the JDeveloper IDE was developed in pure Java. Synchronization between model
and code can be set so that you can decide to work by using one or the other user interface.
Customizable Environment
You can customize the JDeveloper Integrated Development Environment and arrange its look to
better suit your project needs and programming style. To suit the IDE to your individual taste,
you can:
• Change the look and feel of the IDE
• Create and manipulate custom navigators
• Customize the Component Palette
• Customize the IDE environment
• Select JDeveloper’s embedded J2EE server
• Arrange the windows in the IDE

Oracle10g: Java Programming 1-22


Exploring the JDeveloper Environment

Component Palette

System Navigator Code Editor Property Inspector

1-23 Copyright © 2004, Oracle. All rights reserved.

The Oracle JDeveloper 10g Environment


JDeveloper contains four major user interface components. These components are what you use
to edit code, design and manage the user interface, and navigate around your program.
Component Palette
Properties are attributes that define how a component appears and responds at run time. In
JDeveloper, you set a component’s initial properties during design time, and your code can
change those properties at run time.
System Navigator
System Navigator is made up of two components. The Navigator pane shows a list of files or
classes in a project. The files may be Java source files, .class files, graphics files, HTML,
XML documents, and so on. The Structure pane lists all the methods, fields, and graphical user
interface (GUI) components in a selected class.
Code Editor
Editors are where most of the work takes place; this is where you write code and design user
interfaces. Open an editor by double-clicking the item you want to edit or view.
Property Inspector
Property Inspector is the window that shows the properties and events associated with a selected
component in the design region of a viewer.
Oracle10g: Java Programming 1-23
Oracle10g Products

1-24 Copyright © 2004, Oracle. All rights reserved.

Oracle 10g Products


Oracle Database 10g
The Oracle Database manages all your information: Word documents, Excel spreadsheets, XML,
images, and so on. Oracle Development Suite 10g tools can automatically reuse the database
structure and its integrity constraints, which reduces the amount of manual coding.
Oracle Application Server 10g
The Oracle Application Server 10g runs all your applications: J2EE applications, Forms,
wireless, portals, and business intelligence. Using Oracle Application Server 10g, all applications
that are developed with Oracle Development Suite 10g can be deployed and managed in a single
application server.
Oracle Developer Suite 10g
Oracle Developer Suite 10g leverages the infrastructure that is offered by Oracle Application
Server 10g and Oracle Database 10g enabling developers to build scalable, secure, and reliable
e-business applications quickly and easily. The suite provides a complete and highly productive
development environment for building applications. Oracle JDeveloper 10g is now available as a
separate product and not just as part of the developer suite product.

Oracle10g: Java Programming 1-24


Summary

In this lesson, you should have learned the following:


• Java code is compiled into platform-independent
bytecodes.
• Bytecodes are interpreted by JVM.
• Java applications can be stand-alone or
implemented across an Internet-computing model.

1-25 Copyright © 2004, Oracle. All rights reserved.

Oracle10g: Java Programming 1-25


Defining Object-Oriented Principles

Copyright © 2004, Oracle. All rights reserved.


Objectives

After completing this lesson, you should be able to do


the following:
• Define objects and explain how they are used
• Associate objects so that they can communicate
and interact via messages
• Define classes and explain how they are used
• Describe object-oriented (OO) principles: classes,
objects, and methods
• Describe the value of Reusable Software
Components
• Examine the OO model that is used in this course

2-2 Copyright © 2004, Oracle. All rights reserved.


Full Notes Page

2-3 Copyright © 2004, Oracle. All rights reserved.


What Is Modeling?

• Models perform the following functions:


– Describe exactly what the business needs
– Facilitate discussion
– Prevent mistakes
• Modeling and implementation are treated
separately.
• Before coding can begin, the model must be
correct.

2-4 Copyright © 2004, Oracle. All rights reserved.


What Are Classes and Objects?

• A class:
– Models an abstraction of objects
– Defines the attributes and behaviors of
objects
– Is the blueprint that defines an object
• An object:
– Is stamped out of the class mold
– Is a single instance of a class
– Retains the structure and behavior
of a class

2-5 Copyright © 2004, Oracle. All rights reserved.


An Object’s Attributes Maintain Its State

• Objects have knowledge about their current state.


• Each piece of knowledge is called an attribute.
– The values of attributes dictate the objects’ state.

Object: My blue pen Attribute: Ink amount

Object: Acme Bank ATM Attribute: Cash available

2-6 Copyright © 2004, Oracle. All rights reserved.


2-7 Copyright © 2004, Oracle. All rights reserved.
Objects Have Behavior

• An object exists to provide behavior (functionality)


to the system.
• Each distinct behavior is called an operation.

Object: My blue pen Operation: Write

Object: Acme Bank ATM Operation: Withdraw

2-8 Copyright © 2004, Oracle. All rights reserved.


Objects Are Modeled as Abstractions

• A Java object is modeled as an abstract


representation of a real-world object.
• Model only those attributes and operations that
are relevant to the context of the problem.
Context: Product catalog
Real-world attributes/operations that you may want to model:
• Attributes: Model, manufacturer, price
• Operations: Change price

Real-world attributes/operations that you may not want to model:


• Attributes: Ink color
• Operations: Refill, change color, point, write

2-9 Copyright © 2004, Oracle. All rights reserved.


2-10 Copyright © 2004, Oracle. All rights reserved.
Defining Object Composition

• Objects can be composed of other objects.


• Objects can be part of other objects.
• This relationship between objects is known as
aggregation.

A PC may be A PC may have a A PC may have a


an object. keyboard, mouse, and CD drive, which
network card, all of which may be an object.
may be objects.

2-11 Copyright © 2004, Oracle. All rights reserved.


2-12 Copyright © 2004, Oracle. All rights reserved.
The Donut Diagram

getName

getAge()
setBirthdate name getAge Message
address
birthdate

Client or
getAddress setAddress sender

Person

2-13 Copyright © 2004, Oracle. All rights reserved.


Guided Practice:
Spot the Operations and Attributes

2-14 Copyright © 2004, Oracle. All rights reserved.


Collaborating Objects

Collaborating objects work together to complete a task


and form the basis of an application system.
• All methods are defined within a class and are not
defined globally as in traditional languages.
• All objects are created from classes and contain
all the attributes and methods of that class.
• Objects must associate with each other to
collaborate on common tasks.
• Associated objects communicate by sending
messages.

2-15 Copyright © 2004, Oracle. All rights reserved.


Objects Interact Through Messages

• Objects communicate by sending messages.


• A sending object must be associated with or
linked to the receiving object.
• The message sender requests the receiver to
perform the operation that is named in the
message.
• This communication is similar to calling a
procedure:
– The sender calls a method of the receiver.
– The receiver executes the called method.
• Calling a method is always in the context of a
particular object:
– myPen.write( ): Object-oriented programming
– write (myPen): Traditional structured
programming

2-16 Copyright © 2004, Oracle. All rights reserved.


What Is a Class?

• A class is a template for objects.


• A class definition specifies the operations and
attributes for all instances of that class.
• A class is used to manage complexity.

When you create my blue pen, you do not have to


specify its operations or attributes. You simply
say what class it belongs to.

2-17 Copyright © 2004, Oracle. All rights reserved.


How Do You Identify a Class?

• Identify the common behavior and structure for a


group of objects.
• Recognize a single coherent concept.
• Caution: A common misconception is the use of
the words classes and objects interchangeably.
Classes define objects.

My blue pen ops: write, refill


attribs: ink amount, color of ink

Your blue pen ops: write, refill


attribs: ink amount

2-18 Copyright © 2004, Oracle. All rights reserved.


Comparing Classes and Objects

• Classes are static definitions that you can use to


understand all the objects of that class.
• Objects are the dynamic entities that exist in the
real world and your simulation of it.
• Caution: OO people almost always use the words
classes and objects interchangeably; you must
understand the context to differentiate between
the two meanings.

2-19 Copyright © 2004, Oracle. All rights reserved.


2-20 Copyright © 2004, Oracle. All rights reserved.
What Is Encapsulation?

Encapsulation hides the internal structure and


operations of an object behind an interface.
• A bank ATM is an object that gives its users cash.
– The ATM hides (encapsulates) the actual operation
of withdrawal from the user.
– The interface (way to operate the ATM) is provided
by the keyboard functions, screen, cash dispenser,
and so on.
– Bypassing the encapsulation is bank robbery.
• Bypassing encapsulation in object-oriented
programming is impossible.

2-21 Copyright © 2004, Oracle. All rights reserved.


What Is Inheritance?

• There may be a commonality between different


classes.
• Define the common properties in a superclass.

Savings account Account Checking account

• The subclasses use inheritance to include those


properties.

2-22 Copyright © 2004, Oracle. All rights reserved.


Using the “Is-a-Kind-of” Relationship

• A subclass object
“is-a-kind-of”
superclass
object.
Account Pen
• A subclass must
have all the
attributes and
behaviors of the
superclass.

Savings account Pencil

2-23 Copyright © 2004, Oracle. All rights reserved.


What Is Polymorphism?

Polymorphism refers to:


• Many forms of the same operation
• The ability to request an operation with the same
meaning to different objects. However, each object
implements the operation in a unique way.
• The principles of inheritance and object
substitution.

Load passengers

2-24 Copyright © 2004, Oracle. All rights reserved.


2-25 Copyright © 2004, Oracle. All rights reserved.
Architecture Rules for Reuse

Write code that contains:


• Events that can interact with your Java application
• Properties that can be exposed
• Methods that can be invoked
Write code that supports:
• Introspection or reflection
• Customization
• Persistence

2-26 Copyright © 2004, Oracle. All rights reserved.


Engineering for a Black Box Environment

JavaBeans follow the black box approach which


enables you to:
• Simplify something of arbitrary complexity down
to a single object that everyone can understand
• Think of large systems as a collection of
interconnected entities (black boxes)
communicating via their interfaces

2-27 Copyright © 2004, Oracle. All rights reserved.


Order Entry UML Diagram

2-28 Copyright © 2004, Oracle. All rights reserved.


Summary

In this lesson, you should have learned the following:


• An object is an abstraction of a real-world object.
• A class is a template or blueprint for objects.
• Classes form inheritance trees: Operations that
are defined in one class are inherited by all
subclasses.
• Polymorphism frees the caller from knowing the
class of the receiving object.

2-29 Copyright © 2004, Oracle. All rights reserved.


Practice 2: Overview

This practice covers:


• Identifying business objects for the Order Entry
system
• Identifying methods for the classes
• Identifying attributes for the classes
• Searching for inheritance in the classes
• Examining UML class model for course
application

2-30 Copyright © 2004, Oracle. All rights reserved.


Practice 2: Notes

2-31 Copyright © 2004, Oracle. All rights reserved.


Practice 2: Notes

2-32 Copyright © 2004, Oracle. All rights reserved.


Order Entry System
Partial UML Class Model
Order
Customer OrderItem
id: int
name: String orderDate: Date lineNo: int
address: String shipDate: Date quantity: int
phone: double shipMode: String price: double
getName() orderTotal: double
setName() getQuantity()
setAddress() addItem() setQuantity()
getAddress() removeItem() setPrice()
: setOrderDate() getPrice()
getOrderDate() getItemTotal()
setShipDate() :
:

Product
Company Individual id: int
name: String
contact: String description: String
discount: int licNumber: String
retailPrice: double
getContact() setLicNumber()
getPrice()
setContact() getLicNumber()
:
: :

2-33 Copyright © 2004, Oracle. All rights reserved.


2-34 Copyright © 2004, Oracle. All rights reserved.
Basic Java Syntax and Coding
Conventions

Copyright © 2004, Oracle. All rights reserved.

Schedule: Timing Topic


60 minutes Lecture
45 minutes Practice
105 minutes Total
Objectives

After completing this lesson, you should be able to do


the following:
• Identify the key components of the Java language
• Identify the three top-level constructs in a Java
program
• Identify and describe Java packages
• Describe basic language syntax and identify Java
keywords
• Identify the basic constructs of a Java program
• Compile and run a Java application
• Examine the JavaBean architecture as an example
of standard coding practices
• Use the CLASSPATH variable and understand its
importance during compile and run time.

3-2 Copyright © 2004, Oracle. All rights reserved.

Lesson Aim
This lesson introduces the basic constructs of the Java language. You learn conventions,
standards (that is, capitalization, spacing, and so on), compiling, and running applications.
You become familiar with the basic language constructs so that you can recognize and
manipulate them with or without using Oracle JDeveloper. The lesson explores JavaBeans as
an example of good coding practices.

Oracle10g: Java Programming 3-2


Lesson Aim (continued)
Overview
Java Components
The Java environment is made up of a run-time engine, documentation tools, debugging
utilities, and predefined classes and methods that are designed to decrease development time.
Conventions
When programming in Java, you must use established naming, capitalization, indenting, and
commenting conventions.
Classes, Objects, and Methods
In Java, almost everything is an object. Objects are created from blueprints called classes. The
objects contain attributes (data) that can be accessed by functions that are contained within the
object. Functions that act on the data are called methods.
Using Javadoc
Javadoc is a facility that is provided within J2SE and produces HTML documentation from
your program. It reads the source code and parses specially formatted and positioned
comments into documentation.
Compiling and Running Java
Java is an interpretive language, which means that the code is interpreted to machine code
only at run time. This is what makes the “write once, run anywhere” (WORA) concept work.
There are several steps in the process of interpreting program source code into a running
program. Java code is first compiled into bytecodes by the Java compiler. Bytecodes are
interpretable, intermediate representation of the Java program. The resulting bytecodes are
interpreted and converted into machine-specific instructions by the Java Virtual Machine
(JVM) at run time.
Security Concerns
Using the jad.exe, you can make the code so confused or opaque as to be difficult to
perceive or understand. Obfuscation of your code can make field debugging more difficult.
For example, stack traces are often very useful in isolating bugs. After compression or
obfuscation by one of these tools, however, the stack trace may no longer contain the original
method names. In general, refrain from using obfuscation, unless you really want to make it
difficult to modify your code.

Oracle10g: Java Programming 3-3


Examining Toolkit Components

The J2SE/J2EE from Sun provides:


• Compiler
• Bytecode interpreter
• Documentation generator

J2SE

3-4 Copyright © 2004, Oracle. All rights reserved.

Examining Toolkit Components


Sun J2SE Components
• The Java compiler is javac; it compiles Java source code into Java bytecodes.
• The Java bytecode interpreter is the engine that runs Java applications.
• The program that generates documentation in HTML from Java source code comments
is javadoc.
Other J2SE Tools
• jdb : Used as a Java class debugger and it is similar to the dbx or gdb debuggers on
UNIX
• jar : Used to create Java Archive (JAR) files, which are zipped Java programs
• javah : Used to generate C files for native methods
• javakey : Provides support for generating certification keys for trusted Java code
• javap : Used to disassemble Java bytecodes into human-readable format
• native2ascii : Used to convert Java source code to Latin 1 characters

Oracle10g: Java Programming 3-4


Exploring Packages in J2SE/J2EE

The J2SE/J2EE from Sun provides standard packages


for:
• Language
• Windowing
• Input/output
• Network communication

J2SE

3-5 Copyright © 2004, Oracle. All rights reserved.

Java Packages
The Java language includes a series of classes that are organized into packages, depending on
functional groups. For example, there is a set of classes that helps create and use network
connections; these classes are contained in the java.net package. The basic package for
the Java language is named classes.zip in 1.1.x and is renamed rt.jar since 1.2.x.
Standard Java Packages
These packages contain the classes that form the foundation for all Java applications.
Built-in Classes That Are Distributed with Java Language
• java.lang: Basic language functions
• javax.swing: Parent package to all Swing-related packages
• java.util: Facility supporting interfacing, implementing, sorting, and searching on
collections
• java.awt: Utility to managing layout, handling events, and rendering graphics for
AWT
• java.io: General interface for all I/O operations

Oracle10g: Java Programming 3-5


Documenting Using the J2SE

The J2SE/J2EE from Sun provides documentation


support for:
• Comments
– Implementation
– Documentation
• Documentation generator

J2SE

3-6 Copyright © 2004, Oracle. All rights reserved.

Documentation
There are two types of documentation methods in Java that you can specify in your source
code. One is for the internal documentation, and the other is for external documentation.
Comments
• Implementation comments are included in the source code. They are useful for
programmers who are examining the code. When writing implementation comments,
you must explain the code and any special processes that may need detailed
explanations. Use:
- // to start comments up to the end of the line
- /* to start comments across multiple lines, and end with */
• Documentation comments are created using javadoc. Javadoc is a utility that is provided
with J2SE and that creates an HTML document from the documentation comments in
Java source code. You can use the javadoc utility to document classes and methods, so
that they can be better understood when used by other programmers. Use:
- /** to start documentation comments across multiple lines, and end with */
Documentation Generator
Javadoc is a documentation generator that is part of J2SE.

Oracle10g: Java Programming 3-6


Contents of a Java Source

• A Java source file can contain three top-level


constructs:
– Only one package keyword followed by the package
name, per file
– Zero or more import statements followed by fully
qualified class names or “*” qualified by a package
name
– One or more class or interface definitions
followed by a name and block
• File name must have the same name as the public
class or public interface.

3-7 Copyright © 2004, Oracle. All rights reserved.

RentalItem.java
package practice16; // collection of classes of similar
functionality
import java.util.*; // import for Date class
public class RentalItem {
private InventoryItem inventoryItem;
private String dueDate;
private Date dateReturned;
public RentalItem(int aInventoryItemId) {
try {
inventoryItem =
DataMan.fetchInventoryItemById(aInventoryItemId);
}
catch (ItemNotFound e2) {
System.out.println("Invalid Item ID");
}
dueDate = calcDueDate();
} // end constructor

Oracle10g: Java Programming 3-7


Establishing Naming Conventions

Naming conventions include:


• Class names
– Customer, RentalItem, InventoryItem
• File names
– Customer.java, RentalItem.java
• Method names
– getCustomerName(), setRentalItemPrice()
• Package names
– oracle.xml.xsql, java.awt, java.io

3-8 Copyright © 2004, Oracle. All rights reserved.

Naming Conventions
File Names
Java source code is stored in files with the .java extension. Use the name of the class held
within the file as the file name. Remember that Java is case sensitive, and the names must
match exactly, including case. Compiled Java code, or bytecodes, is stored in files with the
.class extension.
The name of the Java source file must be the name of the public class in the file; otherwise,
the code will not compile. You may have source code for more than one class in the file, but
only one can be public, and the file name must be the same name as the public class.
Class Names
Use descriptive nouns or noun phrases for class names. Capitalize the first letter of each word
in the class name, including the first word (for example, MyFirstClassName).

Oracle10g: Java Programming 3-8


Naming Conventions (continued)
Method Names
Use verbs or verb clauses for method names. Make the first letter of the method name
lowercase with the first letter of each internal word capitalized (for example,
getSomeInformation() ).
Packages
The Java documentation states that package names must nearly always be in lowercase, and
resemble a reverse notation of a “Domain name.” For example, when Oracle Corporation
develops class libraries, package names begin with “oracle.” followed by a descriptive
name. The naming convention ensures that a package name is unique to avoid clashing when
using APIs from multiple vendors in the same application.

Oracle10g: Java Programming 3-9


More About Naming Conventions

• Variables:
– customerName, customerCreditLimit
• Constants:
– MIN_WIDTH, MAX_NUMBER_OF_ITEMS
• Uppercase and lowercase characters
• Numerics and special characters

3-10 Copyright © 2004, Oracle. All rights reserved.

Naming Conventions (continued)


Variables
Use short, meaningful names for variables. Use mixed-case letters with the first letter
lowercase and begin all internal words with uppercase letters (for example, int
squareFootage). Choose names that indicate the intended use of the variable. Avoid using
single-character variable names except for temporary variables. Common names for
temporary variables are c, d, and e for character fields and i, j, k, m, and n for integers.
String customerName; // string variable
int customerCreditLimit; // integer variable
Constants
Declare constants with descriptive names in all uppercase. Separate internal words with
underscores (for example, int MIN_WIDTH).

Oracle10g: Java Programming 3-10


Naming Conventions (continued)
Uppercase and Lowercase
Java is case sensitive. You must adopt and follow a strict capitalization scheme. The scheme
that is presented above is a generally accepted practice.
Numerics and Special Characters
Numbers, underscores, and dollar signs may be used for names in addition to uppercase and
lowercase letters. The only syntactic restriction is that identifiers must not begin with a
number. This rule prevents them from being confused with numeric literals. Underscores are
not generally used except for private and local variables.

Oracle10g: Java Programming 3-11


Defining a Class

Class definitions typically include:


• Access modifier
• Class keyword
• Instance fields
• Constructors
• Instance methods
• Class fields
• Class methods

3-12 Copyright © 2004, Oracle. All rights reserved.

Class Definition
A class is an encapsulated collection of data and methods to operate on the data. A class
definition, data and methods, serves as a blueprint that is used in the creation of new objects
of that class.
A class definition typically consists of:
• Access modifier: Specifies the availability of the class from other classes
• Class keyword: Indicates to Java that the following code block defines a class
• Instance fields: Contain variables and constants that are used by objects of the class
• Constructors: Are methods having the same name as the class, which are used to
control the initial state of any class object that is created
• Instance methods: Define the functions that can act upon data in this class
• Class fields: Contain variables and constants that belong to the class and are shared by
all objects of that class
• Class methods: Are methods that are used to control the values of class fields
The order of the fields, constructors, and methods does not matter in Java. Ordering the parts
of a Java program consistently will, however, make your code easier to use, debug, and share.
The order listed in the slide is generally accepted.

Oracle10g: Java Programming 3-12


Rental Class: Example

Access modifier

public class Rental { Declaration


//Class variable
static int lateFee;
// Instance variables Instance
int rentalId; variable
String rentalDate;
float rentalAmountDue;

// Instance methods Instance
float getAmountDue (int rentId) { method

}

}

3-13 Copyright © 2004, Oracle. All rights reserved.

Rental Class: Example


This slide shows the syntax of a class definition. Every Java program needs at least one class
definition, even if the class contains only a static main() method.
The First Line
The class definition usually starts with the public access modifier. If you omit the public
modifier, then the class is visible only to other classes within the same package. The access
modifier is followed by the class keyword, followed by the class body enclosed in braces.
Instance Variables
The class body contains declarations of instance variables and instance methods. Instance
variables constitute the state of an object. Instance variables are usually declared private;
if no access level is specified, then they can be accessed by any class in the same package.

Oracle10g: Java Programming 3-13


Rental Class: Example (continued)
Instance Methods
Instance methods define the operations that can be performed on objects of this class type.
Each instance method has a name, an optional list of arguments, and a return type. If no
access level is specified, then instance methods can be accessed by any class in the same
package.
Class Variables and Class Methods
Class fields and class methods are defined by using the static keyword.

Oracle10g: Java Programming 3-14


Creating Code Blocks

• Enclose all class declarations.


• Enclose all method declarations.
• Group other related code segments.

public class SayHello {


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

3-15 Copyright © 2004, Oracle. All rights reserved.

Code Blocks
Enclose class declarations within braces { }. The class declaration contains variables,
constants, and methods. The class body must begin on a new line following the class
declaration and the opening brace. Indicate the end of the class declaration by a single closing
brace on a new line. There is another coding convention, which puts the opening brace on the
next line even with the closing brace from the previous statement.
Method declarations follow the same form with the opening brace on the same line as the
method definition and the closing brace on a new line. All statements and declarations within
the braces are part of the method.
You can also group code segments within a method declaration by using braces. Grouping
enhances the readability of your code. The easier it is to read and follow your code, the easier
it will be to debug and reuse.
Variables that are defined within a code block are available during the execution of that code
block and are discarded at the completion of execution.
main() Method
The interpreter looks for a specific method to start the program, and that method is called
main(). It is simply the starting place for the interpreter to begin. Only one class will need to
have a main method to get things started. You only need a main method for an application. If
you are writing an applet, then the main method is not needed, because the browser has its
own way to start or bootstrap the program.
Oracle10g: Java Programming 3-15
Defining Java Methods

• Always define within a class.


• Specify:
– Access modifier
– Static keyword
– Arguments
– Return type

[access-modifiers] [static] "return-type"


"method-name" ([arguments]) {
"java code block“ … }
return

3-16 Copyright © 2004, Oracle. All rights reserved.

Method Definition
When you define a class for an object-oriented program, you implement all the behavior of
that class in one or more methods. A Java method is equivalent to a function, procedure, or
subroutine in other languages, except that it must be defined within a class definition.
Methods consist of the following:
• Access modifier: You can specify a method as either public, private, or protected.
Public methods can be known and used by external users, whereas private methods can
be seen or used only by methods within the class. Protected methods are accessible from
any class that extends or inherits from the class.
• Static keyword: Variables and methods are usually accessed for a particular object. If
the method or variable is defined with the static keyword, then it becomes a class
method or variable, which means that it applies to the class of objects as a whole and not
as individual objects. Static variables are shared by all objects of that class.
• Arguments: The arguments that are listed for a method are those parameters that are
required for the method to perform its function.
• Return type: A return type is required for all method definitions. There is no default
return type in Java. The return type specifies the object type that will be returned when
the method has completed its task. It can be an integer, a string, any defined object type,
or void.

Oracle10g: Java Programming 3-16


Examples of a Method

public float getAmountDue (String cust){ Declaration


// method variables
int numberOfDays;
Method
float due;
variables
float lateFee = 1.50F;
String customerName;
// method body
numberOfDays = getOverDueDays(); Method
statements
due = numberOfDays * lateFee;
customerName = getCustomerName(cust);
return due; Return
}

3-17 Copyright © 2004, Oracle. All rights reserved.

Method Example
Declaration
In this example, the defined method returns a float primitive type. The method name is
declared as getAmountDue. The method name begins with a lowercase letter with the
beginning letter of each subsequent word in uppercase letters. The next item is the declaration
of the expected parameter list. The parameter list consists of the argument data type and
argument name.
Method Variables
The next set of statements defines any method-specific variables. These variables are used
only during the execution of the method and are discarded when control is passed back to the
object that called this method. The float data type is used for real numbers (numbers with
decimal points).
Method Statements
The executable body of the method comes next. This section contains the Java statements that
are used to act upon data. It can include conditional statements, data manipulation operations,
or any other valid Java statements.
Return
The return statement accomplishes two things. The return causes the execution to branch back
to the caller of the method, and then it passes back the specified value, if there is one.
Oracle10g: Java Programming 3-17
Declaring Variables

• You can declare variables anywhere in a class


block, and outside any method.
• You must declare variables before they are used
inside a method.
• It is typical to declare variables at the beginning of
a class block.
• The scope or visibility of variables is determined
in the code block.
• You must initialize method variables before using
them.
• Class and instance variables are automatically
initialized.

3-18 Copyright © 2004, Oracle. All rights reserved.

Declaring Variables
Declaration
Java requires that variables be declared before they can be accessed. Declare variables and
constants by placing each statement on a separate line, so that the code is clear and easy to
understand. You can declare multiple variables of the same type within one statement.
Scope
If variables or constants are required only within a code block, then declare them at the top of
the code block. Variables that are defined within a code block will be discarded when the
execution of the code block is complete. This is useful for temporary variables or those
needed to hold specific information during a calculation or process. After the process is
complete, they are no longer needed.
Initialization
Whenever possible, initialize variables at declaration. This provides some insight into the use
or purpose of the variable. The only reason for not initializing at declaration is if the value is
dependent on a calculation that is not yet performed.
When you declare primitive instances or class variables, they are automatically initialized to a
default value depending on their type.

Oracle10g: Java Programming 3-18


Examples of Variables
in the Context of a Method
public float getAmountDue (String cust) {
float due = 0; Method
variables
int numberOfDays = 0;
float lateFee = 1.50F;
{int tempCount = 1; // new code block
due = numberOfDays * lateFee;
tempCount++; Temporary
… variables
} // end code block
return due;
}

3-19 Copyright © 2004, Oracle. All rights reserved.

Examples of Variables in the Context of a Method


Method Variables
In this example, the numberOfDays and lateFee variables are defined at the beginning
of the method. Both of these variables are method variables; that is, they are used while the
method is being executed and are discarded at the return of execution control to the caller.
Temporary Variables
The tempCount variable is defined within a subblock of the getAmountDue method. The
tempCount variable is available only during the execution of this block of code. When the
block of code is complete, the variable is discarded, whether or not the method maintains
execution control.

Oracle10g: Java Programming 3-19


Rules for Creating Statements

• Use a semicolon to terminate statements.


• Define multiple statements within braces.
• Use braces for control statements.

3-20 Copyright © 2004, Oracle. All rights reserved.

Statements
Java statements cause some action to occur, such as setting a value, sending output, reading a
database, and so on. They always end with a semicolon. Compound statements are a list of
related statements that are contained within a set of braces. Indent the statements one level
below the enclosing statement for clarity. Place the opening brace on the line that begins the
compound statement. Place the closing brace on a separate line, indented to the correct level.
Use braces around all statements when they are part of a control (if-else) structure.
public float getAmountDue (String cust) {
float due = 0;
int numberOfDays = 0;
float lateFee = 1.50F;
If (…) { {int tempCount = 1; // new code block
due = numberOfDays * lateFee;
tempCount++; //nested compound statement
… }
// end code block
} //end if
return due;
}

Oracle10g: Java Programming 3-20


What Are JavaBeans?

A JavaBean is a platform-neutral reusable software


component that:
• Can be manipulated visually in a builder tool
• Communicates with other JavaBeans via events
• Comprises visible components that must inherit
from other visible components
• Provides an architecture for constructing the
building blocks of an application

3-21 Copyright © 2004, Oracle. All rights reserved.

About JavaBeans
A JavaBean is a reusable platform-independent software component that can be manipulated
visually in a builder tool such as JDeveloper. The JavaBean’s standard is a low-level
component model, tailored to the Java language. It does not specify the kind of component
document or application framework such as CORBA, OpenDOC, or Taligent). JavaBeans
focuses purely on the interface that a Java building block must represent.
A JavaBean consists of a single class or a group of classes. At a minimum, a bean must have a
public class declaration and a no-parameter constructor. Any classes can be part of a bean.
There is no specific superclass that a bean must extend—unlike, for example, an applet, which
must extend the Applet class. However, a JavaBean must conform to certain basic architecture
rules.
Beans are not a special type of component. A bit of Java code does not have a special “bean”
type or label that makes it a bean. A JavaBean has a set of criteria that makes it flexible and
reusable to others. It is not about, for example, different types of coffee, such as French Roast
or Columbian. Rather, it is about the packaging of the coffee meat so that it can be used as a
bean in a variety of environments (for example, used in a grinder for a beverage or covered in
chocolate as an after-dinner treat).
Instructor Note
Students will probably find that even if JavaBeans are new to them, many of the concepts and
rules that are associated with JavaBeans are familiar.

Oracle10g: Java Programming 3-21


Managing Bean Properties

• Properties are the bean class member variables.


(Variables can be primitive types or objects.)
• A property can be:
– Unbound, which is a simple property
– Bound, which triggers an event when the field is
altered
– Constrained, in which changes are accepted or
vetoed by interested listener objects

3-22 Copyright © 2004, Oracle. All rights reserved.

Properties
Properties are the bean variables. They can be of any Java data type; that is, primitives or
objects. In the context of a bean, variables or properties can have a binding that is stated as
any of the following:
• Unbound: Unbound properties are simple properties that are accessed or modified by
using the associated get and set methods.
• Bound: Bound properties are like simple properties, but when modified by using the set
method they trigger the PropertyChangeEvent event. The
PropertyChangeEvent object contains the old value and new value of the
property, so that listeners can react appropriately to the change. For example, changing
the connection property of a JClient SessionInfo object fires an event that redraws
JDeveloper’s structure pane.
• Constrained: Constrained properties are an extension to bound properties, in that they
generate a PropertyChangeEvent when the property is modified, but the listeners
handling the event can veto (prevent) the change by throwing
PropertyVetoException if the change violates some rule or constraint. For
example, resizing a visual component can be vetoed by other components based on
layout management rules. The differentiating characteristic between bound and
constrained is what occurs when their property values are altered.

Oracle10g: Java Programming 3-22


Exposing Properties and Methods

Getter Setter
private
methods T var; methods
(public) T[] arr; (public void)

T getVar() setVar(T val)


T[] getArr() setArr(T[] val)
boolean isVar() setVar(boolean val)

3-23 Copyright © 2004, Oracle. All rights reserved.

Property and Method Naming Conventions


Good naming conventions apply to the methods that an application calls to access and alter
the properties of a class. In JavaBean classes, the name of the set and get methods are
formed from the prefix get or set, followed by the uppercased name of the property or
variable that is accessed.
The properties are commonly declared private, forcing users to invoke the access methods
to interact with the bean. The following is an example of a String property and its
corresponding setter and getter methods:
private String text;
public String getText() { return text };
public void setText(String newtext) { text = newtext; }
Note: The property name starts with a lowercase letter, but the method names are setText
and getText, (using the uppercased form of the property name). The return type of the
getter method, and the single argument of the setter method must be the same type
as the property. For indexed properties, such as arrays, it is common to provide two additional
methods to get and set a value at a specified index, for example:
private String[] name;
public String[] getName() {...} ;
public void setName(String[] values) {...};
public String getName(int index) {...};
public void setName(int index, String value) {...};

Oracle10g: Java Programming 3-23


JavaBean Standards at Design Time

The benefits at design time include:


• A facilitated interaction between designer, tool,
and bean
• Instantiated and functioning beans in a visual tool
• Highly iterative development environment
• Building applications in small bits that plug in and
out
• Storage and recovery of instantiated
objects

3-24 Copyright © 2004, Oracle. All rights reserved.

Benefits of JavaBeans Standards During Design


The JavaBeans architecture makes the bean easier to use during the design phase. At design
time, the JavaBean is alive or “hot,” and exhibits all the behavior found in the deployed
application. A JavaBean displaying the time, when included in an application, will start
ticking away as soon as it has been placed into the application. The designer can see how the
application will behave, as its application is being built, rather than after compiling. This
pseudo-live functionality of JavaBeans facilitates a more iterative approach, with the
developer building small bits while getting immediate feedback. The system evolves more
easily.
For JavaBeans to be running during design time, the bean must adhere to a set of standards
and protocols that describe how they work. If the protocol is followed, a visual development
tool can interrogate the bean structure, understand its interactions, and present them to the
developer.
All instantiated objects, present at design time, are serialized with the design and, when
recovered, retain their values, making them persistent. This functionality is supported through
a tool’s Load, Save, Copy, Cut, and Paste functions.

Oracle10g: Java Programming 3-24


Compiling and Running
a Java Application

• To compile a .java file:

prompt> javac SayHello.java


… compiler output …

• To execute a .class file:

prompt> java SayHello


Hello world
prompt>

• Remember that case matters.

3-25 Copyright © 2004, Oracle. All rights reserved.

Java Development Kit (JDK) Tools


J2SE includes javac.exe and java.exe, two executables for compiling and executing a
Java program.
Compiling Java Code
Run javac.exe from the command prompt to compile .java files into .class files. For
example, to compile SayHello.java into a bytecodes file named SayHello.class,
enter the following at the command prompt:
javac SayHello.java
Running a Java Application from the Command Line
The java.exe executable loads the class, verifies the bytecodes, interprets it into machine
language, and executes the code. Start the interpreter by entering the following command at
the command prompt:
java SayHello
This starts JVM, which loads SayHello.class and tries to call its main() method. JVM
expects the SayHello.class to have a main() method, where the program execution
will start. If SayHello.class calls methods in other classes, then JVM loads these other
classes only when they are required.

Oracle10g: Java Programming 3-25


The CLASSPATH Variable

• Is defined in the operating system


• Directs the JVM and Java applications where to
find .class files
• References built-in libraries or user-defined
libraries
• Enables interpreter to search paths, and loads
built-in classes before user-defined classes
• Can be used with “javac” and “java” commands

3-26 Copyright © 2004, Oracle. All rights reserved.

Setting the CLASSPATH


If the CLASSPATH variable is not set, then a default is used. The default includes the absolute
path to the jdk1.4.2_03\bin,… \lib\, and …\classes\ directories, which house
the J2SE packages (contained in the rt.zip file). You can create a …/classes/ directory,
add your class files, and CLASSPATH will find them.
CLASSPATH examines individual class files, or those stored in .zip or .jar files. Set the
CLASSPATH variable by using the commands: setenv in UNIX (in a C-Shell), and set in
NT. Separate directories with a semicolon “;” (for example,
c:\myClasses;d:\myOtherClasses). Set CLASSPATH to include the directory
containing the .class files.
The interpreter looks for classes in the directory sequence as they are found in the
CLASSPATH variable. If the interpreter cannot find the named class in the first directory, then
it searches the second and all the others in the list.
If you want the CLASSPATH to point to class files that belong to a package, then you must
specify a path name that includes the path to the directory one level above the directory that
has the name of your package.
You can override the CLASSPATH setting in the javac and java commands, by using the
“–classpath” option.

Oracle10g: Java Programming 3-26


CLASSPATH: Example
Location of .class files in the oe package

Setting CLASSPATH
C:\>set CLASSPATH=D:labs\les03\classes\oe

3-27 Copyright © 2004, Oracle. All rights reserved.

Oracle10g: Java Programming 3-27


Summary

In this lesson, you should have learned the following:


• J2SE provides basic Java tools.
• J2SE provides a rich set of predefined classes and
methods.
• Java programs are made up of classes, objects,
and methods.
• Adhering to programming standards makes code
easier to read and reuse.

3-28 Copyright © 2004, Oracle. All rights reserved.

Oracle10g: Java Programming 3-28


Practice 3: Overview

This practice covers:


• Examining the Java environment
• Writing and running a simple Java application
• Examining the course solution application
• Inspecting classes, methods, and variables
• Creating class files and an application class with a
main( ) method
• Compiling and running an application

3-29 Copyright © 2004, Oracle. All rights reserved.

Practice 3: Overview
Note: If you close a DOS window or change the location of the .class files, then you must
modify the CLASSPATH variable.
The practices in lessons 3, 4, and 5 are written to help you better understand the syntax and
structure of the Java language. Their sole purpose is to instruct and is not intended to reflect
any set of application development best practices.
The purpose of the practices from lesson 6 to the end of the course, is different. Starting in
lesson 6, you use JDeveloper to build an application employing techniques you will use
during real-world development. The practices continue to support the technical material
presented in the lesson, while incorporating some best practices that you will use while
developing a Java application.

Oracle10g: Java Programming 3-29


Practice 3-1: Introducing the Java and Oracle Platforms
Goal
The goal of this practice is to use the Java Development Kit and examine the development
environment. You write, compile, and run a simple Java application.
Note: If you close a DOS window or change the location of the .class files, then you must
set the CLASSPATH variable again.
The practices in lessons 3, 4, and 5 are written to help you better understand the syntax and
structure of the Java language. Their sole purpose is to instruct and is not intended to reflect
any set of application development best practices.
Edit and Run a Simple Java Application
1. Open a DOS window and navigate to the E:\labs\temp directory and create a file
called HelloWorld.java by using Notepad with the following commands:
E:
cd \labs\temp
notepad HelloWorld.java

2. In Notepad, enter the following code, placing your name in the comments (after the
double slashes). Also, make sure that the case of the code text after the
comments is preserved, because Java is case sensitive:
// File: HelloWorld.java
// Author: <Enter Your Name>
public class HelloWorld {
public static void main(String[] args)
{
System.out.println("Hello World!");
}
}

3. Save the file to the E:\labs\temp directory, using the File > Save menu option, but
keep Notepad running, in case compilation errors occur requiring you to edit the source
to make corrections.

4. Compile the HelloWorld.java file (file name capitalization is important)


a. In the DOS window, ensure that the current directory is E:\labs\temp.
b. Check whether the Java source file is saved to disk.
(Hint: Type the command dir Hello*. )
c. Compile the file by using the command: javac HelloWorld.java
d. Name the file that is created if you successfully compiled the code.
(Hint: Type the command dir Hello*. )

Oracle10g: Java Programming 3-30


Practice 3-1: Introducing the Java and Oracle Platforms (continued)
5. Run the HelloWorld application (again capitalization is important).
a. Run the file by using the command: java HelloWorld
b. What was displayed in the DOS window?

6. Modify the CLASSPATH session variable to use the directory where the .class file is
stored. In the DOS window, use the set CLASSPATH=E:\labs\temp command to
set the variable. The variable will be set for the duration of the DOS session. If you open
another DOS window, you must set the CLASSPATH variable, again.

7. Again, run the HelloWorld application (capitalization is important).


a. Run the file by using the command: java HelloWorld
b. What was displayed in the DOS window?

8. Close Notepad, but do not exit the DOS window, because you continue to work with this
environment for some time.

Oracle10g: Java Programming 3-31


Practice 3-2: Basic Java Syntax and Coding Conventions
Goal
The goal of this practice is to create, examine, and understand Java code. You create a class
representing a command-line application for the Order Entry system that contains the
application entry point in the form of a main() method.
You use the UML model from the lesson titled “Defining Object-Oriented Principles” as a
guide to creating additional class files for your application. You run some simple Java
applications, fixing any errors that occur.
Creating Order Entry Class Files (Examining the Customer Class)
Using the UML model from the lesson titled “Defining Object-Oriented Principles,” create
class files to be used in the application.
1. Copy the Customer.java file from the e:\labs directory to your
E:\labs\OrderEntry\src\oe directory.
2. In the DOS window, change your current working directory to:
E:\labs\OrderEntry\src\oe
3. Using Notepad, review the Customer class and answer these questions:
a. Name all the instance variables in Customer.
b. How many instance methods are there in Customer?
c. What is the return type of the method that sets the customer’s name?
d. What is the access modifier for the class?
4. Close the file, and at the DOS prompt compile the Customer.java file by using the
following command as a guide:
javac -d E:\labs\OrderEntry\classes Customer.java
Where is the compiled .class file created?
(Hint: Type cd ..\..\classes\oe, and then type dir.)
Incorporate the Order.java into Your Application Files
5. Add the Order.java file to your application structure, review the code and compile it.
a. In Notepad, open the \labs\Order.java file and save it to the directory for
your OE package source code (E:\labs\OrderEntry\src\oe).
b. The attributes are different from those in the UML model. The customer and item
information will be incorporated later.
c. Notice two additional attributes (getters and setters) have been added.
shipmode (String): Used to calculate shipping costs
status (String): Used to determine the order’s place in the order fulfillment
process
d. Ensure that you are in the E:\labs\OrderEntry\src\oe directory. Use the
following command to compile the Order.java file which will place the
.class file in the directory with the compiled version of the Customer class:
javac –d E:\labs\OrderEntry\classes Order.javaa

Oracle10g: Java Programming 3-32


Practice 3-2: Basic Java Syntax and Coding Conventions (continued)
Create and Compile the Application Class with a main() Method
6. Create a file called OrderEntry.java containing the main method, as shown below.
Place the source file in the same source directory as all the other java files
(E:\labs\OrderEntry\src\oe). This file is a skeleton that will be used for
launching the course application.
package oe;

public class OrderEntry {


public static void main(String[] args)
{
System.out.println("Order Entry Application");
}
}
7. Save and compile OrderEntry.java with the following command line:
javac -d E:\labs\OrderEntry\classes OrderEntry.java
8. Run the OrderEntry application.
a. Open a DOS window and use the cd command to change the directory to:
E:\labs\OrderEntry\classes
b. Run the file by using the command: java oe.OrderEntry

Oracle10g: Java Programming 3-33


Exploring Primitive Data Types
and Operators

Copyright © 2004, Oracle. All rights reserved.

Schedule: Timing Topic


50 minutes Lecture
30 minutes Practice
80 minutes Total
Objectives

After completing this lesson, you should be able to do


the following:
• Distinguish between reserved words and other
names in Java
• Describe Java primitive data types and variables
• Declare and initialize primitive variables
• Use operators to manipulate primitive variables
• Describe uses of literals and Java operators
• Identify valid operator categories and operator
precedence
• Use String object literals and the concatenation
operator
4-2 Copyright © 2004, Oracle. All rights reserved.

Lesson Aim
This lesson introduces Java’s decision-making and repetition constructs. You learn how to use
those constructs to build nonlinear applications. Java provides eight primitive data types and a
large number of operators to manipulate these types. This lesson introduces the primitive types
and describes how to use the most common operators to construct simple algorithms.

Oracle10g: Java Programming 4-2


Lesson Aim (continued)
Primitive Data Types in Java
Java is an object-oriented programming language, which means that a Java program is made up
of objects. For example, a Java program dealing with video rentals may have objects
representing the various videos and games that are available, the customers who have rented
videos, the numerous titles that are available, and so on.
If you take a look at one of these objects in more detail, however, you see that it contains
fundamental values such as whole numbers, fractions, and characters. Java provides eight
predefined data types to represent these atomic entities; the Java community calls these the
primitive types, as opposed to object types (user-defined types) that you may define yourself,
such as Customer or Title.
Declaring and Initializing Primitive Variables
Declaring primitive variables is quite straightforward. For example, to declare and initialize an
integer variable to hold the number of days that a video can be rented, you can write a statement,
such as the following:
int numOfDays = 3;
This lesson describes how to declare and initialize variables of each of the eight primitive types.

Oracle10g: Java Programming 4-3


Reserved Keywords

boolean abstract break class


byte final case extends
char native catch implements
double private continue interface
float protected default throws
int public do
long static else import
short synchronized finally package
void transient for
volatile if
instanceof
true strictfp return
new
false switch
super
null throw
this
try
while

4-4 Copyright © 2004, Oracle. All rights reserved.

Reserved Keywords in Java


All the words in this slide are keywords in the Java language. These reserved words must not be
used as variable names. There are 51 reserved words in Java2.
Additional Reserved Keywords
In addition to the keywords listed in the slide, const and goto are reserved and cannot be used
as identifiers.
Instructor Note
Do not go through the list of keywords. Briefly describe the category of keywords in each box.
Also make students aware of the reserved keywords in the notes.
Also, technically speaking, true, false, and null are literals, not keywords as such. Java2
has a new reserved keyword, strictfp. Null is not a Boolean type as in PL/SQL.
strictfp is used to allow for “double” variables to perform calculations, where the result is
larger than Double.MAX_VALUE. strictfp is equivalent to FP-strict, which allows for a
double expression to be evaluated as positive infinity (which the program prints as “Infinity”).

Oracle10g: Java Programming 4-4


Variable Types

• Eight primitive data types:


– Six numeric types
– A character type
– A Boolean type (for truth values)
• User-defined types:
– Classes ab
– Interfaces c
– Arrays

4-5 Copyright © 2004, Oracle. All rights reserved.

Variable Types
Variables are the basic storage unit in Java. A variable is a symbolic name for a chunk of
memory. Variables can be defined to hold primitive values (which are not real objects in Java) or
to hold object references. The object references that they hold can be user-defined classes or
Java-defined classes.
Primitive Data Types
A variable declaration consists of a type and a name. Consider the following example:
double balanceDue;
This statement declares a variable called balanceDue, whose type is double. double is
one of the eight primitive data types that are provided in the Java language. These types are
called primitive because they are not objects and they are built into the Java language.
Unlike similar types in other languages, such as C and C++, the size and characteristics of each
primitive data type are defined by the Java language and are consistent across all platforms.

Oracle10g: Java Programming 4-5


Variable Types (continued)
Classes, Interfaces, and Arrays
Classes, interfaces, and arrays are user-defined types with specific characteristics. After they are
defined, you can declare variables of the new type just as you declare primitive variables.
Instructor Note
Primitive types are passed by value, unlike objects. Students who are programmers already will
know the concept of “pass-by-value” versus “pass-by-reference.”

Oracle10g: Java Programming 4-6


Primitive Data Types

Floating True
Integer Character
Point False

byte
short float
char boolean
int double
long

1, 2, 3, 42 3.0F 'a' '\141' true


07 .3337F '\u0061' false
0xff 4.022E23 '\n'

0 0.0f ‘\u0000’ false

Append uppercase or lowercase “L” or “F” to the number


to specify a long or a float number.

4-7 Copyright © 2004, Oracle. All rights reserved.

Primitive Data Types


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; int is the most common integer type.
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: float and double. double is so called because it provides
double the precision of float. float uses 32 bits to store data, whereas double uses 64 bits.

Oracle10g: Java Programming 4-7


Primitive Data Types (continued)
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.
Boolean
The boolean type can hold either true or false.
If a value is not specified, a default one 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.

Oracle10g: Java Programming 4-8


What Are Variables?

• A variable is a basic unit of storage.


• Variables must be explicitly declared.
• Each variable has a type, an identifier, and a
scope.
• There are three types of variables: class, instance,
and method.

Title: “Blue
Moon”
Type
Identifier
int myAge; Initial value
boolean isAMovie;
float maxItemCost = 17.98F;

4-9 Copyright © 2004, Oracle. All rights reserved.

What Is a Variable?
A variable is a symbolic name for a chunk of memory in which a value can be stored. Because
Java is a strongly typed language, all variables must be declared before they can be used.
Variables also have a scope that determines where you can use the variable. Scope also
determines the life span of the variable. When a variable is defined within a method, the variable
is available only within the execution of the method. When the method ends, the variable is
released and is no longer accessible. When defining a variable with a local scope use braces.
Variables can also be explicitly initialized; that is, given a default value.

Oracle10g: Java Programming 4-9


Declaring Variables

• Basic form of variable declaration:


– type identifier [ = value];

public static void main(String[] args) {


int itemsRented = 1;
float itemCost;
int i, j, k;
double interestRate;
}

• Variables can be initialized when declared.

4-10 Copyright © 2004, Oracle. All rights reserved.

Declaring Variables
As mentioned earlier, you must declare all variables before using them. The declaration consists
of the type, followed by the variable name. Do not forget to terminate the statement with a
semicolon. You can declare a variable anywhere within a block, although it is often preferable to
declare it at the start.
You can declare several variables in one statement. All the variables that are declared in one
statement must be of the same type, such as int, char, float, and so on. The syntax is as
follows:
int itemsRented, numOfDays, itemId;
Initializing Variables
You can declare and initialize a variable in the same statement by using the assignment operator
(=). Even though they are in the same statement, each variable is initialized independently. Each
variable needs its own assignment and value.
int itemsRented = 0, numOfDays, itemId = 0;
In this case, itemsRented and itemId are initialized, whereas numOfDays is not. The
compiler accepts this statement as valid.

Oracle10g: Java Programming 4-10


Local Variables

• Local variables are defined only within a method


or code block.
• They must be initialized before their contents are
read or referenced.

class Rental {
private int instVar; // instance variable
public void addItem() {
float itemCost = 3.50F; // local variable
int numOfDays = 3; // local variable
}
}

4-11 Copyright © 2004, Oracle. All rights reserved.

What Is a Local Variable?


A local variable is one that is defined inside a method and can therefore be accessed only inside
that method. In contrast, a variable that is defined outside a method can be accessed by any
method in that class. Consider the following example:
class Rental {
private int memberId; // Use in any method in the class
public void addItem() {
float itemCost = 3.50F; // Accessible only in addItem()
int numOfDays = 3; // Accessible only in addItem()
}
}
Local Variables Must Be Assigned a Value Before They Can Be Used
A local variable that is declared inside a method must be given a value before it can be used in
an expression. If you use a local variable that has not been assigned a value, then the compiler
issues an error.
Local variables are also known as method variables or even method local variables. In this
course, they are referred to as local variables.

Oracle10g: Java Programming 4-11


Defining Variable Names

• Variable names must start with a letter of the


alphabet, an underscore, or a $ symbol.
• Other characters may include digits.

a item_Cost item#Cost item-Cost


itemCost _itemCost item*Cost abstract
item$Cost itemCost2 2itemCost

• Use meaningful names for variables, such as


customerFirstName and ageNextBirthday.

4-12 Copyright © 2004, Oracle. All rights reserved.

Rules for Legal Variable Names


A variable name must start with a letter of the alphabet, an underscore, or a dollar sign, although
most Java programmers avoid the use of underscores and dollar signs. Subsequent characters can
include the digits 0 through 9. Note that the Java language is case sensitive, and so lowercase
letters are different from uppercase letters.
There is a 64 K restriction on the length of variable names, and so it is recommended that you
choose meaningful names that combine several words. By convention, the first word must be set
in lowercase, and subsequent words must start with uppercase letters, such as
customerFirstName.
Examples of Illegal Variable Names
The variables in the box on the right in the slide are illegal for the following reasons:
• item#Cost is illegal because # is not allowed.
• item-cost is illegal because – (minus sign, not underscore) is not allowed.
• item*Cost is illegal because * is an operator.
• abstract is illegal because abstract is a keyword.
• 2itemCost is illegal because it starts with a digit.
Instructor Note
Variable names starting with underscore are usually reserved for private variable names.

Oracle10g: Java Programming 4-12


What Are Numeric Literals?

Six types: byte, short, int, long, float, double

0 1 42 -23795 (decimal)
02 077 0123 (octal)
Integer literals
0x0 0x2a 0X1FF (hex)
365L 077L 0x1000L (long)

1.0 4.2 .47


Floating-point
1.22e19 4.61E-9
literals
6.2f 6.21F

4-13 Copyright © 2004, Oracle. All rights reserved.

What Is a Literal?
Variables hold values, whereas literals are the values themselves.
float itemCost = 4.95F;
The variable is itemCost, and 4.95 is the literal. Literals can be used anywhere in a Java
program, just like a variable. The difference is that literals cannot be stored or held without the
use of variables.
Integer Literals
By default, integer literals are 32-bit signed numbers. Integer literals can be specified in decimal,
octal, or hexadecimal. When assigning values to a variable, do not use commas to separate
thousands. To specify a literal in decimal form, simply use a number (12317.98). Literals with a
leading zero are in octal form. Octal numbers are in base 8 and can contain the digits 0 through
7. To specify a hexadecimal value, use a leading 0x or 0X. The valid characters are 0 through 9
and A through F (which can be set in uppercase or lowercase).

Oracle10g: Java Programming 4-13


What Is a Literal? (continued)
Integer Literals (continued)
A long integer is a 64-bit type. It can hold a larger number than the 32-bit version (int).
Remember that the 32-bit version can hold up to 2,147,483,647. If you need to store or use a
number larger than that, then you must use a long integer. You can force any integer to be
treated as long by appending an uppercase or lowercase L.
Floating-Point Literals
Floating-point literals can be specified in standard format, such as 123.4, or in scientific
notation, such as 1.234e2. By default, floating-point literals are taken as double precision.
You can obtain single precision by appending an uppercase or lowercase F.

Oracle10g: Java Programming 4-14


What Are Nonnumeric Literals?

Boolean literals True false

Character literals 'a' '\n' '\t' '\077' '\u006F'

String literals "Hello, world\n"

4-15 Copyright © 2004, Oracle. All rights reserved.

What Are Nonnumeric Literals?


Boolean Literals
A Boolean literal can be either true or false, which are Java keywords. Note that true and
false are not numeric values and cannot be converted to integers, or vice versa.
Character Literals
Character literals are normally printable characters that are enclosed in single quotation marks,
such as ‘a’, ‘b’, and ‘c’. To specify a nonprintable character, such as a new line or a tab,
you must specify either its octal or hexadecimal Unicode value, or use its corresponding “escape
sequence.” An escape sequence consists of the backslash character, followed by another
character.

Character Escape Sequence

New Line '\n'


Tab '\t'
Single quote '\''
Backslash '\\'
Unicode values '\u006F'

Oracle10g: Java Programming 4-15


What Are Nonnumeric Literals? (continued)
String Literals
String literals consist of any number of characters inside double quotation marks. String literals
are different from character literals in that the character primitive holds only one character.
String literals hold multiple characters and are delimited by double quotation marks.

Oracle10g: Java Programming 4-16


Guided Practice: Declaring Variables

Find the mistakes in this code and fix them:


1 byte sizeof = 200;
2 short mom = 43;
3 short hello mom;
4 int big = sizeof * sizeof * sizeof;
5 long bigger = big + big + big // ouch
6 double old = 78.0;
7 double new = 0.1;
8 boolean consequence = true;
9 boolean max = big > bigger;
10 char maine = "New England state";
11 char ming = 'd';

4-17 Copyright © 2004, Oracle. All rights reserved.

Problems That You May Encounter


This slide highlights some of the problems that you may encounter when declaring variables in
Java. Hopefully, you will never write code like this. The following lines are illegal:
Line 1
The problem here is that 200 may not be assigned to a byte because 200 is treated as an int.
The proper assignment is: byte b1 = (byte)200; in this case, b1 = –56.
Line 3
A token is needed between hello and mom, such as an assignment operator to copy the value of
mom into hello. It can be that both these variables are of the same type. In that case, all that is
missing is a comma.

Oracle10g: Java Programming 4-17


Problems That You May Encounter (continued)
Line 5
There is no statement terminator (;) at the end of the statement. The // ouch comment is
valid.
Line 7
This statement is illegal because new is a reserved word in Java.
Line 10
char variables can hold only a single character. Declare a String object instead:
String maine = "New England state";
The string literal is not a primitive, but is here for completeness of specifying literals that Java
allows. String is really an object, whose reference to the literal is copied to the variable to which
it is assigned.

Oracle10g: Java Programming 4-18


What Are Operators?

• Operators manipulate data and objects.


• Operators take one or more arguments and
produce a value.
• There are 44 different operators.
• Some operators change the value of the operand.

4-19 Copyright © 2004, Oracle. All rights reserved.

Operators in Java
Operators are used to manipulate the values that are stored in variables; these variables can be in
expressions or they may contain literal values. Most programs that do anything do so by
manipulating data. To calculate the due date of a video rental, the program must take the day that
the video was rented and add some number of days. This is data manipulation. It is hard to
imagine a program that does not use and manipulate data in some way, with the exception of raw
queries of the database.
Java operators take one or more arguments, or operands, and produce a value. Java provides 44
different operators that manipulate data in one way or another. Some of those operators are more
complex than others, and some are used more often.
This lesson focuses on the more important operators.
Note: It is not possible to extend the functionality of the operators. For example, in C++, you can
define your own new meaning for the “–” operator; in Java, you cannot do this. However, the
“+” sign in Java is actually the only overloaded operator in Java. It is used as both an arithmetic
addition operator and also for String concatenation.

Oracle10g: Java Programming 4-19


Categorizing Operators

There are five types of operators:


• Assignment
• Arithmetic
• Integer bitwise
• Relational
• Boolean

4-20 Copyright © 2004, Oracle. All rights reserved.

Operators
Operators are special characters that are used to instruct the Java compiler to perform an
operation on an operand. Java includes a set of 44 different operators. Most programs need only
part of the 44 distinct operators.
Assignment Operators
Assignment operators set the value of a variable to a literal value or the value of another variable
or expression.
Arithmetic Operators
Arithmetic operators perform mathematic computations on operands. Arithmetic operators
operate on all numeric types.
Integer Bitwise Operators
Bitwise operators are provided to inspect and modify the internal bits that make up integer
numeric types, whereas arithmetic operators modify the values of a variable as a whole unit.
Relational Operators
Relational operators compare two values. You can use relational comparison to set other values
or to control program flow.
Boolean Logical Operators
Boolean operators can be used only on Boolean variables or expressions. The result of a Boolean
operator is always a Boolean value.

Oracle10g: Java Programming 4-20


Using the Assignment Operator

The result of an assignment operation is a value and


can be used whenever an expression is permitted.
• The value on the right is assigned to the identifier
on the left:
int var1 = 0, var2 = 0;
var1 = 50; // var1 now equals 50
var2 = var1 + 10; // var2 now equals 60
• The expression on the right is always evaluated
before the assignment.
• Assignments can be strung together:

var1 = var2 = var3 = 50;

4-21 Copyright © 2004, Oracle. All rights reserved.

Using the Assignment Operator


After a variable has been declared, you can assign a value by using the assignment operator.
First, the value of the expression on the right side of the assignment operator is determined or
evaluated, and then the result is assigned to the variable on the left.
Note the following example:
var1 = 10;
var2 = var1 + 10; // the right side is evaluated first
var2 now equals 20.
Assignments Can Be Strung Together in the Same Statement
Multiple assignment operators can be used within a single statement as follows:
var1 = var2 = var3 = 50;
The assignment operator has “right associativity,” which means that the rightmost assignment
operator is performed first in this statement. The other assignments are evaluated moving from
the right to the left. The statement can be rewritten as follows, to emphasize the order in which
the assignments are carried out and to make the code clearer:
var1 = (var2 = (var3 = 50));
The net result is that the value 50 is assigned to all three variables.

Oracle10g: Java Programming 4-21


Working with Arithmetic Operators

• Perform basic arithmetic operations.


• Work on numeric variables and literals.

int a, b, c, d, e;
a = 2 + 2; // addition
b = a * 3; // multiplication
c = b - 2; // subtraction
d = b / 2; // division
e = b % 2; // returns the remainder of division

4-22 Copyright © 2004, Oracle. All rights reserved.

Simple Arithmetic Operators


Most of the arithmetic operators in Java are similar to those in other languages. Both operands
must be of numeric types and the result of the operation is always numeric. The important things
to remember when using the simple arithmetic operators are:
• Integer division results in an integer, and any remainder is ignored.
• The multiply, divide, and modulus operators have higher precedence than the add and
subtract operators. In other words, multiplication, division, and modulus operations are
evaluated before addition and subtraction operations.
• Arithmetic operations can be performed on variables and literals.
• Modulus (mod) returns the remainder of a division operation.

Oracle10g: Java Programming 4-22


More on Arithmetic Operators

Most operations result in int or long:


• byte, char, and short values are promoted to
int before the operation.
• If either argument is of the long type, then the
other is also promoted to long, and the result is of
the long type.

byte b1 = 1, b2 = 2, b3;
b3 = b1 + b2; // ERROR: result is an int
// b3 is byte

4-23 Copyright © 2004, Oracle. All rights reserved.

Integer Arithmetic in Java Is Always Performed by Using int or long


In Java, all integer arithmetic is performed with int or long values; byte, char, and short
values are automatically widened (promoted) to int before an arithmetic operation commences,
and the result is also int. Similarly, if the argument on one side of an arithmetic operator is a
long, then the argument on the other side is automatically promoted to a long as well, and the
result is a long.
Consequently, if the result is to be assigned to a variable of a smaller type, then the compiler
signals an error.
Promoting floats
If an expression contains a float, the entire expression is promoted to float. All literal
floating-point values are viewed as doubles.

Oracle10g: Java Programming 4-23


Examining Conversions and Casts

• Java automatically converts a value of one


numeric type to a larger type.

byte
short
int
char long
• Java does not automatically “downcast.”

short
byte int long
char

4-24 Copyright © 2004, Oracle. All rights reserved.

Examining Conversions and Casts


The method that is used to force one variable type to be stored as another variable type is called
casting.
Java Can Convert Small Numeric Types into Wider Types Automatically
Java automatically converts or casts a variable or expression from one numeric type to a wider
type if necessary. For example, if you try to assign a byte to a short, then the compiler
automatically converts the byte into a short before making the assignment.
Java Does Not Convert Large Numeric Types into Narrower Types Automatically
Java does not provide an automatic conversion from large numeric types to narrower types
because this may result in loss of information. If you assign the value of a larger type to a
smaller type, then the compiler will issue an error. However, you can force the compiler to
convert a variable of one numeric type to a narrower type by using an explicit cast.

Oracle10g: Java Programming 4-24


Examining Conversions and Casts (continued)
Java Does Not Convert Large Numeric Types into Narrower Types Automatically
(continued)
Casting takes the internal bit pattern of the source variable and places it in the target variable’s
type. This can result in a loss of data and unpredictable results. If you need to cast a variable,
then you must be aware of the possibility of data loss.
The syntax for an explicit cast is to put the target type in parentheses in front of the expression or
variable. For example,
byte b1 = 1, b2 = 2, b3;
b3 = b1 + b2; // error: the result is automatically int
b3 = (byte) (b1 + b2);
// this corrects it but may
// result in data loss
// if the added value is
// greater than positive 127
Remember that casts stop the compiler from performing useful checks on the validity of your
code.
Casting and Arithmetic Operations
Be careful when performing arithmetic operations while casting to a smaller type. Note that
performing a narrowing conversion, such as int to byte, may produce the wrong arithmetic
result. For example, if you add a byte with the value 100 to another byte with the value 100,
the int result is 200. However, if this result is cast to a byte, the value becomes -56 because
this is how the bit pattern for 200 is treated in a byte.

Oracle10g: Java Programming 4-25


Incrementing and Decrementing Values

• The ++ and -- operators increment and decrement


by 1, respectively:
int var1 = 3;
var1++; // var1 now equals 4

• The ++ and -- operators can be used in two ways:


int var1 = 3, var2 = 0;
var2 = ++var1; // Prefix: Increment var1 first,
// then assign to var2.
var2 = var1++; // Postfix: Assign to var2 first,
// then increment var1.

4-26 Copyright © 2004, Oracle. All rights reserved.

Increment and Decrement Operators


Incrementing or decrementing a value by one is a very common operation in any language. Like
C and C++, Java provides special operators for this purpose. Both the increment (++) and
decrement (--) operators can be prefixed or postfixed; that is, they can be placed before or after
the operand. The placement of the operators affects when the operation takes place.
Prefixed Operator
When an increment or decrement operator is placed in front of a variable, the variable is
incremented before any assignment operation. In other words, the value in the variable is
adjusted by 1 (either up or down), and then it is used in the assignment.
Postfixed Operator
When the operator is placed after the variable, the variable is adjusted after the assignment
operation. The value that is assigned is the value of the variable before it is incremented or
decremented.
Instructor Note
Many students find these operators confusing. Make sure that they understand the difference
between prefix and postfix.

Oracle10g: Java Programming 4-26


Relational and Equality Operators

> greater than


>= greater than or equal to
< less than
<= less than or equal to
== equal to
!= not equal to

int var1 = 7, var2 = 13;


boolean res = true;
res = (var1 == var2); // res now equals false
res = (var2 > var1); // res now equals true

4-27 Copyright © 2004, Oracle. All rights reserved.

Relational and Equality Operators


Java provides a set of relational and equality operators for comparing the values of two variables
or expressions. Unlike many languages, other than C and C++, the equality operator is a double
equals sign, ==. The inequality operator is !=.
Remember that the assignment operator, the equals sign, sets the value of the variable on the left
of the sign to the value of the expression or variable on the right side of the equals sign. The
double equals sign tests for equality of both sides. For example:
int goodCreditRating = 3;
boolean goodCredit = false;
goodCredit = (custRating == goodCreditRating);
In the example, if the customers rating is not 3, then goodCredit will be assigned false,
which is the result of comparing the value of goodCreditRating with the customer’s actual
rating. If the actual rating was 3, then the result will be true.
Instructor Note
Many students mix up the assignment operator and the equality operator. Emphasize the
difference between the two.

Oracle10g: Java Programming 4-27


Using the Conditional Operator (?:)

• Useful alternative to if…else:


boolean_expr ? expr1 : expr2

• If boolean_expr is true, the result is expr1;


otherwise, the result is expr2:

int val1 = 120, val2 = 0;


int highest;
highest = (val1 > val2) ? val1 : val2;
System.out.println("Highest value is " + highest);

4-28 Copyright © 2004, Oracle. All rights reserved.

The Conditional Operator (?:)


The conditional operator (?:) is the only ternary operator in Java, which means it has three
operands. The conditional operator is an expression that returns a value and is a useful
alternative to if…else.
The Boolean expression evaluates first and, if true, returns the value of the first expression
(expr1) or if false, returns the value of the second expression (expr2).
For example, consider the conditional operator:
max = (10 > 8) ? 100: 200;
Because 10 is greater than 8, max is set to 100. The values of the expressions (100 and 200)
can be any valid Java expressions including literals.
A similar effect can be achieved by using an if…else statement, as follows. Use whichever
approach you find more intuitive.
if (10 > 8)
max = 100;
else
max = 200;

Oracle10g: Java Programming 4-28


Using Logical Operators

Results of Boolean expressions can be combined by


using logical operators:

&& & and (with or without short-circuit evaluation)


|| | or (with or without short-circuit evaluation)
^ exclusive or
! not

int var0 = 0, var1 = 1, var2 = 2;


boolean res = true;
highest = (val1 > val2)? val1 : val2;
res = !res;

4-29 Copyright © 2004, Oracle. All rights reserved.

Logical Operators
Boolean values and expressions that result in Boolean values can be combined by using the
logical operators &, |, and !, which represent AND, OR, and NOT operations, respectively.
Short-Circuit Evaluation
The && and ||operators provide support for “short-circuit evaluation”; if the expression on the
left of the operator has already determined the outcome of the whole logical expression, then the
expression on the right of the operator is not performed.
Consider the following example using the && operator:
if (test1() && test2())
If test1 returns false, then there is no need to carry out test2 because a logical AND
requires both tests to yield true; therefore, test2 is not performed.
Likewise, consider the following example using the || operator:
if (test1() || test1())
If test1 returns true, there is no need to carry out test2 because a logical OR only requires
one of the tests to yield true; therefore, test2 is not performed.
Non-Short-Circuit Evaluation
If you have a Boolean expression involving two tests and you want the second test to be
performed regardless of the outcome of the first test, use the & operator instead of &&, and the |
operator instead of ||. Also, note that there is a ^ operator that performs the exclusive OR
operation.

Oracle10g: Java Programming 4-29


Compound Assignment Operators

An assignment operator can be combined with any


conventional binary operator:

double total=0, num = 1;


double percentage = .50;

total = total + num; // total is now 1
total += num; // total is now 2
total -= num; // total is now 1
total *= percentage; // total is now .5
total /= 2; // total is now 0.25
num %= percentage; // num is now 0

4-30 Copyright © 2004, Oracle. All rights reserved.

Compound Assignment Operators


Expressions such as var1 = var1 + 20 are so common that Java provides compound
assignment operators as a shorthand equivalent. You can form these compound operators by
combining the assignment operator with any of the conventional binary operators. Binary
operators are those operators that use two arguments such as +, -, *, / and so on.
For example, the expression
rentalDueDate = rentalDueDate + 3;
can be rewritten as follows:
rentalDueDate += 3;
This expression takes the current value of rentalDueDate and adds 3. It then places the
result into rentalDueDate.
The %= operator computes the remainder of dividing the first variable by the second, and then
assigns it to the first variable.

Oracle10g: Java Programming 4-30


Operator Precedence
Order Operators Comments Assoc.
1 ++ -- + - ~ Unary operators R
! (type)
2 * / % Multiply, divide, remainder L
3 + - + Add, subtract, add string L
4 << >> >>> Shift (>>> is zero-fill shift) L
5 < > <= >= Relational, type compare L
instanceof
6 == != Equality L
7 & Bit/logical AND L
8 ^ Bit/logical exclusive OR L
9 | Bit/logical inclusive OR L
10 && Logical AND L
11 || Logical OR L
12 ?: Conditional operator R
13 = op= Assignment operators R

4-31 Copyright © 2004, Oracle. All rights reserved.

Java Operators
Precedence refers to the order in which operators are executed. For example, multiplication is
always performed before addition or subtraction. The table in the slide shows the Java operators
in order of precedence, where row 1 has the highest precedence. With the exception of the unary,
conditional, and assignment operators, which are right associative, operators with the same
precedence are executed from left to right.
Associativity
Operators with the same precedence are performed in order, according to their associativity. In
the slide, the final column in the table shows the associativity for each operator:
• L indicates left-to-right associativity. Most operators fall in this category.
• R indicates right-to-left associativity. Only the unary operators (row 1), the conditional
operator (row 12), and the assignment operators (row 13) fall in this category.
For example, consider the following statement:
int j = 3 * 10 % 7;
The * and % operators have the same precedence, but have left-to-right associativity. Therefore,
the * is performed first, as though you had used parentheses as follows:
int j = (3 * 10) % 7; // Same result, 30%7, which is 2
If you choose to place parentheses in a different place, then you get a different result:
int j = 3 * (10 % 7);// Different result, 3*3, which is 9

Oracle10g: Java Programming 4-31


More on Operator Precedence

• Operator precedence determines the order in


which operators are executed:

int var1 = 0;
var1 = 2 + 3 * 4; // var1 now equals 14

• Operators with the same precedence are executed


from left to right (see note in text below):

int var1 = 0;
var1 = 12 - 6 + 3; // var1 now equals 9

• Use parentheses to override the default order.

4-32 Copyright © 2004, Oracle. All rights reserved.

Using the Precedence Table


The precedence table defines the order in which operators are evaluated. If you have a complex
expression containing many operators, then refer to the precedence table to make sure that the
operators are being performed in the order that you expect.
To make things simpler, you can use parentheses to override the default order in which operators
are executed. Many programmers also use parentheses where they are not strictly necessary to
make the code more readable.
Note: The second bullet in the slide states that operators with the same precedence are evaluated
from left to right. This is true for all operators except the unary operators, the conditional
operator, and the assignment operators, which are evaluated from right to left as described on the
previous page.
Using Parentheses
Use parentheses to control the order of statement evaluation exactly. Consider the following
variations:
var1 = 12 - 6 + 3; // var1 now equals 9
var1 = 12 - (6 + 3); // var1 now equals 3

Oracle10g: Java Programming 4-32


Concatenating Strings

The + operator creates and concatenates strings:

String name = "Jane ";


String lastName = "Hathaway";
String fullName;
name = name + lastName; // name is now
//"Jane Hathaway"
// OR
name += lastName ; // same result
fullName = name;

4-33 Copyright © 2004, Oracle. All rights reserved.

Using Operators with Strings


Only three operators can be used with strings: the assignment operator (=), the addition operator
(+), and the compound addition assignment operator (+=).
Using the Assignment Operator
You can use the assignment operator to create a new String object or to set the value of an
existing String reference to refer to a String object:
String firstName = "John";
firstName = "John";
Using the Addition Operator
The addition operator is very useful with strings because it creates a new String object by
concatenating the contents of two String objects. Consider the following code:
String firstName = "John";
String lastName = "Doe";
fullName = firstName + " " + lastName
fullName is now "John Doe".
If part of a String expression is not a String, then Java automatically converts that part into a
String object and then concatenates its contents with the other String object to form a new String
as a result.
Using the Compound Assignment Operator
You can also use the += operator to concatenate a String to an existing String.

Oracle10g: Java Programming 4-33


Summary

In this lesson, you should have learned the following:


• Java has eight primitive data types.
• A variable must be declared before it can be used.
• Java provides a comprehensive set of operators.
• Explicit casting may be necessary if you use data
types smaller than int.
• The + and += operators can be used to create and
concatenate strings.

4-34 Copyright © 2004, Oracle. All rights reserved.

Oracle10g: Java Programming 4-34


Practice 4: Overview

This practice covers:


• Declaring and initializing variables
• Using various operators to compute new values
• Displaying results on the console

4-35 Copyright © 2004, Oracle. All rights reserved.

Practice 4: Overview
Note: If you have successfully completed the previous practice, then continue using the same
directory and files. If the compilation from the previous practice was unsuccessful and you want
to move on to this practice, then change to the les03 directory, and continue with this practice.
Remember that if you close a DOS window or change the location of the .class files, then you
must set the CLASSPATH variable again.

Oracle10g: Java Programming 4-35


Practice 4: Exploring Primitive Data Types and Operators
Goal
The goal of this practice is to declare and initialize variables, and use them with operators to
calculate new values. You will also be able to categorize the primitive data types and use them in
code.
Note: If you have successfully completed the previous practice, then continue using the same
directory and files. If the compilation from the previous practice was unsuccessful and you want
move on to this practice, then change to the les03 directory, and continue with this practice.
Your Assignment
You are now ready to add some code to the simple main() method in the OrderEntry
application class created in the last exercise. In the following steps, you declare some variables
to hold the costs of some rental items. After displaying the contents of these variables, you
perform various tests and calculations on these variables and display the results.
Modify the OrderEntry Class and Add Some Calculations
1. Declare variables in the main() method.
a. Declare and initialize two variables to hold the cost of two rental items. The values of
the two items must be 2.95 and 3.50. Name the items anything you like, but do not
use single-character variable names; instead, use longer meaningful names such as
item1 and item2. Also, think about your choice of variable type.
Note: Recompile the class after each step, fix any compiler errors that may arise, and
run the class to view any output.
b. You may have used four different statements: two to declare your variables, and two
more to initialize them. Now try to declare and initialize the variables in a single line.
Finally, see whether you can combine the declaration and initialization of both
variables into a single statement.
c. Use System.out.println() to display the contents of your variables. After
recompiling the class, run the class and see what is displayed.
d. Modify the code you have just written to display more meaningful messages, such as
Item 1 cost 2.95.
(Hint: Use the + operator.)
e. Now that you have the total for the items, calculate the total for the rental by adding
the tax. The tax rate is 8.25%. Create a variable to hold this value. Calculate the total
charge for the rental. Also declare and initialize a variable to hold the number of days
and to track the line numbers. This variable holds the number of days for which the
customer rents the items, and initializes the value to 2 for two days.
f. Display the total in a meaningful way such as Total cost:6.982125.

Oracle10g: Java Programming 4-36


Practice 4: Exploring Primitive Data Types and Operators (continued)
2. Calculate the total cost, and display the result.
a. Extend the item total to be the item cost * the number of rental days, displaying:
Item 1 is 2.95 * 2 days = 5.9
b. Display the results in a meaningful way. Your result must look like the following:
Total cost: 13.96425.
3. Compile and run the OrderEntry class. Make sure the .class file has been placed in the
correct directory (E:\labs\OrderEntry\classes\oe).
Note: Make sure the CLASSPATH variable points to the location of your .class files
(E:\labs\OrderEntry\src\oe).

Oracle10g: Java Programming 4-37


Controlling Program Flow

Copyright © 2004, Oracle. All rights reserved.

Schedule: Timing Topic


60 minutes Lecture
30 minutes Practice
90 minutes Total
Objectives

After completing this lesson, you should be able to do


the following:
• Use decision-making constructs
• Perform loop operations
• Write switch statements

5-2 Copyright © 2004, Oracle. All rights reserved.

Lesson Aim
This lesson introduces Java’s decision-making and repetition constructs. You learn how to
use those constructs to build nonlinear applications. Like other block-structured languages,
Java supports statements to control the flow of execution in a program. This lesson explains
how to use decision-making constructs and how to use the loop statements that are provided
in Java.

Oracle10g: Java Programming 5-2


Lesson Aim (continued)
What Is Program Flow?
By default, computer programs start execution at, or near, the beginning of the code and
move down the code until the end. This is fine if your program does one thing, always in the
same order, and never needs to deviate from this path. Unfortunately, this does not happen
very often in most businesses.
Program control constructs are designed so that the programmer can design and build
programs that perform certain parts of code conditionally. There are also constructs so that
code can be executed repetitively. These coding structures give you infinite control of what,
when, and how many times your program performs a particular task.
By providing standard control mechanisms, Java gives programmers control over the exact
execution order of their program code.

Oracle10g: Java Programming 5-3


Categorizing Basic Flow Control Types

Flow control can be categorized into four types:

Sequential Iteration

Selection Transfer

5-4 Copyright © 2004, Oracle. All rights reserved.

Categorizing Basic Flow Control Types


Sequential
Sequential is the flow control type where the program flow follows a simple sequential path,
executing one statement after another. The primary sequential structure is a compound block
statement, which is a series of statements inside braces.
Selection
Selection is the flow control type where only one path out of a number of possibilities is
taken. Simple selection involves the conditional execution of a statement or block of code,
which is guarded by an expression that will have the value true if the guarded code is to be
executed. This is the if statement. An if…else statement provides an alternate path of
execution: The true or false evaluation of a control expression determines which branch is
taken. A switch statement supports a multiway branch based on the value of a control
expression.

Oracle10g: Java Programming 5-4


Categorizing Basic Flow Control Types (continued)
Iteration
Iteration is the type where one statement or block of code is executed repeatedly. A simple
loop executes the same code whereas a control expression has a true value, terminating
execution when the expression evaluates to false. Java provides three loop forms: while,
do…while, and for loops.
Transfer
Transfer is the type where the point of execution jumps to a different point in the program.
Transfer is generally considered poor programming style, because it is hard to follow the
logic and therefore difficult to maintain the code.
Goto
The Java language does not have a goto statement. This allows the language to be less
complex and eliminates rules about how the goto must operate in for statements. The
break and continue statements work in the majority of occasions where a goto would
normally be used.

Oracle10g: Java Programming 5-5


Using Flow Control in Java

• Each simple statement terminates with a


semicolon (;).
• Group statements by using the braces { }.
• Each block executes as a single statement within
the flow of control structure.
{
boolean finished = true;
System.out.println("i = " + i);
i++;
}

5-6 Copyright © 2004, Oracle. All rights reserved.

Using Flow Control in Java


Simple Statements
A simple statement is any expression that terminates with a semicolon. For example:
var1 = var2 + var3;
var3 = var1++;
var3++;
Compound Statements (Blocks)
Related statements can be grouped in braces to form a compound statement or block:
{
int i;
boolean finished = true;
System.out.println("i = " + i);
i++;
}
Semantically, a block behaves like a single statement and can be used anywhere a single
statement is allowed. There is no semicolon after the closing brace. Java does not use
matched block delimiters, such as if and end if, like PL/SQL. Any variables that are
declared in a block remain in scope up to the closing brace. After the block is exited, the
block variables cease to exist.
Blocking improves readability of program code and can help to make your program easier to
control and debug.
Oracle10g: Java Programming 5-6
Using the if Statement

if ( boolean_expr )
General: statement1;
[else
statement2];

if (i % 2 == 0)
System.out.println("Even");
Examples: else
System.out.println("Odd");
… if (i % 2 == 0) {
System.out.print(i);
System.out.println(" is even");
}

5-7 Copyright © 2004, Oracle. All rights reserved.

The if Statement
The if statement provides basic selection processing. A Boolean control expression
determines which branch is taken, as follows:
• If the expression evaluates to true, the first branch is taken; that is, the if body is
executed.
• If the expression evaluates to false, the second branch is taken; that is, the else
body is executed. The else clause is optional; if it is omitted, nothing is executed if
the control expression evaluates to false.
Example
if (orderIsPaid) {
System.out.println("send with receipt");
}
else {
System.out.println("collect funds");
}
Common Mistakes When Using if Statements
Use the equality operator (==) rather than the assignment operator (=) in the control
expression.

Oracle10g: Java Programming 5-7


Nesting if Statements
if (speed >= 25)
if (speed > 65)
System.out.println("Speed over 65");
else
System.out.println("Speed >= 25 but <= 65");
else
System.out.println("Speed under 25");

if (speed > 65)


System.out.println("Speed over 65");
else if (speed >= 25)
System.out.println("Speed greater… to 65");
else
System.out.println("Speed under 25");

5-8 Copyright © 2004, Oracle. All rights reserved.

Nested if Statements
Where multiple tests are necessary, if statements can be nested. However, this approach is
generally not recommended because you have to maintain a mental stack of the decisions
that are being made; this becomes difficult if you have more than three levels of nested if
statements.
Also, it is very easy to forget that an else clause always binds to the nearest if statement
above it that is not already matched with an else, even if the indentation suggests
otherwise. This is sometimes referred to as the “dangling else” problem.
The if…else…if Construct
The “dangling else” problem can be solved with a prudent use of braces, but a cleaner
approach is to use the if…else… if construct, as shown in the second example in the
slide. Note that these are two separate keywords; unlike some languages, Java does not have
an elseif keyword.

Oracle10g: Java Programming 5-8


Guided Practice: Spot the Mistakes

int x = 3, y = 5;
1
if (x >= 0)
if (y < x)
System.out.println("y is less than x");
else
System.out.println("x is negative");

int x = 7; 2
if (x = 0)
System.out.println("x is zero");

int x = 14, y = 24;


3
if ( x % 2 == 0 && y % 2 == 0 );
System.out.println("x and y are even");

5-9 Copyright © 2004, Oracle. All rights reserved.

Guided Practice: Spot the Mistakes


Example 1: Use braces to associate or bind statements and make the code easier to follow.
if (x >= 0) {
if (y < x)
System.out.println("y is less than x");}
else
System.out.println("x is negative");
It is the last if that pairs with an else. Although it does not become a compiler error, it
becomes a logic error.
Example 2: The second example uses an assignment operator (=) rather than an equality
operator (==) in the if test. Fortunately, Java compilers detect this mistake and indicate a
compiler error because the expression in the if test must evaluate to a Boolean.
Example 3
The third example has an extra semicolon at the end of the if test. This is not a compiler
error; the compiler treats the semicolon as an empty if body, as follows:
if ( x % 2 == 0 && y % 2 == 0 )
; // Null "if" body

Oracle10g: Java Programming 5-9


Defining the switch Statement

switch ( integer_expr ) {

case constant_expr1:
statement1;
• The switch
break;
statement is useful
case constant_expr2:
when selecting an
statement2;
action from several
break;
alternative integer
[default: values.
statement3;] • Integer_expr must
} be byte, int, char,
or short.

5-10 Copyright © 2004, Oracle. All rights reserved.

The switch Statement


The switch statement provides a clean way to dispatch to different sections of your code,
depending on predefined values. It can be used to choose among many alternative actions,
based on the value.
Anatomy of the switch Statement
The switch statement is useful when selecting some action from several alternatives. The
value inside the test expression must be a byte, char, short, or int. It cannot be a
boolean, long, double, float, String, or any other kind of object.
The value inside the test expression is compared against the case labels, which are constant
expressions.
• If a match is found, then the statements following the label are executed. Execution
continues until a break is encountered, which transfers control to the statement
following the switch statement.
• If no match is found, then control passes to the statements following the default
label. The default label is optional; if no default label is provided, then the
switch statement does nothing when no match is found. It is a good practice to
always provide a default label, even if no action is required.

Oracle10g: Java Programming 5-10


The switch Statement (continued)
The case Labels
The case labels must be constant expressions and known at compile time. You can use
either literal numbers or final variables (constants).

Oracle10g: Java Programming 5-11


More About the switch Statement

switch (choice) {
• case labels
case 37:
must be
System.out.println("Coffee?");
constants.
break;
• Use break to
jump out of a
case 45:
switch.
System.out.println("Tea?");
• It is break;
recommended
to always default:
provide a System.out.println("???");
default.
break;
}

5-12 Copyright © 2004, Oracle. All rights reserved.

More About switch


The slide shows a simple example of a switch statement. There are situations where
falling through can be useful. To fall through, simply do not include a break as in the
following example:
char c = 'b';
switch (c) {
case 'a': System.out.println("First letter in alphabet");
break;
case 'b': System.out.println("Second letter in alphabet");
case 'c': System.out.println("Third letter in alphabet");
case 'd': System.out.println("Fourth letter in alphabet");
}
In the above example, the results that are printed displays the following lines because of the
absence of a break statement between each case test for ‘b’, ‘c’, and ‘d.’
Second letter in alphabet
Third letter in alphabet
Fourth letter in alphabet

Oracle10g: Java Programming 5-12


Looping in Java

• There are three types of loops in Java:


– while
– do…while
– for
• All loops have four parts:
– Initialization
– Iteration condition
– Body
– Termination

5-13 Copyright © 2004, Oracle. All rights reserved.

Looping in Java
What Is Looping?
Looping in any programming language refers to repeatedly executing a block of code until a
specified condition is met. Java provides three standard loop constructs: while,
do…while, and for.
All Loops Have Four Parts
All loops contain four parts: initialization, iteration, statement body, and termination.
Initialization: Initialization sets the initial conditions of the loop. This includes any variable
that may be incremented to control execution of the loop.
Iteration: The iteration is the code that you want to execute after the body but before you go
through the loop again. It is used for control of the loop execution.
Body: The body is executed if the termination condition is true.
Termination: Termination is the expression that is evaluated to determine if the body must
be executed. The expression must be a Boolean expression. If the expression evaluates to
true, then the body is executed; if it is false, then the body is not executed.
Choosing the appropriate loop
Use the while loop to ensure that the termination condition is tested before executing the
body of the loop. Use the do…while to ensure that the body executes once before the
termination condition is made. The for loop is similar to the while loop.
Oracle10g: Java Programming 5-13
Using the while Loop

while is the simplest loop statement and contains the


following general form:

while ( boolean_expr )
statement;

Example: int i = 0;
while (i < 10) {
System.out.println("i = " + i);
i++;
}

5-14 Copyright © 2004, Oracle. All rights reserved.

Anatomy of the while Loop


The simplest loop construct in Java is the while loop. In the while loop, the loop body is
executed repeatedly while a boolean control expression evaluates to true. When the
control expression evaluates to false, the loop terminates and control passes to the first
statement after the closing brace of the loop body.
Note that the control expression is evaluated before the loop body is executed. If the control
expression evaluates to false the first time, then it does not enter the loop body.
Common Mistakes When Using while Loops
A common mistake when using while loops is to forget to iterate the variable that is used
in the control expression. This results in an infinite loop. Another common mistake is to put
a semicolon at the end of the first line, between the control expression and the loop body.
This places the incrementing of the counter outside the loop and results in an infinite loop.
Instructor Note
This loop will execute 10 times, with loop counter i varying from 0 through 9.

Oracle10g: Java Programming 5-14


Using the do…while Loop

do…while loops place the test at the end:

do
statement;
while ( termination );

Example: int i = 0;
do {
System.out.println("i = " + i);
i++;
} while (i < 10);

5-15 Copyright © 2004, Oracle. All rights reserved.

Anatomy of the do…while Loop


The do…while loop is similar to the while loop except that the control expression is
evaluated after the loop body has been executed. This guarantees that the loop body executes
at least once. This construct is useful if you want to execute the statement at least once
without regard to the while condition.
Common Mistakes When Using do…while Loops
A common mistake when using do…while loops is to forget one of the braces of a
compound statement or the final semicolon. The compiler detects both of these types of
errors.

Oracle10g: Java Programming 5-15


Using the for Loop

for loops are the most common loops:

for ( initialization; termination; iteration )


statement;

Example:
for (i = 0; i < 10; i++)
System.out.println(i);

How would this for loop look using a while loop?

5-16 Copyright © 2004, Oracle. All rights reserved.

Anatomy of the for Loop


The for loop combines components of a loop into a single construct with positions for each
component. The three components that are enclosed in parentheses are separated by
semicolons.
Common Mistakes When Using for Loops
A common coding error with for loops is to put a semicolon after the closing parenthesis.
This is equivalent to an empty loop body that does nothing on each iteration.
for Loops and while Loops Compared
The for loop shown in the slide is equivalent to the following while loop:
i = 0;
while (i < 10) {
System.out.println(i);
i++;
}

Instructor Note
The for loop integrates the four parts (initialization, iteration, body, and termination) in the
statement.
Oracle10g: Java Programming 5-16
More About the for Loop

• Variables can be declared in the initialization part


of a for loop:

for (int i = 0; i < 10; i++)


System.out.println("i = " + i);

• Initialization and iteration can consist of a list of


comma-separated expressions:
for (int i = 0, j = 10; i < j; i++, j--) {
System.out.println("i = " + i);
System.out.println("j = " + j);
}

5-17 Copyright © 2004, Oracle. All rights reserved.

More About the for Loop


Declaring Variables in the Initialization Part of a for Loop
The initialization expression in a for loop can include a declaration, as shown in the first
example in the slide. Any variable that is declared here is local to the for loop itself. After
the execution leaves the loop, the variable is no longer available.
Complex Initialization and Iteration Components
The initialization and iteration components can consist of several comma-separated
expressions, as shown in the second example in the slide, where two indexes are
incremented or decremented in opposite directions.
Empty Initialization, Termination, or Iteration Expressions
Any of the components of a for loop can be omitted. For example, a common way to
implement a “do-forever” loop is as follows:
for (;;) { // loop forever

}
This kind of loop is common in multithreaded programs, where one of the threads loops
continually doing some dedicated task. For example, a server program may have a thread
that loops forever listening for connections from client programs.

Oracle10g: Java Programming 5-17


Guided Practice: Spot the Mistakes

int x = 10; 1
while (x > 0);
System.out.println(x--);
System.out.println("We have lift off!");

int x = 10;
while (x > 0)
System.out.println("x is " + x); 2
x--;

int sum = 0;
for (; i < 10; sum += i++);
3
System.out.println("Sum is " + sum);

5-18 Copyright © 2004, Oracle. All rights reserved.

Guided Practice: Spot the Mistakes


Example 1
The first example contains an extra semicolon at the end of while. This is not a compiler
error; the compiler treats the semicolon as an empty loop body, as follows:
while (x > 0)
; // Null loop body
Example 2
The problem with the second example is that x is not changed inside the loop. The x-- term
is deemed to be outside the loop because there are no braces. Therefore, if x is greater than
zero the first time through the loop, it will always be greater than zero, and the loop will
never terminate.
Example 3
The problem with this example is that i is not initialized anywhere. The rest of the loop is
fine. Here is a description of what is happening:
• The loop keeps iterating while i is less than 10.
• The semicolon at the end of the for line indicates a null loop body.
• The iteration expression in the for loop adds i to sum, and then increments i ready
for the next loop iteration.

Oracle10g: Java Programming 5-18


The break Statement

• Breaks out of a loop or switch statement


• Transfers control to the first statement after the
loop body or switch statement
• Can simplify code but must be used sparingly


while (age <= 65) {
balance = (balance+payment) * (1 + interest);
if (balance >= 250000)
break;
age++;
}

5-19 Copyright © 2004, Oracle. All rights reserved.

Anatomy of the break Statement


You can use a break statement to exit any kind of loop when a specific condition is met.
Control is transferred immediately to the first statement following the closing brace of the
loop body.
Should break Be Used?
Many programmers frown upon the use of break because it is not strictly necessary. For
example, in the code fragment that is shown in the slide, you could have avoided using
break by expanding the control expression as follows:
while (age <=65 && balance < 250000) {

}
Nevertheless, the use of break statements is useful where you need to abort a loop if some
event occurs while executing the loop body. As you have already seen, break statements
are also used in switch statements to prevent falling through to a subsequent case label.

Oracle10g: Java Programming 5-19


Summary

In this lesson, you should have learned the following:


• The primary means of decision-making is the if
statement, with the optional else.
• Java also offers the switch statement.
• Java provides three loop statements: while,
do…while, and for.
• Use break and continue sparingly.

5-20 Copyright © 2004, Oracle. All rights reserved.

Oracle10g: Java Programming 5-20


Practice 5: Overview

This practice covers:


• Performing tests by using if…else statements
• Using loops to perform iterative operations
• Using the break statement to exit a loop
• Using the &&, ||, and ! operators in Boolean
expressions

5-21 Copyright © 2004, Oracle. All rights reserved.

Practice 5: Overview
Note: If you have successfully completed the previous practice, then continue using the
same directory and files. If the compilation from the previous practice was unsuccessful and
you want to move on to this practice, then change to the les04 directory, and continue with
this practice.
Remember that if you close a DOS window or change the location of the .class files, then
you must set the CLASSPATH variable again.

Oracle10g: Java Programming 5-21


Practice 5: Controlling Program Flow
Goal
The goal of this practice is to make use of flow control constructs that provide methods to
determine the number of days in a month, and handle leap years.
Note: If you have successfully completed the previous practice, then continue using the
same directory and files. If the compilation from the previous practice was unsuccessful and
you want to move on to this practice, then change to the les04 directory, and continue with
this practice. Remember that if you close a DOS window or change the location of the
.class files, then you must set the CLASSPATH variable again.
Your Assignment
In this exercise, you create a program that calculates the return date of a rented item based
on the day it was rented and how many days it can be rented. You must determine the
number of days in the month and whether it is a leap year.
Modify the OrderEntry class to calculate dates
1. Determine the number of days in a month. You use a switch statement to set an
integer value to the number of days in the month you specify. For now, add all the
code in the main() method of the OrderEntry.java application.
a. Declare three integers to hold a day, a month, and a year. Initialize these
variables with a date of your choice.
b. Add a simple statement to display the date; choose whichever format you prefer,
such as day/month/year or month/day/year.
c. Declare a variable to hold the number of days in the current month. Then, using a
switch statement, determine the value to store in this variable. Use
daysInMonth as the name of the variable.
Note: The hardest part of this exercise is remembering how many days there
really are in each month. Here is a reminder if you need it: There are 30 days in
September, April, June, and November. All the rest are 31, except for February,
which is 28 (ignore leap years for now). Add a simple statement to display the
number of days for the current month.
d. Add a simple statement to display the number of days for the current month:
System.out.println(daysInMonth + " days in month");
2. Ensure your CLASSPATH is set correctly (E:\labs\OrderEntry\src\oe).
Compile and test the program. Experiment with different values for the month. What
happens if you initialize the month with an invalid value, such as 13?
For January 27, 2000, the output should look something like:
27/1/2000
31 days in the month
3. Use a for loop to display dates.
a. Using a for loop, extend your program so that it prints out all the dates between
your specified day/month/year and the end of the month. For example:
if your day variable is 27,
and your month variable is 1 (January),
and your year variable is 2000,

Oracle10g: Java Programming 5-22


Practice 5: Controlling Program Flow (continued)
3. Use a for loop to display dates. (continued)
then your program must display all the dates between 27 January and 31 January
inclusive, as follows:
27/1/2000
28/1/2000
29/1/2000
30/1/2000
31/1/2000
Hint: You must use the result of the switch statement in question 2 to determine the
last day in the month.
b. Compile and test your program making sure it works with a variety of dates.
c. Modify your program so that it outputs a maximum of 10 dates. For example, if
your day/month/year variables are 19/1/2000, the output must now be as follows:
19/1/2000
20/1/2000
21/1/2000
22/1/2000
23/1/2000
24/1/2000
25/1/2000
26/1/2000
27/1/2000
28/1/2000
Make sure your program works for dates near the end of the month, such as
30/1/2000. In this situation, it must output only the following:
30/1/2000
31/1/2000
d. Compile your program, and test it with a variety of dates to make sure it still
works.
4. Determine whether the year you specify is a leap year. You use the boolean
operators && and ||.
a. Build a boolean statement that tests year to see whether it is a leap year. A
year is a leap year if it is divisible by 4, and it is either not divisible by 100, or it
is divisible by 400.
b. Modify your switch statement from question 2, to cater for leap years.
Remember that February has 29 days in a leap year and 28 days in nonleap years.
c. Build and test your program with a variety of dates. The following table includes
some sample leap years and nonleap years you may want to use as test data:
Leap years Non-leap years
1996 1997
1984 2001
2000 1900
1964 1967

Oracle10g: Java Programming 5-23


Practice 5: Controlling Program Flow (continued)
5. You must calculate the date on which each rental is due. The due date is the current
date plus 3 days. For this test, you use a number of different dates for the current date,
not just today’s date.
a. Declare three variables to hold the due date (dueDay, dueMth, dueYr).
b. Add a variable to hold the rental period of 3 days.
c. Add the due date calculation to your program that adds the rental period to the
date you used in step 1. Display your original date and the due date in a
meaningful way. The output must look something like:
Rental Date: 27/2/2001
Number of rental days: 3
Date Due back: 2/3/2001
d. Test your routine with several dates; try 29/2/2001.
e. What are the problems you must address?
f. Modify your program to catch input dates with invalid months (not 1 to 12).

6. In building a software solution to a problem, you must determine the size and scope of
the problem and address all the pertinent issues. One of the issues is what to do if the
rental period extends beyond the current month. For example, if the rental date is
August 29 and the rental is for three days, the return date must be September 1, but
with the current solution, it is August 32, which is an obvious error. Acme Video store
rents items only for 10 or fewer days. You must ensure that you take care of the
following:
a. Add code to make sure the calculation results in a valid day.
b. If the rental crosses into a new month, make sure to increment the month.
c. If the rental crosses into a new year, make sure to increment the year.
d. Test your routine with several dates.
e. Modify your program to catch input dates with invalid months (not 1 to 12).

Oracle10g: Java Programming 5-24


Building Applications with
Oracle JDeveloper 10g

Copyright © 2004, Oracle. All rights reserved.

Schedule: Timing Topic


45 minutes Lecture
30 minutes Practice
75 minutes Total
Objectives

After completing this lesson, you should be able to do


the following:
• Create new projects, workspaces, and
applications
• Build Java applications in JDeveloper
• Enhance user interface frame design
• Debug an application by using JDeveloper
debugger
• Define classes by using JDeveloper
• Describe how JDeveloper can be used to build
enterprise applications

6-2 Copyright © 2004, Oracle. All rights reserved.

Lesson Aim
This lesson introduces you to Oracle JDeveloper. You learn how to create new projects and
applications, and how to use the various panes in the IDE to edit source code and modify
design of the user interface frame.

Oracle10g: Java Programming 6-2


What Is Oracle JDeveloper 10g?

• Oracle JDeveloper 10g provides an integrated


development environment (IDE).
• Build, compile, and run Java applications by using
Oracle JDeveloper.
• Use wizards to help build source code.
• View objects from many perspectives: code,
structure, layout, and so on.

6-3 Copyright © 2004, Oracle. All rights reserved.

Building Applications with Oracle JDeveloper 10g


You can use Oracle JDeveloper 10g to build a number of different types of Java
components. This lesson focuses on using the JDeveloper IDE for building applications.
Wizard Driven
A wizard is a graphical tool that guides you step-by-step through the process of defining a
new element in the IDE. Oracle JDeveloper 10g provides a number of wizards, including:
• Application Workspace Wizard: Defines a new application and associated projects
• Applet Wizard: Defines a new Java applet and adds it to the specified project
• EJB Wizard: Defines a new Enterprise JavaBean (EJB) and adds it to the specified
project
• JSP Wizard: Defines a new JavaServer Page (JSP) and adds it to the specified
project
• HTTP Servlet Wizard: Defines a new servlet and adds it to the specified project
Design a User Interface
Oracle JDeveloper 10g provides an interface for designing the visual parts of your program.
JDeveloper enables you to specify the following features of the user interface:
• Size and position of controls
• Properties for each control, such as labels, enabled or disabled status, font, and so on
• Event handler methods

Oracle10g: Java Programming 6-3


Exploring the JDeveloper Environment

Component Palette

System Navigator Code Editor Property Inspector

6-4 Copyright © 2004, Oracle. All rights reserved.

The Oracle JDeveloper 10g Environment


JDeveloper contains four major user interface components. These components are what
you use to edit code, design and manage the user interface, and navigate around your
program.
Component Palette
Properties are attributes that define how a component appears and responds at run time. In
JDeveloper, you set a component’s initial properties during design time, and your code can
change those properties at run time.
System Navigator
System Navigator is made up of two components. The Navigator pane shows a list of files
or classes in a project. The files may be Java source files, .class files, graphics files,
HTML, XML documents, and so on. The Structure pane lists all the methods, fields, and
graphical user interface (GUI) components in a selected class.
Code Editor
Editors are where most of the work takes place; this is where you write code and design
user interfaces. Open an editor by double-clicking the item you want to edit or view.
Property Inspector
Property Inspector is the window that shows the properties and events associated with a
selected component in the design section of an editor.
Oracle10g: Java Programming 6-4
Examining Workspaces

• Contain multiple projects


• Enable you to view
currently used objects
Workspace
Navigator
pane

Structure
pane

6-5 Copyright © 2004, Oracle. All rights reserved.

Application Organization
Oracle JDeveloper 10g uses a well-defined structure to manage Java programming
applications. The structure is hierarchical and supports workspaces, projects, images,
.html files, and so on.
Workspaces
Workspace is the highest level in the control structure. It is a view of all the objects you
currently need, while you are working. A workspace keeps track of the projects you use
and the environment settings while you are developing your Java program. When you open
JDeveloper, the last workspace used is opened by default, so you can resume where you
last stopped working.
Workspaces are stored in files with the extension .jws. You do not edit a workspace file
directly. Whenever you save your workspace, you are prompted to save all the current open
files. To save the open and modified files, select the Save or Save All option from the File
menu.
Note: You can view the content of a workspace file by using any text editor.

Oracle10g: Java Programming 6-5


Application Organization (continued)
Determining Workspaces
Consider workspaces to be a view into the objects currently used. You may choose to
create workspaces, which include projects that were created in different workspaces.
Workspace object groupings can be based around a business area (Accounts Payable,
General Ledger, Accounts Receivable), the phase in a life cycle (analysis, design, deploy)
or the structure of the application (UI, business logic, data structure).

Oracle10g: Java Programming 6-6


What Are Projects?

• Contain related
files
• Manage project and
environment
Project
settings
• Manage compiler
and debug options

Project
files

6-7 Copyright © 2004, Oracle. All rights reserved.

Projects
JDeveloper projects organize file elements used to create your program. A project file has
the file extension .jpr and keeps track of the source files, packages, classes, images, and
other elements that may be needed for your program. You can add multiple projects to your
workspace to easily access, modify, and reuse your source code. You can view the content
of a project file by using any text editor.
Projects also manage environment variables such as the source and output paths used for
compiling and running your program. Projects also maintain compiler, run time, and
debugging options, so you can customize the behavior of those tools per project.
In the Navigator pane, projects are displayed as the second level in the hierarchy under the
workspace.
When you select a .java or .html file in the System Navigator, the Structure pane
displays the elements of the file in a tree format. For example, when you select a .java
source file, the classes, interfaces, methods, and variables are displayed.
To edit source code, double-click the file in the navigation list to display the contents in the
appropriate editor. The Structure pane can be used to quickly locate specific areas of code
in your Java source files and browse the class hierarchy.
When you are working with the visual designer, the Structure pane displays the
components of your user interface and their associated event handling methods in a
hierarchical tree format.
Note: The italic font is used to indicate the file names that have not been saved yet.
Oracle10g: Java Programming 6-7
Creating JDeveloper Items

• JDeveloper items are


invoked by selecting
File > New.
• They are categorized by
type:
– General
– Business Tier
– Client Tier
– Database Tier
– Web Tier
• Create any JDeveloper
element.

6-8 Copyright © 2004, Oracle. All rights reserved.

New Elements
You can create any JDeveloper item from this window. The context for creating the item
must be correct. You must have the correct element selected in the Category column to
create the appropriate Item.
All J2SE libraries, used during development, must be available in the run-time
environment.
While creating the workspace, you can define the paths used for the files stored. All the
files are stored using the following convention:
workspace\project\package
Use the Filter By drop-down list to view specific types of elements.

Oracle10g: Java Programming 6-8


Creating an Application Workspace

In the General
category, select
Application
Workspace to invoke
the Property pane.

6-9 Copyright © 2004, Oracle. All rights reserved.

Creating an Application Workspace


The aim in this lesson is to create a simple Java application. The first step is to create a new
application workspace that acts as a container for all the files in the application. The
properties to be completed include:
Application Name
Enter a name for the application. This name is used to categorize all the files in your
application.
Directory Name
Enter a top-level directory for the application or click Browse to locate one. This is where
all your application files are stored during development.
Application Package Prefix
Enter a prefix for all packages associated with this application. The prefix you assign
defines the root package for every project in the application.
Application Template
Select a template for the application. Click Manage Templates to edit an existing template
or to create a new one. An application template provides a way to partition the application
into projects that reflect a logical separation of the overall work. Each template provides a
different structure to how the files are organized. For this course, use the Java
Application [Java, Swing] template.

Oracle10g: Java Programming 6-9


Specifying Project Details

6-10 Copyright © 2004, Oracle. All rights reserved.

Project Properties: Specifying Project Details


A variety of project properties can be created and modified. The properties are categorized
and are accessible from the nodes on the left side of the pane.
The package name is the default for the project, so any Java source created in the project is
automatically put in the specific package, because the package keyword is added to the
source file with the name specified.
Note: The output directory is added as the first path in the –classpath parameter for
applications at compile and run time. In addition, together with this output directory, the
libraries selected in the next screen of the wizard form the CLASSPATH for the code in this
project.
In particular, also note that the package name is implicitly appended to the project source
and output directories as the target directories for the saved source (.java) files and for
the compiled (.class) files respectively.

Oracle10g: Java Programming 6-10


Selecting Additional Libraries

6-11 Copyright © 2004, Oracle. All rights reserved.

Project Properties: Selecting Libraries


In the Libraries Property, select the version of the J2SE you will be using. You can add any
existing libraries and create and add new ones.
The libraries listed here are delivered by Oracle, Sun Microsystems, or third-party
packages and classes. Typically, they are delivered as classes in a .jar file. Use the
existing ones, or add your own.
Note: All the selected libraries become part of the project application CLASSPATH in
addition to the classes compiled into the project output directory. All the classes in the
libraries and output directory will need to be deployed with the application.

Oracle10g: Java Programming 6-11


Adding a New J2SE

New J2SE definitions include:


• Java executable
• A classpath
• A source path
• A doc path

6-12 Copyright © 2004, Oracle. All rights reserved.

Defining a New J2SE in JDeveloper


JDeveloper uses J2SE definitions to describe the installed development kit, or run-time
library. Every JDeveloper project is assigned a specific J2EE version, and each project has
access to any of the defined J2EE versions. Each project then uses this definition to
determine what version of the Java API to use, to compile and run your code.
Each J2EE definition includes:
• Java executable used to launch programs
• A classpath containing the classes available in the J2SE environment
• A source path housing the source files for the J2SE classes
• A document path storing the Javadoc files for the J2SE classes
Library Types
A J2SE library can be defined and used as one of the three types:
• System: New system libraries will reside with the predefined system libraries,
available to all users of an installation of JDeveloper.
• User: These libraries reside in the user home for a particular user, and only the
current user has access to their definitions.
• Project: These libraries are associated with a specific project, and are available to
anyone using that project, but only when using that project.

Oracle10g: Java Programming 6-12


Looking at the Directory Structure

JDeveloper creates and stores .java and .class files


by using the following convention:
• <ORACLE_HOME>\jdev\mywork
• Followed by the workspace
name
• Followed by the project name
– \classes\<package name>\
– \src\<package_name>\
• Followed by class and src files

6-13 Copyright © 2004, Oracle. All rights reserved.

Storing Files in JDeveloper


When installing JDeveloper, the installer creates an ORACLE_HOME directory for the
JDeveloper product files. A subdirectory for all the JDeveloper executables and support
code is stored in the \jdev\ directory. One of the directories under \jdev\ is
\mywork\, which is used to store the files you create in JDeveloper.
Each workspace has its own directory, and below it a directory for each project. The name
of the project directory is dependent on the type of application workspace you create. For
Web development, two projects are created—one for the Model and the other for the
View. For a Java\Swing application a single project is created named Client. Each Java
file you create is stored in a \src\<package_name>\ directory under the project it
was created in. All the compiled files are stored in the \classes\<package_name>\
directory. However, you can create your workspace and project directories anywhere in the
file system.

Oracle10g: Java Programming 6-13


Exploring the Skeleton Java Application
Contains application and frame classes

6-14 Copyright © 2004, Oracle. All rights reserved.

What Files Does the Java Skeleton Application Contain?


To summarize the last few pages, following is a list of the three files that have been
generated by JDeveloper so far:
• An <application>.java file containing the application class, which is the top-level
class in the application. The application class contains the main() method for the
program. When the application is executed, Java calls this main() method as the
starting point for the whole application.
• A <frame>.java file containing the frame class that specifies the appearance and
the behavior of the GUI window in the application
• A <frame_AboutBoxPanel>.java file for the Help/About frame
Instructor Note
Demonstration
To better show the students some of the other functionalities, do a quick modeling
demonstration. After creating a DB connection, you create a new project, right-click and
select New > UML Diagram. After you have created it (empty page), scroll into your DB
connection and drag the Employees table to the empty page. Then, it writes your UML
for you.

Oracle10g: Java Programming 6-14


Finding Methods and Fields
Find methods and fields by using the Structure pane.

6-15 Copyright © 2004, Oracle. All rights reserved.

Using the Structure Pane to Navigate Source Code


As projects evolve, classes can become quite large, containing several methods and fields.
To help you find your way around complex classes, JDeveloper provides the Structure
pane, which is the bottom pane in the System Navigator.
The Structure pane lists all the methods and fields for the currently selected class. If you
double-click an item in the Structure pane, JDeveloper takes you to the definition of that
item in the source code, displaying and highlighting it in the Code Editor. For example, if
you double-click the helpAbout_ActionPerformed entry in the Structure pane, the
start of the helpAbout_ActionPerformed method is highlighted in the Code Editor.
You can also search the Navigator and Structure pane components for strings by using a
[letter]. The search is a hierarchical search based on the first letter of each component. As
you type in subsequent letters, the structure list highlights the first component that begins
with that set of letters. If there is more than one occurrence, use the up and down arrow
keys to scroll through the result set.

Oracle10g: Java Programming 6-15


Supporting Code Development
with Profiler and Code Coach

• Improve code quality with Code Coach.


• Evaluate execution stack with Execution Sample
profiler.
• Examine heap memory usage with Memory
profiler.
• Analyze event occurrence and duration with Event
profiler for:
– JVM events
– Business Components for Java events
– Custom events

6-16 Copyright © 2004, Oracle. All rights reserved.

Code Coach
Code Coach creates more efficient Java programs by helping you write higher quality,
better performing code. You run Code Coach on a class, which returns advice on how to
make your code better.
Profilers
Profilers gather statistics on your program, which enables you to more easily diagnose
performance issues.With Profilers, you can examine and analyze your data.
Code Editor
When you pause momentarily while typing in Code Editor, JDeveloper automatically scans
your code to look for syntax errors. If there are any, you will see them represented in the
Structure pane or in the Log window.
Code Insight
If you pause after typing a “.” (period), JDeveloper invokes Code Insight. Code Insight
displays valid methods and members from which you can select. JDeveloper also provides
Code Insight for parameters when you pause after typing “(” (left parenthesis).
Instructor Note
You may want to encourage students to explore these features. JVM is required to use the
Code Coach and Profiler features. To use a custom J2SE version (other than the one
provided by JDeveloper), they can follow the installation guide provided by JDeveloper on
how to install the OJVM on the custom J2SE.
Oracle10g: Java Programming 6-16
Customizing JDeveloper

Customize the IDE


• Look and feel
• General environment
• Dockable windows
• Component Palette
• Load preset keymaps
Rename classes and packages by using refactoring.

6-17 Copyright © 2004, Oracle. All rights reserved.

JDeveloper Coding Features


Customizing the IDE
You can customize JDeveloper’s default display options (such as, whether or not the splash
screen is displayed at start up, or whether dockable windows are always on top), as well as
other general behavior (such as, whether JDeveloper will automatically reload externally
modified files and whether output to the Log window is automatically saved to a file).
• Customize the general environment for the IDE.
• Customize dockable windows for the IDE.
• Customize the Component Palette.
• Load preset keymaps and customize individual accelerators. (You can take advantage
of the several existing keymap sets in JDeveloper or begin with an existing keymap
and then customize it to suit your own coding style by changing which keyboard
shortcuts, or accelerators, map to which actions.)
• Customize options for the Code Editor.
• Add external tools to JDeveloper.
Refactoring
Refactoring is the process of improving an application by reorganizing its internal structure
without changing its external behavior. When you refactor an application, you may want to
move or rename individual classes, or move groups of classes to a different package. In
JDeveloper, you can make these changes without breaking any dependent files on which
your project relies, as these files are automatically updated for you.

Oracle10g: Java Programming 6-17


Using the Help System

6-18 Copyright © 2004, Oracle. All rights reserved.

Using the Help System


JDeveloper is a comprehensive development tool and provides many features that help you
develop Java code quickly and effectively.
The JDeveloper Help System
To make the best use of the tools, the libraries, and the Java language itself, JDeveloper
provides a comprehensive Help system that covers all aspects of Java development.
Select Help > Help Topics in the main menu to launch the Help system:
• From the browser, select one of the topics from the contents hierarchy at the left of
the window. After you select a topic, the topic expands to display subtopics.
• Select the topic you are interested in and right-click it, to display the Help text in a
window.
• Use hypertext links to navigate within a topic or to related topics.
Instructor Note
At this time, you may want to show a demonstration of the javadoc and explain how to use
it. A demonstration should be the best way to explain how to use the javadoc.

Oracle10g: Java Programming 6-18


Obtaining Help on a Topic

Use [F1] to invoke


context-specific Help.

6-19 Copyright © 2004, Oracle. All rights reserved.

Obtaining Help on a Topic


Pressing the [F1] key invokes a context-sensitive Help topic window.
Javadoc
Javadoc is a tool that parses the declarations and documentation comments in a set of
source files and produces a set of HTML pages describing the classes, inner classes,
interfaces, constructors, methods, and fields.
When working in the Java Code Editor, you can quickly access the specific Javadoc entry
for any element in the source file. To browse the specific Javadoc entry for a given class,
member, or method: Select the appropriate code element, right-click, and choose Quick
Javadoc. A pop-up window with Javadoc for just that element now appears.

Oracle10g: Java Programming 6-19


Oracle JDeveloper 10g Debugger

• Helps find and fix program errors:


– Run-time errors
– Logic errors
• Allows control of execution
• Allows examination of variables

6-20 Copyright © 2004, Oracle. All rights reserved.

Debugging
Debugging is the process of looking for program errors that keep your program from doing
what you intended. There are two basic types of program errors: run-time errors and logic
errors. Remember that the compiler catches any syntax problems.
If your program successfully compiles but gives run-time exceptions or hangs, then you
have a run-time error. That is, your program contains valid statements but is encountering
errors when they are executed. For example, you may be trying to open a file that does not
exist or you may be trying to divide by zero.
Logic errors are errors in the design and implementation of your program. That is, your
program statements are valid and do something, but the results are not what you intended.
These types of errors are usually the most difficult to find.
The debugger enables you to control the execution of your program. It provides the ability
to execute parts of the code step-by-step. You can also set breakpoints that pause the
program execution when it reaches the line of code you want to examine.
While the program is paused, you can inspect and even modify program variables. This
helps you examine loops and other control structures to make sure that what is happening is
what you intended.

Oracle10g: Java Programming 6-20


Debugging (continued)
Breakpoints
Breakpoints are a convenient way of tracing the cause of a problem in a program. When the
debugger encounters a breakpoint, it pauses the program execution. You can resume
execution, stepping through the code line-by-line, examining variables and conditions, or
stop the program. You can set as many breakpoints as you want.

Oracle10g: Java Programming 6-21


Setting Breakpoints

Setting breakpoints:
• Manage multiple breakpoints
• Manage conditional breakpoints
• Define columns displayed in window
– Description
– Type
– Status, and so on
• Control scope of action
– Global > Workspace > Project

6-22 Copyright © 2004, Oracle. All rights reserved.

Breakpoints
Setting Breakpoints
Set a breakpoint by selecting a line of code in the source code window, right-click and
select Toggle Breakpoint. You can click in the left margin to set a new breakpoint. After
you start debugging, breakpoints that are known to be valid will have a check mark in the
breakpoint icon. A breakpoint without a check mark may mean that this line does not
represent code where the debugger can stop, but it may just mean that the debugger does
not know yet whether the breakpoint is valid or invalid.
Viewing Breakpoints
To view all the currently enabled breakpoints, select View > Breakpoints from the menu
bar. A window showing all the breakpoints set in the program appears. To disable or
remove a breakpoint, right-click the breakpoint, and select an action from the menu.
Conditional Breakpoints
To set the conditions on which you want a breakpoint to be activated, right-click a
breakpoint, and select Edit Breakpoint. In the Breakpoint Conditions tab, you can specify
information about how and when the breakpoint is activated including valid Java
conditional statements and thread-specific conditions.

Oracle10g: Java Programming 6-22


Breakpoints (continued)
Display Settings
To select which columns are displayed in the breakpoints window, right-click in the
breakpoints window and select Settings. In the dialog box, select Debugger > Breakpoints
in the navigator tree on the left, and select the columns to display.
Scope Settings
To select the scope for the debugging, right-click in the breakpoints window, select Change
Scope, and select the appropriate value.

Oracle10g: Java Programming 6-23


Using the Debugger Windows

View Debug information:


• Classes: Displays list of loaded classes and status
• Watch: Evaluates and displays expressions
• Monitors: Displays information about active
monitors
• Threads: Displays the names and statuses of all
threads
• Smart Data: Analyzes source code near execution
point
• … and more

6-24 Copyright © 2004, Oracle. All rights reserved.

Debugging a Java Application


Make sure that the project is selected, and click the Debug icon. Alternatively, from the
Menu bar you can select Debug > Debug <Project Name>.jpr. This causes any files to be
compiled if necessary and then starts your program in debug mode.
Debugging Windows
As soon as you start the debugger, three tabs are added to a new window at the bottom right
side of JDeveloper: the Smart Data tab, the Data tab, and the Watch tab. A new tab is added
to the existing message window. This tab enables you to monitor the code as it executes.
Fields for each window can be modified in the Tools > Preferences menu, in the Debugger
node.
• Smart Data tab: Displays only the data that appears to be relevant to the source code
you are stepping through
• Data tab: Displays all the arguments, local variables, and static fields for the current
method
• Watch tab: Displays the current value of an expression that you have flagged to be
displayed during the execution of the program
Remote Debugging
You may manually launch the program you want to debug, then start the debugger. In the
Host list, select the name of the machine where the program has been started. After the
debugger is attached to the running program, remote debugging is similar to local
debugging.
Oracle10g: Java Programming 6-24
Stepping Through a Program

Step through a program by using the buttons on the


Debugger toolbar:
• Start the debugger.
• Resume the program.
• Step over a method call.
• Step into a method call.
• Step out of a method call.
• Step to the end of the method.
• Pause execution.
• Stop the debugger.

6-25 Copyright © 2004, Oracle. All rights reserved.

Step Through a Program


• Start the debugger: Executes the program in debug mode. The program will be
paused when it encounters a breakpoint. If no breakpoints have been set, you can
pause program by using the “Pause execution” button.
• Resume the program: Resumes the program after stopping at a breakpoint
• Step over a method call: Executes the method at the current position in the program
at full speed rather than tracing into the method line-by-line
• Step into a method call: Traces into a method line-by-line. This is useful when you
suspect that the method may be the one that is causing the problem.
• Step out of a method call: Enables you to step out of the current method and return
to the next instruction of the calling method
• Step to the end of the method: Jumps to the end of the method
• Pause execution: Pauses a running program at its current position
• Stop the debugger: Stops the execution of a running program. This is a useful way of
killing the program.

Oracle10g: Java Programming 6-25


Watching Data and Variables

• The Smart Data tab displays analyzed variables


and fields.
• The Data tab displays arguments, local variables,
and static fields from the current context.
• To watch other variables:
– Select a variable in the source window and right-
click.
– Select Watch... at Cursor from the context menu.
– View the variable in the Watch tab.
– Right-click a data item to modify it.

6-26 Copyright © 2004, Oracle. All rights reserved.

Watching Data and Variables


Viewing Analyzed Data in the Smart Data Tab
The debugger analyzes the source code near the execution point looking for variables and
fields expressions that are used in the lines of code. By default, the debugger analyzes only
one line of code for each location.
Viewing Local Variables in the Data Tab
The Data tab is the lower window that is displayed when you select the Debug tab at the
bottom of System Navigator. The Data tab automatically displays a list of local variables,
static fields and arguments that are in scope. As you jump from one method to the next, the
list of variables displayed in the Data tab changes.
Selecting Other Variables and Expressions to Watch
Other variables and expressions can be viewed by following the steps described in the
slide. Select a variable or expression such as age+10. Right-click the variable or
expression and select “Watch… at Cursor” from the context menu. A dialog box appears
displaying the selected variable or expression; click OK to accept it and add it to the Watch
tabbed page. View the variables you have selected to monitor in the Watch tabbed page. To
modify a data value, right-click it and select Modify Value from the context menu.

Oracle10g: Java Programming 6-26


Summary

In this lesson, you should have learned how:


• JDeveloper builds, debugs, and runs all types of
Java applications
• JDeveloper can be used to develop:
– Java applications
– Java servlets
– JSPs
– EJBs
• JDeveloper can be used to build enterprise
applications

6-27 Copyright © 2004, Oracle. All rights reserved.

Additional Reading
You can find out more about the features of JDeveloper on the Oracle Technology
Network, http://otn.oracle.com. The following are some examples of the topics covered:
Overview
Overview of JDeveloper, The JDev IDE, Creating a BC4J Application, Java Concepts in
JDeveloper, Naming Conventions, Debugging the Code, Deployment Alternatives
ADF Application Development Framework
Reduces the Complexity of J2EE Development by providing Visual and Declarative
Development, Increases Development Productivity, Encourages J2EE Best Practices by
Implementing Standard J2EE Design Patterns–MVC, Provides a Flexible and Extensible
Environment by allowing Multiple Technology Choices and Development Styles
JSPs
JSP Overview, Creating JSPs, JSP Components
Advanced Topics
HTML in JDev Environment, JavaScript in JDev Environment, Customizing & Extending
the IDE, Overview of the Class Modeler, Overview of the Activity Modeler, Security

Oracle10g: Java Programming 6-27


Practice 6: Overview

This practice covers:


• Exploring the Oracle JDeveloper 10g IDE
• Creating a workspace and project
• Including application files from the earlier lesson

6-28 Copyright © 2004, Oracle. All rights reserved.

Practice 6: Overview
Note: In this practice, you use the E:\labs\les06 directory.
The practices in lessons 3, 4, and 5 are written to help you better understand the syntax and
structure of the Java language. Their sole purpose is to instruct and is not intended to reflect
any set of application development best practices.
The purpose of the practices from lesson 6 to the end of the course is different. Starting in
lesson 6, you use JDeveloper to build an application employing techniques you will use
during real-world development. The practices continue to support the technical material
presented in the lesson, while incorporating some best practices you will use while
developing a Java application.
In the Applications – Navigator node, expand the OrderEntryWorkspaceLes<nn>
– OrderEntryProjectLes<nn> - Application Sources – oe, and
double-click the UML Class Diagram1 entry. This diagram displays all the classes
created to this point in the course.

Oracle10g: Java Programming 6-28


Practice 6: Building Java by Using Oracle JDeveloper 10g
Goal
In this practice, you explore using the Oracle JDeveloper 10g IDE to create a workspace
and a project, so that you manage your Java files more easily during the development
process. You practice how to use the rapid code generation features, such as the text Code
Editor and debugger. You practice how to create one or more Java applications and classes
by using the rapid code generation features, such as the text Code Editor and debugger.
More importantly, you now start using JDeveloper for most of the remaining lab work for
this course (occasionally returning to the command line for various tasks). By the end of
the course, you will have built and deployed the course GUI application while continuing
to develop your Java and JDeveloper skills.
Note: In this practice, you use the files found in the E:\labs\les06 directory. They
are similar to the ones you created in earlier practices, with subtle differences and the
introduction of a class to manage the data, named DataMan. This file will be used in later
labs.
Your Assignment
• In part 1, you explore JDeveloper default rapid code generation features by creating a
new default workspace using the default JDeveloper paths, and then create a default
project from an existing code in the E:\labs\les06 directory.
• In the extra credit section, you run and test the application using the debugger.
Create a Workspace and Project
Launch Oracle JDeveloper 10g from the desktop icon provided, or ask your instructor for
instructions on how to start JDeveloper. In this practice, you must use the E:\labs\les06
directory.
1. Create a new Workspace and a new Project.
a. Select File > New to invoke the JDeveloper New Gallery window. This a
launching point for creating all your Java source code. The New Gallery
window is divided into two columns, Categories and Items. The list of items
available depend on the category selected.
b. The General category is selected by default the first time “New” is selected. If it
is not highlighted, select it now. Then, either double-click the Workspace item
(or click Workspace and then click the OK button).
c. Change the workspace directory name field to E:\labs\les06.
You can use the Browse button to locate the directory, if desired.
d. Enter the following workspace file name: OrderEntryWorkspace.jws
e ote lear the Add New Empty Project check
box lick the button and save
your workspace
2. Create a new project called OrderEntryProject.jpr in the new workspace,
and populate the project with files existing in E:\labs\les06\src\oe
directory
a. Right-click the OrderEntryWorkspace.jws workspace, and select the
New Project… menu item. Then double-click the Project from Existing
Source entry in the items of the New Gallery window.

Oracle10g: Java Programming 6-29


Practice 6: Building Java by Using Oracle JDeveloper 10g (continued)
b. Click the Next button on the Welcome screen. In Project with
Existing Source Wizard – Location, change the
roject ame to OrderEntryProject and
select the E:\labs\les06 directory Then, click the Next
button.
c. In “Project with Existing Source Wizard - Add Source
Files and Directories”, click the Add button. Navigate to the
subdirectory containing the Java source files, which are in the src\oe
subdirectory of the E:\labs\les06 directory tree.
d. Select all the .java files in the E:\labs\les06\src\oe
directory and click the Open button
he wi ard displays the selected
files under the Refine Files to Be Added list
lick the Next button
e n Project with Existing Source Wizard - Source
Paths, confirm the Output Directory is E:\labs\les06\classes, and
leave the HTML Root field empty. Then click the Next button.
f. In Project with Existing Source Wizard - Run Settings,
select the file OrderEntry.java, under the E:\labs\les06\src\oe
directory as the “Main Entry Point.” Then click the Next button.
g n Project with Existing Source Wizard – Finish, click
the Finish button
h ouble click the OrderEntryProject and
select the nput ath node et the
efault ackage to oe
i ave all your work hen compile the
files in the project ight click
OrderEntryProject, and select the Rebuild Project
menu option r use the Project > Rebuild
OrderEntryProject.jpr menu item ay
attention to the compilation
progress in the Log window.
j elect the Run > Run OrderEntryProject.jpr menu
item to run the default
application or right click the
OrderEntry.java file and select Run
OrderEntry.java from the context menu
iew the output results of your
application in the Log window
Optional Extra Credit
Debugging the Course Application
In this part of the practice, you run the application in debug mode, and examine how the
debugger works.
3. Run the OrderEntry application in debug mode.
a. Open Order.java file in the Code Editor by double-clicking the file name, or
right-clicking the file name and choosing Code Editor from the context menu.
b. Remove the comments lines from the System.out.println, and set
breakpoints on the following two statements:
item1Total Oracle10g: Java Programming 6-30
= item1.getItemTotal();
...
Practice 6: Building Java by Using Oracle JDeveloper 10g (continued)
c. In the Navigator, select the OrderEntry.java file, right-click and select
Debug from the context menu.
JDeveloper creates a new debugger tabbed page that opens at the bottom right
of the JDeveloper window. The execution of the code stops at your first
breakpoint, as indicated by a red arrow. The red arrow indicates the next line
that is about to be executed when you resume debugging.
The Log/Debug window is modified to contain two tabs—a Log tab and a
Breakpoints tab— in which you can view all the breakpoints you have set. The
Log tab must display the output results generated by the application. Resize the
windows, if required.
d. Visually select the Smart Data tab in the bottom right window, known as the
Debug window.
Note: If the Debug window is not visible, display it by selecting the View >
Debug Windows > Smart Data menu item. The check box next to the Data item
must be selected to make it visible; otherwise, the tab will be removed from the
Debug window displayed.
e. Locate the item1 variable in the Smart Data tabbed page and expand it. Using
the values of quantity and unitPrice, calculate the item1Total of the
order. What is its present value of item1Total?
(Hint: The value for quantity was displayed as 2 and the value for unitPrice was
displayed as 2.95.) But the value item1Total was showing “out of scope” in the
Smart Data window
f. Select the Debug > Step Over menu item (alternatively, press [F8] or click the
appropriate toolbar icon) to calculate the item1Total. Note the changes to
the item1Total instance variable in the Smart Data tabbed page of the
Debug window. Was your calculation in the previous step correct?
g. In the top toolbar, press the Resume [F9] button (or select the Debug > Resume
menu item). The red arrow in the Code Editor advances and highlights the line
with the next breakpoint detected in the code execution sequence.
h. Continue by selecting the Debug|Resume menu (F9 key, or click the toolbar
button) until the program is completed. You need to click it only once.
i. Remove the breakpoints from the Order.java source by clicking each
breakpoint entry (red dot) in the margin for each line with a breakpoint.

Oracle10g: Java Programming 6-31


Creating Classes and Objects

Copyright © 2004, Oracle. All rights reserved.

Schedule: Timing Topic


70 minutes Lecture
25 minutes Practice
95 minutes Total
Objectives

After completing this lesson, you should be able to do


the following:
• Define instance variables and methods
• Define the no-arg (default) constructor method
• Instantiate classes and call instance methods
• Perform encapsulation by using packages to
group related classes
• Control access with public and private access
modifiers
• Use class variables and methods

7-2 Copyright © 2004, Oracle. All rights reserved.

Lesson Aim
This lesson shows you how to create a new class definition using Oracle JDeveloper.You
define instance variables and methods for the class. The lesson also shows how to create
objects using new, basic object initialization and how to manipulate the objects using
instance methods.

Oracle10g: Java Programming 7-2


Lesson Aim (continued)
Class Definitions
Java is an object-oriented programming language. All the data or attributes and behavior of
objects are defined within classes. You use classes for everything you do in Java.
Code
Object orientation is about modeling real-world objects or concepts in software. Java forces
you to think in an object-oriented way, because every piece of Java code must live in a class
definition. There are no global functions defined outside the scope of a class.
Data
Java uses variables to store information about an object. The variables can store primitive
values or references to other objects. Variables also are defined only within classes.
Packages
Packages group logically related classes by application and provide access control. Java uses
packages to control which classes can be seen and accessed by classes outside of the
package.

Oracle10g: Java Programming 7-3


Using Java Classes

Methods Objects

Contained in a class Packages

Attributes Object
references

7-4 Copyright © 2004, Oracle. All rights reserved.

What Is a Class?
A class is a template or blueprint that is used in creating multiple objects. A class
encapsulates all the data and behaviors that make up an object. When you ask Java to create
or instantiate a class, Java uses the class definition as a template for building the new object.
A class contains attributes that are assigned to all new objects of that class. Attributes are the
information or data that describe, classify, categorize, or quantify an object. Each object of a
given class has its own set of the class attributes. For example, an object of the Customer
class may have a name, a billing address, and a telephone number attribute.
Data that is stored in an object can be primitive data types, such as integers or characters, or
references to objects.
A class also contains methods, or functions, that specify the behavior or actions that an
object can perform. For example, a customer may rent a video, make a payment, or change
his or her billing address.
Java uses packages to group classes that are logically related. Packages consist of all the
classes in a subdirectory. They are also used to control access from programs outside of the
package.

Oracle10g: Java Programming 7-4


Comparing Classes and Objects

Movie
• An object is an
instance of a public void displayDetails()
class.
• Objects have public void setRating()
their own
memory. private String title;
• Class definitions
private String rating;
must be loaded
to create
instances.
mov1 mov2
title: “Gone with…” title: “Last Action…”
rating: “PG” rating: “PG-13”

7-5 Copyright © 2004, Oracle. All rights reserved.

Classes and Objects


A class is a template for building objects of that class. In object-oriented terminology, an
object is an instance of a class. Each object of that class has the same data structure and
operations. However, the values that are held in this data structure are unique to each object;
these values are therefore called instance variables. The operations of an object act on the
instance variables in that object.
The class contains variables and methods called members. Those members owned by the
class are “static members” and those owned by the objects from the class are called
“instance members”
In the case of the Movie class, each individual movie is an instance of Movie. “Gone with
the Wind” is one distinct instance of Movie while “Last Action Hero” is another. Each has
its own set of variables that are separate and distinct from the variables of any other movie,
or object, of the Movie class.
Each new object is identified within Java by a unique object reference. Java distinguishes
between objects by using this reference. Objects are uniquely identifiable even if all their
properties are the same.

Oracle10g: Java Programming 7-5


Creating Objects

• Objects are typically created by using the new


operator:
ClassName objectRef = new ClassName();

• For example, to create two Movie objects:


Movie mov1 = new Movie("Gone ...");
Movie mov2 = new Movie("Last ...");

title: “Gone with…” title: “Last Action…”


rating: “PG” rating: “PG-13”

7-6 Copyright © 2004, Oracle. All rights reserved.

Creating New Objects


In Java, you can create objects by using the new operator. The new operator creates an
instance of a class and returns the reference of the new object. For example:
Movie mov1 = new Movie();
This statement creates an instance variable of the Movie type named mov1. It then creates
a new instance of Movie by using the new operator and assigns the object reference to the
mov1 instance variable. It is important to remember that the new operator returns a
reference to the new object that points to the location of that object in memory.

Oracle10g: Java Programming 7-6


Using the new Operator

The new operator performs the following actions:


• Allocates and initializes memory for the new
object
• Calls a special initialization method in the class,
called a constructor
• Returns a reference to the new object
Movie mov1 = new Movie("Gone with…");

mov1 title: “Gone with…”


(When instantiated) rating: “PG”

7-7 Copyright © 2004, Oracle. All rights reserved.

Anatomy of the new Operator


The new operator performs the following three tasks:
• Allocating memory for the new object. It knows how much memory is required by
looking in the class definition to see what instance variables are defined in the class.
• Calling a constructor to initialize the instance variables in the new object. A
constructor is a special method that is supplied by the class.
• Returning a reference to the newly created object. To refer to this object in the future,
you must store this reference in a variable.
Separating Variable Declaration from Object Creation
The declaration of an object reference and the creation of an object are completely
independent. In the previous examples, these two parts were combined in a single statement:
Movie mov1 = new Movie();
However, you can achieve the same effect with two separate statements, as follows:
Movie mov1; // Declare an object reference,
// capable of referring to a Movie.
mov1 = new Movie(); // Create Movie object, and return the
// reference to the mov1 variable.

Oracle10g: Java Programming 7-7


Comparing Primitives and Objects

Primitive variables Object variables


hold a value. hold references.

int i; Movie mov1;


mov1
i 0
null

int j = 3; Movie mov1 = new Movie();

j 3 mov1
title: null
rating: null

7-8 Copyright © 2004, Oracle. All rights reserved.

Primitive Variables and Object Variables


Primitive variables are treated very differently from object variables in Java. It is important
to understand what are the differences.
Primitive Variables
When you declare a primitive variable, Java allocates a chunk of memory to hold a variable
of the specified primitive type. If you define a primitive variable as an instance or a class
variable, then the variable is initialized to 0 if it is a number, false if it is a Boolean, or
‘\0’ if it is a char.
Primitive variables hold their values directly—for example, if you declare an int variable
and assign it the value 3, then the value is stored directly in the four bytes of the int.
Object Variables
When you declare an object variable, you also receive a chunk of memory, but this memory
is only large enough to hold a reference to an object. You may find it useful to think of a
reference as a “pointer” to an object.
As mentioned previously, declaring an object variable does not create an object of the
specified class. Consequently, an object instance variable is initialized to null to indicate
that it does not yet refer to any object. Use the assignment operator to make an object
variable refer to an object. The assignment can be to an existing object or a new object by
using the new operator.

Oracle10g: Java Programming 7-8


Using the null Reference

• A special null value may be assigned to an object


reference, but not to a primitive.
• You can compare object references to null.
• You can remove the association to an object by
setting the object reference to null.
Movie mov1; //Declare object reference

if (mov1 == null) //Ref not initialized?
mov1 = new Movie(); //Create a Movie object

mov1 = null; //Forget the Movie object

7-9 Copyright © 2004, Oracle. All rights reserved.

More About null


Consider the following statement:
Movie mov1 = null;
This declares a variable called mov1 with a special reference called null. This indicates
that the reference does not refer to a real object yet.
Checking Object References Against null
null is a keyword in the Java language. You can use it with the equality operator to check
whether an object reference has been initialized or not:
if (mov1 == null) {
// The mov1 variable has not been initialized,
// so do something to initialize it …
}
Discarding an Object
When you have finished using an object, you can set its object reference to null. This
indicates that the variable no longer refers to the object. When there are no more live
references to an object, the object will be marked for garbage collection.
The Java Virtual Machine (JVM) automatically decrements the number of active references
to an object whenever an object is dereferenced, goes out of scope, or the stored reference is
replaced by another reference.

Oracle10g: Java Programming 7-9


Assigning References

Assigning one reference to another results in two


references to the same object:

Movie mov1 = new Movie("Gone...");


mov1

title: “Gone with…”


Movie mov2 = mov1; rating: “PG”

mov2

7-10 Copyright © 2004, Oracle. All rights reserved.

Different Object References Can Refer to the Same Object


As previously mentioned, when you declare an object reference variable, it is initialized to
null. Before you can use that variable, you must initialize it; typically, you initialize it
with a reference to a new object by using the following syntax:
Movie mov1 = new Movie();
However, it is also possible to initialize an object reference to an existing object as follows:
Movie mov2 = mov1;
This is perfectly legal Java syntax, but there is still only one Movie object. When you
assign one object reference to another object reference, you end up with two references to
the same object, not a copy of the other object.
The Object Can Be Accessed Through Either Reference
You can access the same object through either reference; however, there is still only one
object.
You can change either reference to refer to a different object without affecting the other
reference. However, if you really need a separate object, rather than multiple references to a
single object, then you must create a new object.
Instructor Note
if (mov1 == mov2) returns true because both of them address the same memory
space.

Oracle10g: Java Programming 7-10


Declaring Instance Variables

Instance variables are declared within the class, but


outside the methods or instance or static intializers.
public class Movie {
public String title;
public String rating;
public float getPrice(){
return price; mov1
} title: null
rating: null
}
mov2
Create movies: title: null
rating: null
Movie mov1 = new Movie();
Movie mov2 = new Movie();

7-11 Copyright © 2004, Oracle. All rights reserved.

Declaring Instance Variables


Instance variables must be declared within the class definition. In this example, these
instance variables have been declared as public to allow users of the class to access them
directly. Although this is not a good practice, it is done here to keep the example simple.
Declaring instance variables as public is a violation of encapsulation; after you have seen
how to write instance methods, the instance variables will be made private to prevent
them from being manipulated directly by users of the class.
What Does an Object Look Like?
The example creates two instances of the Movie class. To put it in another way, two
Movie objects have been created: the first Movie object is referenced by mov1, and the
second Movie object is referenced by mov2.
Although these two Movie objects are completely independent, they have an identical data
structure. In other words, each object has its own separate and distinct copies of the instance
variables that you declared in the Movie class.

Oracle10g: Java Programming 7-11


Accessing public Instance Variables

public instance variables can be accessed by using


the dot operator:

public class Movie {


public String title;
public String rating;
… Movie mov1 = new Movie();
} mov1.title = "Gone ...";

if (mov1.title.equals("Gone ... ") )
mov1.rating = "PG";

7-12 Copyright © 2004, Oracle. All rights reserved.

Accessing public Instance Variables


The example shows how to access public instance variables in an object using the dot
operator. This operator takes an object reference on the left and the name of an instance
variable on the right:
objectRef.instanceVarName
Remember that this syntax is allowed only if the instance variable has been declared as
public. In a fully encapsulated object, where the instance variables are private, the
only way to change the state of an object is by calling a suitable instance method on the
object. By exposing the variables as public, anyone using your class can manipulate
instance data without validation or control.
Users can set the rating to anything they want, regardless of business rules governing that
data.
Note: equals(...) compares object types.

Oracle10g: Java Programming 7-12


Defining Methods

A method in Java is equivalent to a function or


subroutine in other languages.

modifier returnType methodName (argumentList) {


// method body

};

7-13 Copyright © 2004, Oracle. All rights reserved.

Methods
When you define a class for an object-oriented program, you implement all of the behavior
of that class in one or more methods. A Java method is equivalent to a function, procedure,
or subroutine in other languages, except that it must be defined inside a class definition. In
other words, there is no support for global methods in Java; every method must be defined
within a class.
Anatomy of an Instance Method
The key components of an instance method are:
• A modifier, such as public or private. If you specify an instance method as
public, then it can be called from anywhere in the program. If you specify a method
as private, then it can be invoked only by other methods in the same class. If no
modifier is specified, then the method can be invoked by any method in any class in
the same package. An instance method may also have a protected or a default modifier.
• A return type. This can be a primitive type, such as int, a class type such as String,
or the void keyword, if the method does not return a value.
• The name of the method. A Java naming convention expects method names to begin
with a lowercase letter. Compound words in the method name must begin with an
uppercase character.
• An optional argument list inside parentheses, separated by commas. If the method does
not take any arguments, then simply leave the parentheses empty.
• The method body enclosed in braces

Oracle10g: Java Programming 7-13


Calling a Method

Objects communicate by using messages:


• All methods are defined within a class and are not
defined globally as in traditional languages.
• When you call a method, it is always in the context
of a particular object.
– myPen.write( ): Object-oriented programming
– Write (myPen): Traditional structured
programming

7-14 Copyright © 2004, Oracle. All rights reserved.

Objects Must Associate with Each Other


Objects must associate with other objects to enable messages to be sent. To send a particular
message, an object must know the recipient of the message. This visibility may be achieved
dynamically and transiently, or an object can “remember” another object through a
reference. (To be pedantic, two classes may associate with each other, and two objects may
have a link between them.)
A link is simply a relationship between objects. In programming terms, it may be
implemented in various ways—for example, a variable in one object containing a reference
to the other object.

Oracle10g: Java Programming 7-14


Specifying Method Arguments: Examples

• Specify the number and type of arguments in the


method definition:
public void setRating(String newRating) {
rating = newRating;
}
• If the method takes no arguments, then leave the
parentheses empty:
public void displayDetails() {
System.out.println("Title is " + title);
System.out.println("Rating is " + rating);
}

7-15 Copyright © 2004, Oracle. All rights reserved.

Specifying Method Arguments or Signature


A method can have zero or more arguments, also known as parameters; this is called the
method signature. When you define a method in a class definition, you specify its formal
arguments in an argument list. Each formal argument is a placeholder for a variable of some
type, either a primitive or an object reference. Like any other variable, each argument must
be declared in terms of its type, such as String, and a name, such as title.
Specifying Multiple Arguments
If a method has multiple arguments, then each declaration must be separated by commas, as
in the following example:
public void setMovieDetails(String pTitle, String pRating) {
title = pTitle;
rating = pRating;

}
Specifying No Arguments
If a method has no arguments, then simply leave the parentheses empty in the definition.

Oracle10g: Java Programming 7-15


Returning a Value from a Method

• Use a return statement to exit a method and to


return a value from a method:
public class Movie {
private String rating;

public String getRating () {
return rating
}
}

• If the return type is void, then no return is needed.


• You can use a return without a value to terminate
a method with a void return type.

7-16 Copyright © 2004, Oracle. All rights reserved.

Returning a Value from a Method


A method can return a single value or expression to a caller of that method. If so, then it
must be defined with a return type such as int in front of the method name, as follows:
public int getLength() {

}
Methods are also allowed to return a reference to an object; this can be useful if you want to
return more than one value. Here is a method that returns a reference to a String object:
public String getRating() {

}
The return Statement
A return statement is the mechanism by which methods pass the required value back to
the calling method. A return statement takes a single value or expression, which must be
compatible with the return type that is specified at the beginning of the method.
When a return statement is encountered, the method exits immediately, and ignores any
statements that lie between the return statement and the closing brace of the method. This
can be used for void methods that have no return value or to exit the function immediately:
return; // Use this syntax to return void from a method

Oracle10g: Java Programming 7-16


Calling Instance Methods

public class Movie {


private String title, rating;
public String getRating(){
return rating;
}
public void setRating(String newRating){
rating = newRating;
}
Movie mov1 = new Movie();
}
String r = mov1.getRating();
Use the dot if (r.equals("G")) …
operator:

7-17 Copyright © 2004, Oracle. All rights reserved.

Use the dot Operator to Call an Instance Method


As with instance variables, you can use the dot operator to call an instance method on an
object. The general syntax is as follows:
objectRef.methodName(arguments … );
If the method takes no arguments, then you still have to include the parentheses when you
call the method, but you leave them empty:
objectRef.methodName(); // Call method that takes no args
Example
In the example, two instance methods in the Movie class are defined: getRating() and
setRating(). You then create a Movie object and check its rating by using
getRating():
if ( mov1.getRating.equals("G") ) …
If necessary, the movie rating can be reset by using setRating():
mov1.setRating("PG");

Oracle10g: Java Programming 7-17


Applying Encapsulation in Java

• Instance variables must be var


declared as private.
aMethod
• Only instance methods can access
private instance variables.
• private decouples the interface
aMethod()
of the class from its internal operation.

Movie mov1 = new Movie();


String rating = mov1.getRating();
String r = mov1.rating; // error: private
...
if (rating.equals("G"))

7-18 Copyright © 2004, Oracle. All rights reserved.

Encapsulation
Encapsulation is a key concept in object-oriented programming. A well-defined class must
decouple its public interface from its internal implementation. To achieve this, all instance
variables of a class must be made private to hide them from users of the class. Only the
instance methods of a class can access the private instance variables of that class.
Users of the class must invoke one of the public methods of the class to access (get) or
change (set) the state of an object. For example, if the Movie class is properly encapsulated,
then it is impossible for a user of the Movie class to directly access instance variables such
as title and rating.
The Benefits of Encapsulation
As a class evolves, there is every chance that you will need to modify the way in which the
class is implemented internally. However, as long as you preserve the same interface to the
class, the rest of the program will not need to be modified at all. You preserve the interface
by retaining the same public instance methods with exactly the same signatures or
parameter lists.
By maintaining this encapsulation, you will not break any existing code that uses the Movie
class.

Oracle10g: Java Programming 7-18


Passing Primitives into Methods

When a primitive or object reference value is passed


into a method, a copy of the value is generated:

int num = 150; num


150
anObj.aMethod(num);
System.out.println("num: " + num);

public void aMethod(int arg) {


arg
if (arg < 0 || arg > 100) 150
arg = 0;
System.out.println("arg: " + arg);
}

7-19 Copyright © 2004, Oracle. All rights reserved.

Passing Primitives into a Method


When a primitive value is passed into a method, a copy of its value is
passed into the method argument. If the method changes the value of
the argument in any way, then only the local argument is affected. When
the method terminates, this local argument is discarded, and the original
variable in the calling method is left unchanged.
Example
The example in the slide illustrates the way in which primitive variables are “passed by
value” into methods. The code on the left declares an int variable called num and assigns it
the value 150. When num is passed into aMethod(), a copy of its current value is passed
into the method argument, which you have called arg; arg will be 150 initially.
Inside aMethod(), arg is reset to 0. However, when aMethod() terminates, arg is
discarded and you return to the calling method, where num still has the value of 150.
Therefore, this example prints out the following messages:
arg: 0
num: 150

Oracle10g: Java Programming 7-19


Passing Object References into Methods

When an object reference is passed into a method, the


object is not copied but the pointer to the object is
copied:

Movie mov1 = mov1


new Movie("Gone…"); title: “Gone with…”
rating: “PG”
mov1.setRating("PG");
anObj.aMethod(mov1);
ref2

public void aMethod(Movie ref2) {


ref2.setRating("R");
}

7-20 Copyright © 2004, Oracle. All rights reserved.

Passing Object References into Methods


When an object reference is passed to a method, a copy of the passed reference is generated,
which refers to the original object. The reference contains the address where the object is
located in memory. Any changes that the method makes to the argument will change the
original object. When the method terminates, any changes that you have made to the object
during the method remain in force.
Example
The example in the slide illustrates the way in which objects are “passed by reference” into
methods. The code on the left creates a new Movie object and stores a reference to it in
mov1. The movie rating is then set to "PG".
When mov1 is passed into aMethod(), the method receives a reference to the original
Movie object. Inside aMethod(), the movie rating is changed to "R".
When aMethod() terminates, the original Movie object that is referred to by mov1 has a
rating of "R", not "PG".

Oracle10g: Java Programming 7-20


What Are Class Variables?

Class variables:
• Belong to a class and are common to all instances
of that class
• Are declared as static in class definitions
public class Movie {
private static double minPrice; // class var
private String title, rating; // inst vars

title
rating
min title
Price rating
title
rating
Movie class variable Movie objects

7-21 Copyright © 2004, Oracle. All rights reserved.

Class Variables
A class variable, which is also called a static variable, is a variable that belongs to a
class and is common to all instances of that class. In other words, there is only one instance
of a class variable, no matter how many instances of that class exist.
Defining Class Variables in Java
In Java, you declare class variables by using the static keyword. In the example,
minPrice has been declared as a class variable, because the minimum price is the same
for all Movie objects. Notice that minPrice has been declared private, because it
must be be accessed only by methods of the Movie class.
In this example, the minPrice is the same for all movies, regardless of title or rating.

Oracle10g: Java Programming 7-21


Initializing Class Variables

• Class variables can be initialized at declaration.


• Initialization takes place when the class is loaded.
• Use a static initializer block for complex
initialization.
• All class variables are initialized implicitly to
default values depending on data type.

public class Movie {


private static double minPrice = 1.29;
private String title, rating;
private int length = 0;

7-22 Copyright © 2004, Oracle. All rights reserved.

When Do Class Variables Get Initialized?


Class variables are initialized when the class is loaded. Do not initialize class variables in a
constructor; constructors are for initializing instance variables, not class variables.
Default Initialization of Class Variables
Class variables have the same default values as instance variables: numbers are set to 0,
boolean variables are set to false, characters are set to '\u0000', and references are
set to null.
Explicit Initialization of Class Variables
Class variables can be initialized with nondefault values, just like instance variables. For
example, the minPrice variable in the slide has been set to 1.29.
Complex Initialization of Class Variables
Complex initialization of class variables is performed in a static initialization block, or
static initializer. A static initializer is not named, has no return value, and begins with the
static keyword, followed by a block of code inside braces. It is similar to a constructor
except that it executes only once and does not depend on any instance of the class.
public class Movie {
private static double minPrice;
static {
Date todaysDate = new Date();
minPrice = getMinPrice(todaysDate);
}
Oracle10g: Java Programming 7-22
What Are Class Methods?

Class methods are:


• Shared by all instances
• Useful for manipulating class variables
• Declared as static
public static void increaseMinPrice(double inc) {
minPrice += inc;
}
A class method is called by using the name of the
class or an object reference.
Movie.increaseMinPrice(.50);
mov1.increaseMinPrice(.50);

7-23 Copyright © 2004, Oracle. All rights reserved.

Class Methods
A class method, which is also called a static method, is a method that belongs to a class
and is shared by all instances of that class. Unlike an instance method, a class method does
not operate on a single object, and so it does not have a this reference. A class method
can access only the class variables and class methods of its class.
Why Use Class Methods?
Class methods are an ideal way to access class variables. In fact, they are the only way if no
instances of the class currently exist. For example, the increaseMinPrice() method in
the slide changes the minimum price of all movies, currently instantiated or not.
How Do You Call a Class Method?
Class methods are called by using the following general syntax:
ClassName.classMethodName( … argumentList … );
You can also call class methods by using an object reference before the dot, rather than the
name of the class, but the method can still access only class variables and class methods.
Static Methods
You may want to create a method that is used outside of any instance context. Declare a
method to be static, which may only call other static methods directly. Static methods may
not refer to their superclass or its methods.

Oracle10g: Java Programming 7-23


Guided Practice: Class Methods
or Instance Methods

public class Movie {

private static float price = 3.50f;


private String rating;

public static void setPrice(float newPrice) {
price = newPrice;
}
public float getRating() {
return rating;
} Movie.setPrice(3.98f); Movie
} mov1 = new Movie(…);
mov1.setPrice(3.98f);
float a = Movie.getRating();
Legal or not? float b = mov1.getRating();

7-24 Copyright © 2004, Oracle. All rights reserved.

Class Methods or Instance Methods


Describe the definition of the Movie class in the slide. Then, take a look at the test code,
where a Movie object is created and various methods are called.
Explain the Movie class and the code that uses it. Which statements are legal, and which
are illegal? Why or why not?
Instructor Note
(+) is correct and (–) is incorrect.
Movie.setPrice(3.98f); // calls the class method setPrice (+)
Movie mov1 = new Movie(…);// creates a new Movie object (+)
mov1.setPrice(3.98f); // uses an object, mov1, but still calls // the class
method (+)
float a = Movie.getRating(); // illegal -- tries to call an instance //
method without //specifying an object (–)
float b = mov1.getRating();// calls an instance method with an
// object specified (+)
The exact JDeveloper error is: “non-static method getRating() cannot be
referenced from a static context”

Oracle10g: Java Programming 7-24


Examples in Java

Examples of static methods and variables:


• main()
• Math.sqrt()
• System.out.println()

public class MyClass {

public static void main(String[] args) {


double num, root;

root = Math.sqrt(num);
System.out.println("Root is " + root);
} …

7-25 Copyright © 2004, Oracle. All rights reserved.

main() Is a Static Method


When you run a Java application, the virtual machine locates and calls the main() method
of that class. Even though everything in a Java program must be contained within a class,
you need not create an instance of the class if main() just calls class methods. If main()
accesses instance methods or variables of its own class, then it must first instantiate itself:
public class Movie {
public void increaseMinPrice(double increase) { … }
public static void main(String[] args) {
Movie myMovie = new Movie();
myMovie.increaseMinPrice(.20);
}
}
Math.sqrt() Is a Static Method
The Math class provides class methods to compute many mathematical functions, such as
trigonometric functions and logarithms. It also provides several class constants such as E
(2.71828…) and PI (3.1415926…).
What Is System.out.println()?
The System class provides class variables to represent the state of the entire system.
System.out is a class variable that refers to a PrintStream object, which represents
the standard output stream; println() is an instance method of PrintStream.

Oracle10g: Java Programming 7-25


Creating Classes Using the Class Editor

7-26 Copyright © 2004, Oracle. All rights reserved.

Using JDeveloper’s Class Editor


JDeveloper can help you create your classes in the Class Editor. To modify a class, select it,
right-click and select Class Editor.
The Fields tab allows you to add, remove and edit any fields, as well as specify their
scope and type. While adding a new field, you can include the get and set methods, and they
will appear in the Methods tab.
The Methods tab allows for modification of methods, including the scope, type and
parameters.
The Events tab allows the class to fire and listen for a set of standard events, or you to
create and import your own.

Oracle10g: Java Programming 7-26


What Are Java Packages?

oe

Customer Order Util

OrderEntry OrderItem

7-27 Copyright © 2004, Oracle. All rights reserved.

What Is a Java Package?


A package is a container of classes that are logically related, either by application or
function. A package consists of all the Java classes within a directory on the file system.
Package names are used within a Java run-time environment to manage the uniqueness of
identifiers as well as to control access from other classes. They also help by segmenting
related parts of complex applications into manageable parts.
Namespace
Java Virtual Machine (JVM) uses a construct called namespace to manage identifier names
within a Java program. A namespace is a chunk of memory that is allocated specifically to
manage objects. Objects are placed in specific namespaces depending on the source of the
code. For example, a class that is loaded from a local package is loaded into one namespace,
whereas one loaded from a network source goes into another separate namespace.
Identifier names must be unique within a namespace. Without the internal namespace
construct, identifier names will need to be unique across all Java classes. In other words, if
the J2SE or any other class that you need uses an identifier named count, your program
cannot define a variable named count.
Java uses namespaces to manage the identifier names so that you do not have to worry about
what names are used by other classes. You have to manage uniqueness only within your
program.

Oracle10g: Java Programming 7-27


Grouping Classes in a Package

• Include the package keyword followed by the


package name at the top of the Java source file.
Use the dot notation to show the package path.
• If you omit the package keyword, then the
compiler places the class in a default “unnamed”
package.
• Use the –d flag with the javac compiler to create
the package tree structure relative to the specified
directory.
• Running a main() method in a packaged class
requires:
– That the CLASSPATH contains the directory having
the root name of the package tree
– That the class name must be qualified by its
package name

7-28 Copyright © 2004, Oracle. All rights reserved.

Using Packages
The package represents the organization of the Java bytecode of classes and interfaces. It is
not the source code organization, which is represented by the .java files. The Java
compiler reads and uses any needed packaged classes that you specify.
Note: The CLASSPATH environmental variable is extremely critical when using packages.
Most run-time problems with code using packages emanate from a missing directory in the
CLASSPATH environment.
When running the Java application, you must include the package name in the command.
c:\>java <package_name>.<class>
c:\>java practice06.MaintainCustomers
If a class is included in a package, then the compiler can be requested to put the class file in
a subdirectory reflecting the package name. To create the package directory names during
compile time, use the –d option. For example, if you compile a class called RentItem in a
package called rentals as follows:
javac -d c:\acmevideo RentItem.java
then the class file that is created is called
c:\acmevideo\rentals\RentItem.class
The default behavior for the javac command without the -d option is to put the class file
in the same directory as the source file.

Oracle10g: Java Programming 7-28


Setting the CLASSPATH with Packages

The CLASSPATH includes the directory containing the


top level of the package tree:
Package name .class location

CLASSPATH
C:\>set CLASSPATH=E:\Curriculum\courses\java\les06

7-29 Copyright © 2004, Oracle. All rights reserved.

Setting the CLASSPATH with Packages


The CLASSPATH must point to the directory above the classes. For example, suppose you
want the Java interpreter to be able to find classes in the package practice06. If the path
to the practice06 classes directory is:
E:\Curriculum\courses\java\les06\practice06
then you would set the CLASSPATH variable from an operating system prompt as follows:
set CLASSPATH=E:\Curriculum\courses\java\les06
After you exit a DOS prompt, the CLASSPATH reverts to the permanent settings. The
CLASSPATH is used by both the compiler and the class loader in the Interpreter (JVM) to
locate, resolve references to class names, and load the classes into memory at run time. 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 in the list.
• 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 a package tree must be added to the
CLASSPATH. Consider putting the CLASSPATH information in the command window or
even the Java command, rather than hard-coding it in the environment. For example,
java -classpath E:\Curriculum\courses\java\les06
practice06.AddCustomers

Oracle10g: Java Programming 7-29


Access Modifiers

acmevideo acmetools

public public

protected

private

7-30 Copyright © 2004, Oracle. All rights reserved.

Access Modifiers
Java controls access to variables and methods through the use of access modifiers. The
access modifiers are private, public, protected and default (no
modifier).
The least restrictive access modifier is public. Variables and methods that are declared as
public can be seen and used by any other class.
If an access modifier is not specified, called package access (or default access), then the
variables and methods can be used by any other class within the same package.
The next level of access modifier is protected. Variables and methods that are declared
as protected can be seen from any subclass of that class. They can also be seen from any
class within the package in which they exist.
The most restrictive access modifier is private. A private method or variable cannot
be accessed by any other class. The restriction applies to all other classes and subclasses
regardless of their package.
The final access modifier is default (no modifier). In this modifier, only other
members of the same package can access variables and methods.

Oracle10g: Java Programming 7-30


Variable or Method Visibility
Member Visibility Modifier

Accessible to Public Protected Default Private


(absent)

Same Class Y Y Y Y

Any Class in Same Y Y Y N


Package

Subclass in Y Y N N
Different Package

Non-Subclass in Y N N N
Different Package

Access in order from least restrictive to most restrictive:


• Public: All
• Protected: Only other members of the same package or from a different package if
inherited (using extends keyword)
• Default (no modifier): Only other members of the same package
• Private: Only other members of the same class
Examples:
1. A protected double getWage() method is visible in all the classes that are in
the same package as the class in which this method is defined and all subclasses of that
class.
2. The int getCount() method is visible in all the classes that are in the same
package as the class in which this method is defined.

Oracle10g: Java Programming 7-31


Summary

In this lesson, you should have learned the following:


• A class definition specifies a template for building
objects with identical features, such as instance
variables and methods.
• An object is an instance of a particular class.
– Create an object by using new.
– Manipulate an object by using its public instance
methods.

7-32 Copyright © 2004, Oracle. All rights reserved.

Class Definitions
Class definitions serve as templates or blueprints for all objects of that class. The definition
includes all attributes and behaviors for that class. The attributes are called instance
variables and must be declared as private to achieve proper levels of encapsulation. The
behaviors are called instance methods and must be declared as public.
Objects
All objects are instances of a particular class. Objects are created by using the new operator.
If the classes are declared properly, then all object manipulation must occur by the use of
public instance methods.

Oracle10g: Java Programming 7-32


Practice 7: Overview

This practice covers:


• Defining new classes
• Specifying the classes’ instance variables and
instance methods
• Creating Customer objects in main()
• Manipulating Customer objects by using public
instance methods

7-33 Copyright © 2004, Oracle. All rights reserved.

Practice 7: Overview
Note: If you have successfully completed the previous practice, then continue using the
same directory and files. If the compilation from the previous practice was unsuccessful and
you want to move on to this practice, then change to the les06 directory, load up the
OrderEntryWorkspaceLes06 workspace, and continue with this practice.
Viewing the model: To view the course application model up to this practice, load the
OrderEntryWorkspaceLes06 workspace. In the Applications – Navigator node,
expand the OrderEntryWorkspaceLes06 – OrderEntryProjectLes06 -
Application Sources – oe, and double-click the UML Class Diagram1 entry.
This diagram displays all the classes created to this point in the course.

Oracle10g: Java Programming 7-33


Practice 7: Creating Classes and Objects
Goal
The goal of this practice is to complete the basic functionality for existing method bodies of
the Customer classes. You then create customer objects, and manipulate them by using
their public instance methods. You display the Customer information back to the JDeveloper
message window.
Note: If you have successfully completed the previous practice, then continue using the
same directory and files. If the compilation from the previous practice was unsuccessful and
you want to move on to this practice, then change to the les06 directory, load the
OrderEntryLes06 workspace, and continue with this practice.
Your Assignment
In this pra ctice, you begin refining the application for the Order Processing business area.
These classes continue to form the basis for the rest of the application that you are building
for the remainder of the course. After creating one or more Customer objects, you
associate a customer with an order.
Refine the Customer class
1. From the Application Navigator pane, in the OrderEntryProject, make the
following changes to the Customer class.
a. Make all instance variables private. To do this, open the Customer.java
file and select the Class tab. This opens the Class Editor. Select the Fields tab,
double-click an attribute name, and click the Scope drop-down list to change the
value to private.
Note: Alternatively, you can also change the scope of the variables in the Source
by modifying the Customer.java file.
b. sing the ode ditor or the lass
ditor assign each of the setXXX() methods to its appropriate field.
c. The get methods must be assigned. Confirm whether the getXXX() methods
return their appropriate field values.
Note: The naming convention, such as setId(), setName(), and so on for these
methods, makes the classes more intuitive and easier to use.
2. At the moment, there is no way to display most or all details for a Customer object
by calling one method.
a. To cover this deficiency, add a new toString() public method to the class,
without arguments, and return a String containing the customer’s ID, name,
address, and phone number. The resultant string should be a simple
concatenation of the attributes that you want to display. For example:
public String toString() {
return property1 + " " + property2;
}
Note: The toString() method is a special method that is called anytime a String
representation of an object is needed. The toString() method is very useful to add
to any class, and thus it is added to almost all the classes that you create. When adding
the toString method, a pop-up dialog box with this message is displayed: “OK to
override method.” Click “yes.”
b. Save the Customer class, right-click, and select Rebuild to compile it to
remove any syntax errors.

Oracle10g: Java Programming 7-34


Practice 7: Creating Classes and Objects (continued)
Create Customer Objects (OrderEntry class)
3. Modify the main() method in the OrderEntry class to create two customer
objects.
a. In the main() method of OrderEntry.java, create two customer objects by
using the new operator, assigning each one to a different object reference (use
customer1 and customer2).

b. At the end of the main() method, initialize the state of each Customer object
by calling its public setXXX() methods to set the ID, name, address, and
phone. Use the table data below:
Id Name Address Phone
1Gary Williams Houston, TX 713.555.8765
2Lynn Munsinger Orlando, FL 407.695.2210

c. Print the two customer objects created, under a printed heading of “Customers:”
by calling the toString() method inside the argument of the
System.out.println(…) method. For example:
System.out.println("\nCustomers:");
System.out.println(customer1.toString()); ...

Note: Alternatively, you can just print the customer object reference variable
to achieve the same result. For example:
System.out.println(customer1);
This latter technique is a feature of Java that is discussed in a subsequent lesson.

d. Save the OrderEntry class, compile, and run the class to view the results.
Modify OrderEntry to Associate a Customer to an Order
4. In the main() method of the OrderEntry class, associate one of the customer
objects with the order object, and display the order details.
a. Call the setCustomer() method of the order object passing in the object
reference of customer1 (or customer2).

b. After setting the customer, call the showOrder() method of the order object.

c. Save, compile, and run the OrderEntry class.

Oracle10g: Java Programming 7-35


Object Life Cycle and Inner Classes

Copyright © 2004, Oracle. All rights reserved.

Schedule: Timing Topic


70 minutes Lecture
40 minutes Practice
110 minutes Total
Objectives

After completing this lesson, you should be able to do


the following:
• Provide two or more methods with the same name
in a class
• Provide one or more constructors for a class
• Use initializers to initialize both instance and class
variables
• Describe the class loading and initializing
process, and the object life cycle
• Define and use inner classes

8-2 Copyright © 2004, Oracle. All rights reserved.

Lesson Aim
This lesson explores some of the more advanced issues relating to class definitions. You
learn how to provide and use overloaded methods in a class, and how to ensure that the
class and object state is initialized to know values when created. The lesson discusses
replacing and supplementing the default no-arg constructor with alternative constructors.

Oracle10g: Java Programming 8-2


Lesson Aim (continued)
Instance Methods
Instance methods are the foundation of encapsulation and are the key in providing a
consistent interface to the class. Classes that are defined with proper encapsulation
techniques use instance methods to provide class information to the outside world. Without
instance methods, a user can inspect and modify class data directly without any program-
enforced validation.
Overloading
With overloading, a method call can invoke different behaviors depending on the
parameter passed. For example in a Dog class, the smell() method can invoke
completely different behaviors depending on the parameter. If the call is smell(cat),
then the behavior would be incessant barking and howling, whereas the smell(food)
method would invoke salivating and eating or begging.
Overloading is a powerful technique in achieving a uniform appearance of your class to the
outside world.
Constructors
Constructors ensure that regardless of who creates an object, the object has all of the
expected characteristics of the class. Upon creation of an object, the constructor method is
called implicitly, providing a place for initialization routines. This is key in object-oriented
programming, because you do not know exactly who will be creating new objects of your
class.
Garbage Collector
The garbage collector is the process that handles the memory allocation. It is in charge of
cleaning the memory space that is allocated to objects that are not used anymore.
Inner Classes
In releases of the Java language before release 1.1, all top-level classes must be declared as
members of a package. As of Java Development Kit (JDK), release 1.1, this restriction is
removed allowing classes to be declared in any scope. Classes declared inside other classes
are called nested classes, and one common type of nested class is called an inner class.

Oracle10g: Java Programming 8-3


Overloading Methods

• Several methods in a class can have the same


name.
• The methods must have different signatures.

public class Movie {


public void setPrice() {
price = 3.50F;
}
public void setPrice(float newPrice) {
price = newPrice; Movie mov1 = new Movie();
} … mov1.setPrice();
} mov1.setPrice(3.25F);

8-4 Copyright © 2004, Oracle. All rights reserved.

Method Overloading
Two or more methods in a class can have the same name, provided that they have different
signatures. A method signature is formed from its name, together with the number and
types of its arguments. The method return type is not considered part of the method
signature.
Defining two or more methods with the same name but different signatures is called
method overloading. This technique is useful in presenting a unified interface to the outside
world. The exact method that is called is determined by the parameters that are included in
the call. Without method overloading, each method would require a unique name. For
example, if you want to retrieve customer information by customer ID or by name, then
you would need two methods: getCustomerByID(id) and
getCustomerByName(name). With overloading, you will have two methods named
getCustomer(), one with the ID parameter and the other with the name parameter.
How Does the Compiler Decide Which Overloaded Method to Call?
When a user of a class calls an overloaded method, the compiler chooses the correct
method to call by comparing the argument types that are passed in the call with all the
methods of that name in the class definition. If the compiler cannot find a compatible
match, even after performing possible type conversions, then it flags an error. Likewise, if
more than one match is possible, then the compiler flags an error, because the method call
is ambiguous.
Can Overloaded Methods Differ in Return Type Only?
No. Overloaded methods must be distinguishable by comparing their argument lists alone.
If overloaded methods differ in their return type only, then the compiler flags an error.

Oracle10g: Java Programming 8-4


Using the this Reference

Instance methods receive an argument called this,


which refers to the current object.

public class Movie {


public void setRating(String newRating) {
this.rating = newRating; this
}

title : null
void anyMethod() { rating: “PG”
Movie mov1 = new Movie(); mov1
Movie mov2 = new Movie(); title: null
mov1.setRating("PG"); … mov2 rating: null

8-5 Copyright © 2004, Oracle. All rights reserved.

All Methods Receive a Reference to “This Object”


All instance methods receive an implicit argument called this, which can be used inside
any method to refer to the current object. The current object is the object on which the
method was called. The this argument is an implicit reference to the calling object and as
such is not required in most cases.
How Is this Used Inside an Instance Method?
Inside an instance method, any unqualified reference to an instance variable or instance
method is implicitly associated with the this reference. For example, the two following
statements are equivalent:
public void setRating(String inRating) {
rating = inRating;
this.rating = inRating;
}
There are two circumstances where you must use an explicit this reference:
• When the name of an instance variable is hidden by a formal argument of an instance
method. For example, if there is an instance variable called name, and an argument
that is also called name, then the argument hides the instance variable. Any reference
to name accesses the argument, not the variable. To access the instance variable, you
must use this.name.
• When you need to pass a reference to the current object as an argument to another
method

Oracle10g: Java Programming 8-5


Initializing Instance Variables

• Instance variables can be explicitly initialized at


declaration.
• Initialization happens at object creation.
public class Movie {
private String title;
private String rating = "G";
private int numOfOscars = 0;

• All instance variables are initialized implicitly to


default values depending on data type.
• More complex initialization must be placed in a
constructor.

8-6 Copyright © 2004, Oracle. All rights reserved.

Initialization of Instance Variables


When an object is created, Java automatically performs default initialization for all the
instance variables in the object:
• char variables are set to '\u0000'.
• byte, short, int, and long variables are set to 0.
• boolean variables are set to false.
• float and double variables are set to 0.0.
• Object references are set to null.
Explicit Initialization of Instance Variables
To initialize an instance variable to a nondefault value, you can specify initializers. This
allows instance variables to be assigned an explicit value. For example:
public class Movie {
private String rating = "G";

}
Complex Initialization of Instance Variables
Initializers are fine if you want to assign a simple value to an instance variable, but if you
want to carry out more sophisticated initialization, then you must use a constructor. A
constructor is a special instance method that is used to initialize new instances of a class.

Oracle10g: Java Programming 8-6


What Are Constructors?

• For proper initialization, a class must provide a


constructor.
• A constructor is called automatically when an
object is created:
– It is usually declared public.
– It has the same name as the class.
– It must not specify a return type.
• The compiler supplies a no-arg constructor if and
only if a constructor is not explicitly provided.
– If any constructor is explicitly provided, then the
compiler does not generate the no-arg constructor.

8-7 Copyright © 2004, Oracle. All rights reserved.

Constructors
When an object is created, its instance variables are initialized to their default values.
However, you will generally need to provide one or more constructors in a class to
initialize its instance variables properly and to allow users of the class to specify the initial
state of an object.
For example, with the Movie class, you have already seen examples, such as:
Movie mov1 = new Movie ("Gone with the Wind");
For a user to create an object in this way, the Movie class must provide a constructor that
initializes the state of a Movie object with the specified title of the movie.
How and When Are Constructors Called?
A constructor is a special method that is called automatically by the run-time system when
an object is created. A constructor has the same name as the class; it can have arguments
but must not specify a return type. Constructors must be declared as public unless you
want to restrict who can create instances of the class.
What Happens If You Do Not Provide a Constructor?
If you do not provide any constructors, then a default no-argument (no-arg) constructor is
provided for you. This constructor takes no arguments and does nothing, but does at least
allow objects to be created. The no-arg constructor invokes the no-arg constructor of its
parent class.
Note: If you want a specific no-arg constructor as well as constructors that take arguments,
then you must explicitly provide your own no-arg constructor.
Oracle10g: Java Programming 8-7
Defining and Overloading Constructors

public class Movie {


private String title;
private String rating = "PG";

public Movie() { The Movie class


title = "Last Action …"; now provides two
constructors.
}
public Movie(String newTitle) {
title = newTitle;
} Movie mov1 = new Movie();
} Movie mov2 = new Movie("Gone …");
Movie mov3 = new Movie("The Good …");

8-8 Copyright © 2004, Oracle. All rights reserved.

Anatomy of a Constructor
A constructor is a special method that is called automatically when an object is created. A
constructor must have the same name as the class. It can have arguments, but it must not
specify a return type.
Overloaded Constructors
As with overloaded methods, if you want to provide more than one constructor in a class,
then each one must have a different signature. Because each constructor must have the
same name anyway, this simply means that each constructor must have different numbers
or types of arguments.
Example
In the example, the Movie class has two simple constructors: one with no arguments, and
the other that takes a String argument for the title of the movie.
Users of the Movie class can now create movies with different titles. When you create a
new Movie object, the compiler decides which constructor to call based on the arguments
that are specified in parentheses in the new statement. For example:
Movie mov1 = new Movie(); // calls the no-arg
constructor
Movie mov2 = new Movie(“Last ...”); // calls the constructor with
the String argument

Oracle10g: Java Programming 8-8


Sharing Code Between Constructors

Movie mov2 = new Movie();

public class Movie {


A constructor
private String title;
can call another
constructor by private String rating;
using this().
public Movie() {
this("G");
}
public Movie(String newRating) {
What happens rating = newRating;
here? }
}

8-9 Copyright © 2004, Oracle. All rights reserved.

Sharing Code Between Constructors


A constructor can call another constructor of the same class by using the this() syntax.
public Movie() { // First constructor
this("G");
}
public Movie(String r) { // Second constructor
rating = r;
}
The first constructor calls the second constructor, passing "G" as an argument. The second
constructor then copies the string into the rating instance variable. Using this technique
ensures that the default rating for all Movies is "G" without duplicating the code in
multiple constructors.
By using this(), you avoid duplicate code in multiple constructors. This technique is
especially useful if the initialization routine is complex. All the complex code goes into one
constructor that is called from all the others.
Syntax Rules
When one constructor calls another by using the this() syntax, there are a few rules of
syntax that you need to be aware of:
• The call to this() must be the first statement in the constructor.
• The arguments to this() must match those of the target constructor.

Oracle10g: Java Programming 8-9


final Variables, Methods, and Classes

• A final variable is a constant and cannot be


modified.
– It must therefore be initialized.
– It is often declared public static for external
use.
• A final method cannot be overridden by a
subclass.
• A final class cannot be subclassed.
public final class Color {
public final static Color black=new Color(0,0,0);

}

8-10 Copyright © 2004, Oracle. All rights reserved.

final Variables
By default, all variables may be modified, and methods may be overridden. Specifying a
variable as final prevents modification of its value, making a constant value. This is
useful for guaranteeing that a value is consistent across all users of the class. These
variables are usually declared public static final, as classwide constants.
final Methods
A final method is one that cannot be overridden in a subclass. In other words, if a
programmer inherits from the class, then he or she is not allowed to provide an alternative
version of this method. This is a useful technique to prevent programmers inadvertently or
maliciously redefining core methods that must work a certain way.
final Classes
You may also declare a class to be final. A final class is one that cannot be inherited
from. In fact, the Color class that is shown in the slide is a final class. By declaring a
class as final, you are making a strong design decision that the class is complete enough
to meet all its current and future requirements and will never need to be extended to
provide additional functionality.

Oracle10g: Java Programming 8-10


Reclaiming Memory

• When all references to an object are lost, the


object is marked for garbage collection.
• Garbage collection reclaims memory that is used
by the object.
• Garbage collection is automatic.
• There is no need for the programmer to do
anything, but the programmer can give a hint to
System.gc();.

8-11 Copyright © 2004, Oracle. All rights reserved.

Garbage Collection
Memory management in Java is automatic. When an object is created, memory is allocated
for the object from a heap. When there are no more references to that object, it is marked
for garbage collection. When the garbage collector runs, it searches for marked memory
and returns it to the heap.
There are no free() or delete() functions in Java as there are in C++. To force an object to
be marked for garbage collection, simply remove all references to that object by setting the
references to null.
When Does Garbage Collection Occur?
Garbage collection is implementation specific. Some environments run garbage collection
when the amount of free memory that is available to Java Virtual Machine (JVM) falls
below some arbitrary threshold. JVM performs garbage collection in a low-priority thread.
When JVM has nothing else to do, the garbage collector thread receives some CPU time to
see whether any memory can be reclaimed.
You can explicitly request the garbage collector to run by calling the gc() method as
follows:
System.gc();
However, this is only a request for garbage collection; there is no guarantee that JVM will
take the hint.
Because of this internal garbage collection process, you do not automatically know when
an object is deleted and whether the necessary amount of memory that is needed for this
object is still in use.

Oracle10g: Java Programming 8-11


Using the finalize() Method

• If an object holds a resource such as a file, then


the object should be able to clean it up.
• You can provide a finalize() method in that
class.
• The finalize() method is called just before
garbage collection.
public class Movie {

public void finalize() { Any problems?
System.out.println("Goodbye");
}
}

8-12 Copyright © 2004, Oracle. All rights reserved.

Destructors and the finalize() Method


In some languages, such as C++, a class can provide a destructor. A destructor is similar to
a constructor, except that it is called automatically just before an object is destroyed. A
destructor is normally used to free up resources that are held by the object, such as any
secondary memory that is allocated by the object, open files, and so on.
Java Does Not Support Destructors
Java manages memory automatically, so an object need not explicitly free any secondary
memory that it may have allocated. Consequently, Java does not support destructors.
Instead, to allow an object to clean up resources other than memory, such as open files,
Java allows a class to provide a finalize() method.
Anatomy of the finalize() Method
The finalize() method is called automatically when an object is garbage-collected.
Unfortunately, as you have already seen, there is no guarantee regarding when this will
happen or that it will happen before the program exits. The virtual machine reserves the
right to not immediately collect the memory that is associated with an object after calling
the finalizer. Such objects are known as phantoms.
Alternatives to finalize()
The unpredictability of when finalize() is called is unacceptable if resources are
scarce. The only solution is to manage such resources manually. To take control of the
process, you can define a public dispose() method in your class, which users of your
class must call when they have finished using an object of your class. You can still keep
your finalize() method if you want to, as a final effort to clean up resources.

Oracle10g: Java Programming 8-12


What Are Inner Classes?

• Inner classes are nested classes, defined in a


class or method.
• They enforce a relationship between two classes.
• They are of four types:
– Static
– Member public class Outer { …
– Local class Inner { …
– Anonymous }
}

Enclosing class

8-13 Copyright © 2004, Oracle. All rights reserved.

Inner Class Definition


An inner class is simply a class that is defined within a class.
You define inner classes because they functionally support the outer class or because they
make sense in the context of the enclosing class.
Inner classes have different privileges when accessing outer class members according to
the type of inner class they are.
There are four different types of inner classes:
• Defined in a class:
- Static Inner Class
- Member Inner Class
• Defined in a method:
- Local Inner Class: Used within the scope of the method it was declared in
- Anonymous Inner class: Used globally outside of the method it was declared in
You must be careful when using inner classes, because they can make the code more
difficult to read, especially for people who have to maintain the application.
Inner classes result from the combination of block structure with class-based programming,
which was pioneered by the Beta programming language. Using block structure with inner
classes makes it easier for the Java programmer to connect objects together, because
classes can be defined closer to the objects that they need to manipulate, and can directly
use the names that they need.

Oracle10g: Java Programming 8-13


Using Member Inner Class

• It is declared within another class.


• Nesting is allowed.
• It can access variables within its own class and
any enclosing classes.
• It can only declare final static methods.
public class CalendarPopup {
...
class MonthSelector {
class DayOfMonth{...};
DayOfMonth[] NumberOfDaysInMonth
...
}
}

8-14 Copyright © 2004, Oracle. All rights reserved.

Member Inner Class: Example


To better understand Member Inner classes, look at this example:
You have an application with a few date items, such as booking date and return date, and
you want to allow the users to select a specific booking date from a pop-up calendar. You
can put a button on the user interface, which when clicked, invokes a pop-up calendar
displaying the current date. The user can then select a different month for the booking or
select a specific day.
In this example, a top-level class can be used to control the pop-up calendar. The month
selector class can be implemented as a Member Inner class of the calendar. The
MonthSelector class will then populate an array with the appropriate days in the
month. The DayOfMonth class is a Member Inner class, because it is created within a
class and not a method.
Instructor Note
The Member Inner class can inherit static members even if constant, but cannot declare
static members.

Oracle10g: Java Programming 8-14


Using Local Inner Class

• It is declared within a code block (inside a


method).
• All final variables or parameters declared in the
block are accessible by the methods of the inner
class.
public class CalendarPopup {
...
public void handlerMethod(){
class DateHandler{…};
DateHandler sc = new DateHandler();
...
}
}

8-15 Copyright © 2004, Oracle. All rights reserved.

Local Inner Class: Example


To better understand Local Inner classes, look at this example:
You have the same application as before, with a few date items, such as booking date and
return date.You can put a button on the user interface, which when clicked, invokes a pop-
up calendar displaying the current date. The user can then select a different month for the
booking or select a specific day.
In this example, a top-level class can be used to control the pop-up calendar functionality.
The DateHandler class can be implemented as a Local Inner class of the
CalendarPopup. After a booking day button is clicked, and then accepted, the action
handler method invoked can create a Local Inner class to store the booking date and
calculate the return date. In this case, the Local Inner class will be used within the action
handler and nowhere else. The Local Inner class is used only with the scope of the action
handler.

Oracle10g: Java Programming 8-15


Defining Anonymous Inner Classes

• They are defined at method level.


• They are declared within a code block.
• They lack the class, extends, and implements
keywords.
• They cannot have a constructor.
public class Outer {
...
public void outerMethod(){
...
myObject.myAnonymous(new SomeOtherClass(){
...
} )
}
}

8-16 Copyright © 2004, Oracle. All rights reserved.

Anonymous Inner Classes


Anonymous inner classes are Local Inner classes with no class name. The class keyword
is omitted and so are public, protected, extends, and implements. They are
commonly used to implement user interface adapters to perform event handling when using
AWT or Swing events.
Anonymous inner classes have the same restriction as Local Inner classes concerning the
visibility on the outer class elements.
The generic anonymous class syntax takes the form:
Class Outer {

AnInnerAnonymousClass (new SuperClass ( ) {
. . .
} );
. . .
}
The anonymous class is derived from a superclass that allows the use of the methods of this
superclass. Anonymous inner classes can implicitly extend or implement only other classes
or interfaces. The use of anonymous classes is most effective when they implement only a
single or very few small methods. Reading the code can get confusing when the definition
of the inner class is long.
Anonymous inner classes have the same accessibility rules as Local Inner classes. It is
primarily used to create a one-time implementation class of an interface.

Oracle10g: Java Programming 8-16


Using the Calendar Class

• It converts between a date object and a set of


integer fields.
• It represents a specific moment in time.
• Subclasses interpret a date according to the
specific calendar system.
public class Order {
...
public void String getShipDate(){
...
Calendar c = Calendar.getInstance();
c.setTime(orderDate);
...
} )
}
}

8-17 Copyright © 2004, Oracle. All rights reserved.

The Calendar Class


Calendar is an abstract base class for converting between a Date object and a set of
integer fields such as YEAR, MONTH, DAY, HOUR, and so on. (A Date object represents a
specific instant in time with millisecond precision.)
Specific subclasses of Calendar interpret a Date according to the rules of a specific
calendar system. One concrete example of a Calendar subclass is GregorianCalendar.
Using the Calendar Class
The Calendar object can produce all the time field values needed to implement the date–
time formatting for a particular language and calendar style (for example, Japanese–
Gregorian, Japanese–Traditional, and so on). Calendar defines the range of values
returned by certain fields, as well as their meanings. For example, the first month of the
year has value MONTH == JANUARY for all calendars.
Like other locale-sensitive classes, Calendar provides a class method, getInstance,
for getting a generally useful object of this type. A Calendar’s getInstance method
returns a Calendar object whose time fields have been initialized with the current date
and time:
Calendar rightNow = Calendar.getInstance();
The setTime method sets this Calendar’s current time with the given Date.
Instructor Note
This slide is included here, because the class is used in the practice. Do not get too
involved, explaining all the details.

Oracle10g: Java Programming 8-17


Summary

In this lesson, you should have learned the following:


• Methods can be overloaded in Java.
• Instance methods receive a this reference to the
current object.
• Most classes provide one or more constructors to
initialize new objects.
• Class variables and class methods can be defined
for classwide properties and behaviors.
• Classes can be defined in various ways within a
class.

8-18 Copyright © 2004, Oracle. All rights reserved.

Oracle10g: Java Programming 8-18


Practice 8: Overview

This practice covers:


• Defining and using overloaded methods
• Providing a no-arg constructor for a class
• Providing additional constructors for a class
• Defining static variables and static methods for
classwide behavior
• Using static methods

8-19 Copyright © 2004, Oracle. All rights reserved.

Practice 8: Overview
Note: If you have successfully completed the previous practice, then continue using the
same directory and files. If the compilation from the previous practice was unsuccessful
and you want to move on to this practice, then change to the les07 directory, load up the
OrderEntryLes07 workspace, and continue with this practice.
Viewing the model: To view the course application model up to this practice, load the
OrderEntryWorkspaceLes07 workspace. In the Applications – Navigator node, expand the
OrderEntryWorkspaceLes07 – OrderEntryProjectLes07 -
Application Sources – oe, and double-click the UML Class Diagram1
entry. This diagram displays all the classes created to this point in the course.

Oracle10g: Java Programming 8-19


Practice 8: Object Life Cycle Classes
Goal
The goal of this practice is to gain experience with creating and using constructors,
classwide methods, and attributes. You also use an existing DataMan class to provide a
data access layer for finding customers and products in the OrderEntry application. Part
of the practice is to understand method overloading by creating more than one constructor
and/or method with the same name in the same class.
Note: If you have successfully completed the previous practice, then continue using the
same directory and files. If the compilation from the previous practice was unsuccessful
and you want to move on to this practice, then change to the les07 directory, load up the
OrderEntryLes07 workspace, and continue with this practice.
Your Assignment
Create at least one or more suitable constructors to properly initialize the Customer
objects when instantiated. Examine the Order class and the new instantiations. Copy and
examine a DataMan class to provide classwide (static) attributes of customer objects to be
used by the OrderEntry application when it associates a customer object to an order.
Modify Customer Information
The Customer class will have two constructors:
1. Create a no-arg constructor to provide default initialization, and another constructor
to set the actual name, address, and phone properties. The no-arg constructor will be
invoked by the second constructor.
a. Add a no-arg constructor to the Customer class, which is used to generate the
next unique ID for the customer object by first declaring a class variable, called
nextCustomerId, as a private static integer initialized to zero.
b. In the OrderEntry class, comment out the customer.setId,
customer.setName, customer.setAddress, and
customer.setPhone statements for both customer1 and customer2.
c. Back in the Customer class, create a no-arg constructor, increment the
nextCustomerId, and use the setID() method with nextCustomerId
to set the ID of the customer.
d. Add a second constructor that accepts a name, address, and phone as String
arguments. This constructor must set the corresponding properties to these
values.
e. In the first line of the second constructor, chain it to the first constructor by
invoking the no-arg constructor by using the this() keyword. This is done to
ensure that the ID of a customer is always set regardless of the constructor used.
f. Save, compile, and run the OrderEntry class to check the results. Including
the order and item details that are displayed as output, you should see
"Customer: 1 null null null".
Replace and examine the Order.java File
2. In Windows Explorer, copy the Order.java class from the E:\labs\temp directory
into your current working …\src\oe directory. For example if you are working in
les06 directory then copy the files under E:\les06\src\oe.
a. Select your workspace and select the Open menu option. Navigate to your
current …\src\oe directory and select the Order.java file. Click the Open
button, and it will be included in the list of files.

Oracle10g: Java Programming 8-20


Practice 8: Object Life Cycle Classes (continued)
The new version of the Order class also has one constructor:
3. Examine the way in which the order date information is managed:
a. Notice the orderDate variable that had been commented out is now a
private variable.
b. After the package statement at the top of the class, notice the import statements
(before the class declaration):
import java.util.Date;
import java.util.Calendar;
c. Notice the orderDate type to be Date instead of String, and that the three
integer variables–day, month, and year–have been removed.
4. Examine the methods that depend on three integer date variables (which were
removed in step 3c) to use orderDate.
a. The return type and value of the getOrderDate() method are replaced as
follows:
public Date getOrderDate()
{
return orderDate;
}
In addition, included is an overloaded void setOrderdate() method that
accepts a Date as its argument and sets the orderDate variable.
b. The getShipDate() method had used the Calendar class to calculate the
ship date. The body of getShipDate() has been replaced with the following
code:
int daysToShip = Util.getDaysToShip(region);
Calendar c = Calendar.getInstance();
c.setTime(orderDate);
c.add(Calendar.DAY_OF_MONTH, daysToShip);
return c.getTime().toString();
c. The setOrderDate() method body is coded to set the orderDate by
using the Calendar class methods, using the three input arguments: The
following date initialization code has been deleted:
day = 0;
month = 0;
year = 0;
d. Notice the setOrderDate() method has been modified. The following three
bold lines of code:
if ((m > 0 && m <= 12) && (y > 0 )) {
day = d;
month = m;
year = y;
}
have been replaced with these three lines of code:
Calendar c = Calendar.getInstance();
c.set(y, m - 1, d);
orderDate = c.getTime();

Oracle10g: Java Programming 8-21


Practice 8: Object Life Cycle Classes (continued)
5. A no-arg constructor has been created to initialize the order number, date, and total.
a. Notice a new class (private static int) variable called nextOrderId
has been created and initialized to 100.
b. In the no-arg constructor, the ID of the order is set to the value in
nextOrderId. It then increments nextOrderId. The orderTotal is set
to 0, and the orderDate is set as follows:
orderDate = new Date();
Load the DataMan.java Class File into JDeveloper
The DataMan class is used to create the data that will be used to test the application. The
file creates the customer objects, and later will be used to access a database for
information. This class is really a convenience class that simplifies your application testing.
However, after this class is completed, it can be changed to retrieve data from a database
without impacting your application.
6. In Windows Explorer, copy the DataMan.java class from the E:\labs directory
into your current working …\src\oe directory.
a. Select your workspace and select the Open menu option. Navigate to your
current …\src\oe directory and select the DataMan.java file. Press OK,
and it will be included in the list of classes.
b. Save and compile the DataMan.java class.
Note: You can compile DataMan.java by right-clicking the file and
selecting the Make menu option.
c. Save, compile, and run the OrderEntry class to test if the code still works. You
can compile OrderEntry.java by right-clicking on the file and selecting
the Make menu option.
Modify OrderEntry to Use DataMan
7. Modify the main() method in OrderEntry to use customer objects from the
DataMan class.
a. Use the class name “DataMan.” as the prefix to all customer references
variables customer1 and customer2. For example, change the code:
order.setCustomer(customer1);
to become:
order.setCustomer(DataMan.customer1);
Note: You are accessing a class variable via its class name; that is, there is no
need to create a DataMan object. In addition, the customer variables in
DataMan are visible to OrderEntry because they have default (package)
access.
b. Save, compile, and run the OrderEntry class to test if the code still works.
Replace customer1 with customer3 or customer4 from DataMan to
confirm that your code is using the customer objects from DataMan.

Oracle10g: Java Programming 8-22


Using Strings, String Buffer, Wrapper,
and Text-Formatting Classes

Copyright © 2004, Oracle. All rights reserved.

Schedule: Timing Topic


70 minutes Lecture and guided practices
25 minutes Practice
95 minutes Total
Objectives

After completing this lesson, you should be able to do


the following:
• Create strings in Java
• Use the conversion methods that are provided by
the predefined wrapper classes
• Use the StringBuffer class for manipulating
character data
• Introduce the DateFormat, DecimalFormat, and
MessageFormat classes
• Examine standard output and serialization

9-2 Copyright © 2004, Oracle. All rights reserved.

Lesson Aim
This lesson shows how to use the Java String class and the StringBuffer class to
manipulate character strings. You also use the Java wrapper classes to convert primitive types
into other formats.
Instructor Note
This lesson covers a number of classes: String, Stringbuffer, and the various wrapper
classes with their own set of methods. It would be beyond the scope of the course notes to list
the complete syntax of every method that is mentioned, so you may find it useful to show the
J2SE online documentation for the various classes as a way of describing selected methods
and classes in more detail. The String, StringBuffer, and wrapper classes are in the
java.lang package, and the DateFormat, DecimalFormat, and MessageFormat
classes are in the java.text package.

Oracle10g: Java Programming 9-2


What Is a String?

• String is a class.
• A String object holds a sequence of characters.
• String objects are read-only (immutable); their
values cannot be changed after creation.
• The String class represents all strings in Java.

9-3 Copyright © 2004, Oracle. All rights reserved.

Strings in Java
As with most programming languages, strings are used extensively throughout Java, so the
Java application programming interface (API) provides a String class to help you work
with strings of character data. Literal string values in Java source code are turned into
String objects by the compiler. The String objects can be used directly, passed as
arguments to methods, or assigned to String object reference variables:
System.out.println( "Hello World..." );
String str = "Action";
Strings Cannot Be Modified
The String class represents an immutable string. This means that after you have created a
String object, you cannot change it. If you want to modify the contents of the string, then
you must use the StringBuffer class.

Oracle10g: Java Programming 9-3


Creating a String

• Assign a double-quoted constant to a String


variable:
String category = "Action";

• Concatenate other strings:


String empName = firstName + " " + lastName;

• Use a constructor:
String empName = new String(“Bob Smith");

9-4 Copyright © 2004, Oracle. All rights reserved.

Creating Strings
The easiest way to create a string is from a double-quoted constant, as shown in the first
example in the slide. You can use the + operator to concatenate two String objects. This is
explained in more detail in the following slides.
The String class provides several constructors. The following are some of the more useful
ones:
• String() creates an empty string, with the value "".
• String(String str) creates a copy of the specified String object, str.
• String(char[] arr) creates a string from the characters in a character array.
You can find a list of constructors in the online J2SE documentation for the String class,
which is available in JDeveloper’s online Help.
Using Strings in Your Code
The String class is part of the java.lang package. java.lang is automatically
imported into all Java classes, so you do not need to add any import statements to your code to
use String objects.

Oracle10g: Java Programming 9-4


Concatenating Strings

• Use the + operator to concatenate strings.


System.out.println("Name = " + empName);

• You can concatenate primitives and strings.

int age = getAge();


System.out.println("Age = " + age);

• The String class has a concat() instance


method that can be used to concatenate strings.

9-5 Copyright © 2004, Oracle. All rights reserved.

Concatenating Strings
Java uses +, which is the only overloaded operator in Java, for string concatenation. The
concat() method in the String class is another way to concatenate strings.
The following code produces equivalent strings:
String name = "Sam Wong";
String name = "Sam " + "Wong";
String name = "Sam ".concat("Wong");
The second example in the slide shows a primitive (in this case, an int) being concatenated
with a String; the primitive is implicitly converted to a String.
Literal strings cannot span lines in Java source files, but you can concatenate lines to produce
the same effect:
String song =
"What good is sitting alone in your room" + "\n" +
"Come hear the music play" + "\n" +
"Life is a cabaret old chum" + "\n" +
"Come to the cabaret" + "\n";

Oracle10g: Java Programming 9-5


Performing Operations on Strings

• Find the length of a string:


int length(); String str = "Comedy";
int len = str.length();

• Find the character at a specific index:


char charAt(int index); String str = "Comedy";
char c = str.charAt(1);

• Return a substring of a string:


String substring String str = "Comedy";
(int beginIndex, String sub =
int endIndex); str.substring(2,4);

9-6 Copyright © 2004, Oracle. All rights reserved.

Performing Operations on Strings


Find the Length of a String
The length() method returns the number of characters in a string. In the example in the
slide, len is set to 6.
Return the Character at a Specified Index
The charAt() method returns the character at the specified index (indexing starts at 0). In
the example in the slide, c is set to "o".
Return a Substring of a String
The substring() method returns a specified substring (starting at beginIndex, ending
at endIndex - 1) of the string. In the example in the slide, sub is set to "me".
Instructor Note
The following statements point the object reference str to a new location in memory, rather
than changing the contents of the string:
String str = "Action";
str = "Comedy";
The second statement creates a second String object that is also read-only. This distinction
is theoretical in most cases; the real significance of immutability for the programmer is that
you cannot manipulate the characters within a string, as you can with C pointers or character
arrays.
Oracle10g: Java Programming 9-6
Performing More Operations on Strings

• Convert to uppercase or lowercase:


String toUpperCase(); String caps =
String toLowerCase(); str.toUpperCase();

• Trim whitespace:
String trim(); String nospaces =
str.trim();

• Find the index of a substring:


int indexOf (String str); int index =
int lastIndexOf str.indexOf("me");
(String str);

9-7 Copyright © 2004, Oracle. All rights reserved.

Performing More Operations on Strings


Convert to Uppercase or Lowercase
The toUpperCase() method returns a new string containing an uppercase version of the
original string. Similarly, the toLowerCase() method returns a new string containing a
lowercase version of the original string.
Trim Whitespace
The trim() method returns a new string containing a copy of the old string with whitespace
removed from both ends.
Find the Index of a Substring
There are two accessors that return the position of a specific character or string:
indexOf and lastIndexOf
The indexOf() method returns the index of a specified substring. It returns a zero-based
position of substring within str or –1 if not found. The lastIndexOf() method returns
the index of the last occurrence of a specified substring.
Note: There are multiple versions of both these methods. Check the online J2SE
documentation for the String class for details of each one.

Oracle10g: Java Programming 9-7


Comparing String Objects

• Use equals()if you want case to count:


String passwd = connection.getPassword();
if (passwd.equals("fgHPUw"))… // Case is important

• Use equalsIgnoreCase()if you want to ignore


case:
String cat = getCategory();
if (cat.equalsIgnoreCase("Drama"))…
// We just want the word to match
• Do not use ==.

9-8 Copyright © 2004, Oracle. All rights reserved.

Comparing String Objects


boolean equals(Object anObj) returns true if the specified strings contains the
same text. It does not return true if anObj is null or is not a String object.
boolean equalsIgnoreCase(String s2) is similar to equals(), except that it
ignores case.
Do not use the == operator to compare String objects or to compare any types of objects.
With objects, == returns true only if the two references point to the same object.

Oracle10g: Java Programming 9-8


Producing Strings from Other Objects

• Use the Object.toString() method.


• Your class can override toString().
public Class Movie {…
public String toString () {
return name + " (" + Year + ")";
}…

• System.out.println() automatically calls an


object’s toString() method if a reference is
passed to it.
Movie mov = new Movie(…);
System.out.println(mov);

9-9 Copyright © 2004, Oracle. All rights reserved.

Strings from Objects


The toString method for a class object returns a string consisting of the name of the class
of which the object is an instance, the “@” (at sign) character, and the unsigned hexadecimal
representation of the hash code of the object. The toString() method is invoked
automatically whenever you use any object reference in a string concatenation expression, or
pass it to System.out.println. In the example in the slide, the Movie class provides a
toString() method that prints the name and year of the movie.
What Happens If a Class Does Not Provide a toString() Method?
If a class does not provide its own toString() method, then it inherits one from the
Object class. The string that is produced by Object.toString() is not very user-
friendly; it consists of the name of the class of which the object is an instance and a
hexadecimal number representing a hash code. The equivalent code that is inherited from the
Object.toString() method is:
public String toString() {
return getClass().getName() +
'@' + Integer.toHexString(hashCode());
}

Oracle10g: Java Programming 9-9


Producing Strings from Primitives

• Use String.valueOf():
String seven = String.valueOf(7);
String onePoint0 = String.valueOf(1.0f);

• There is a version of System.out.println()for


each primitive type:
int count;

System.out.println(count);

9-10 Copyright © 2004, Oracle. All rights reserved.

Strings from Primitives


The String class provides a static method valueOf() that returns a string representation
of a primitive type. However, a String does not have a valueOf() method for byte or
short. There is a version of valueOf() for each remaining primitive type. The example in
the slide uses two versions:
String valueOf(int i)
String valueOf(float f)
Printing Primitives
When a primitive is concatenated with a string, it is automatically converted to a string by
calling String.valueOf(). When a primitive is passed to System.out.println()
on its own, the appropriate version of println() is called; there is a version for each
primitive type.

Oracle10g: Java Programming 9-10


Producing Primitives from Strings

• Use the primitive wrapper classes.


• There is one wrapper class for each primitive type:
– Integer wraps the int type.
– Float wraps the float type.
– Character wraps the char type.
– Boolean wraps the boolean type.
– And so on…
• Wrapper classes provide methods to convert a
String to a primitive, and primitives to a String.

9-11 Copyright © 2004, Oracle. All rights reserved.

Primitive Wrapper Classes


For each primitive type, Java provides a corresponding wrapper class that allows a primitive
to be handled like an object. Each wrapper class provides a static method to convert a
String to the corresponding primitive type. The following slide shows how to use these
conversion methods.
Other Uses of Wrapper Classes
• Wrapper classes are useful if you need to treat a primitive type as an object. For
example, you cannot store primitive types in a Vector, which holds objects. Thus, you
will convert an int to an Integer object by using the Integer(int) constructor.
• Wrapper classes provide conversion methods that are related to primitive data type. For
example, the Integer class has a number of methods, including
Integer.parseInt(), that convert a String containing digits to an int.
• Wrapper classes also provide variables that are related to the type. For example,
Integer.MAX_VALUE is the largest possible value of an int.
Instructor Note
Each wrapper class has a toString() method. The following two statements convert an
int i to a String:
String str = String.valueOf(i);
String str = Integer.toString(i);

Oracle10g: Java Programming 9-11


Wrapper Class Conversion Methods

Example: Use the methods to process data from fields


as they are declared.

String qtyVal = "17";


String priceVal = "425.00";
int qty = Integer.parseInt(qtyVal);
float price = Float.parseFloat(priceVal);
float itemTotal = qty * price;

9-12 Copyright © 2004, Oracle. All rights reserved.

Wrapper Class Conversion Methods


The example in the slide shows hardcoded String variables containing numeric values.
These values are used to perform a calculation. The qtyVal string is being converted into a
int by using the Integer.parseInt() method and the priceVal is being converted
into a float by using the Float.ParseFloat() method.
Note that the conversion methods were called without instantiating either an Integer object
or a Float object. The wrapper classes serve as a home for their conversion methods and
need not be instantiated when the methods are called.
What Happens If the Strings Contain a Value That Cannot be Converted?
If the string contains a noninteger value in the first field, then Integer.parseInt() will
fail and throw an exception. To handle such a case, you must add code to catch and handle
this exception and to catch and handle a similar exception that is thrown by
Float.parseFloat().
Instructor Note
Typically, string data comes from a user in a form, rather than be hardcoded in the
application.

Oracle10g: Java Programming 9-12


Changing the Contents of a String

• Use the StringBuffer class for modifiable


strings of characters:
public String reverseIt(String s) {
StringBuffer sb = new StringBuffer();
for (int i = s.length() - 1; i >= 0; i--)
sb.append(s.charAt(i));
return sb.toString();
}

• Use StringBuffer if you need to keep adding


characters to a string.
Note: StringBuffer has a reverse() method.

9-13 Copyright © 2004, Oracle. All rights reserved.

Introducing the StringBuffer Class


StringBuffer represents strings that can be modified and extended at run time. The
following example creates three new String objects, and copies all the characters each time
a new String is created:
String quote = "Fasten your seatbelts, ";
quote = quote + "it’s going to be a bumpy night.";
It is more efficient to preallocate the amount of space that is required by using the
StringBuffer constructor and its append() method as follows:
StringBuffer quote = new StringBuffer(60); // alloc 60
chars
quote.append("Fasten your seatbelts, ");
quote.append(" it’s going to be a bumpy night. ");
StringBuffer also provides several overloaded insert() methods for inserting various
types of data at a particular location in the StringBuffer.
Instructor Note
The example in the slide uses StringBuffer to reverse the characters in a string. A
StringBuffer object is created, with the same length as the string. The loop traverses the
String parameter in reverse order and appends each of its characters to the
StringBuffer object by using append(). The StringBuffer therefore holds a
reverse copy of the String parameter. At the end of the method, a new String object is
created from the StringBuffer object, and this String is returned from the method.

Oracle10g: Java Programming 9-13


Formatting Classes

The java.text package contains:


• An abstract class called Format with the format
() method shown in the following example:
public abstract class Format … {
public final String format(Object obj){
//Formats an object and produces a string.
}

}

• Classes that format locale-sensitive information


such as dates, numbers, and messages
– DateFormat, NumberFormat, and MessageFormat

9-14 Copyright © 2004, Oracle. All rights reserved.

Formatting Classes
These formatting methods define the programming interface for formatting locale-sensitive
objects into strings and for parsing strings back into objects (the parseObject(…)method).
Any string that is formatted by the format(…) method is guaranteed to be parseable by
parseObject.
If there is no match when parsing, parseObject(String) throws a
ParseException, and parseObject(String, ParsePosition) leaves the
ParsePosition index member unchanged and returns null.
Below hierarchy of Format class.

Format Format Format


DateFormat MessageFormat NumberFormat
SimpleDateFormat ChoiceFormat
DecimalFormat

Oracle10g: Java Programming 9-14


Using the SimpleDateFormat Class

The SimpleDateFormat:
• Is a concrete class for formatting and parsing
dates in a locale-sensitive manner
• Allows you to start by choosing any user-defined
patterns for date–time formatting
• Uses time-pattern string to display the date:
– y year 1996
– M month in year July or 07
– m minute in hour 30

9-15 Copyright © 2004, Oracle. All rights reserved.

Example of SimpleDateFormat
import java.text.SimpleDateFormat;
:
SimpleDateFormat df = new SimpleDateFormat("dd-MMMM-yyyy");
System.out.println(df.format(new java.util.Date() ));

Format Pattern Result


“yyyy.MM.dd G ‘at’ hh:mm:ss z” 1996.07.10 AD at 15:08:56 PDT
“EEE, MMM d, “yy” Wed, Jul 10, ’96
“hh ‘o”clock’ a, zzzz” 12 o’clock PM, Pacific Daylight Time
“K:mm a, z” 0:00 PM, PST
“yyyyy.MMMMM.dd GGG hh:mm aaa” 1996.July.10 AD 12:08 PM

Oracle10g: Java Programming 9-15


Using the MessageFormat Class

The MessageFormat:
• Is a concrete class for constructing language
neutral messages, displayed for end users
• Takes a set of objects, formats them, and then
inserts the formatted strings into the pattern at the
appropriate places
• Differs from other Format classes, in that you
create a MessageFormat object
• Is typically set dynamically at run time

9-16 Copyright © 2004, Oracle. All rights reserved.

Example of MessageFormat
MessageFormat provides a means to produce concatenated messages in a language-neutral
way. You use this to construct messages displayed for end users.
The MessageFormat takes a set of objects, formats them, and then inserts the formatted
strings into the pattern at the appropriate places. It differs from the other Format classes in
that you create a MessageFormat object with one of its constructors.
Object[] arguments = {
new Integer(7),
new Date(System.currentTimeMillis()),
"a disturbance in the Force" };
String result = MessageFormat.format(
"At {1,time} on {1,date}, there was {2} on planet
{0,number,integer}.", arguments);

Output: At 12:30 PM on Jul 3, 2053, there was a disturbance in


the Force on planet 7.

Oracle10g: Java Programming 9-16


Using DecimalFormat

The DecimalFormat:
• Is a concrete subclass of NumberFormat for
formatting decimal numbers
• Allows for a variety of parameters and for
localization to Western, Arabic, or Indic numbers
• Uses standard number notation in format
public DecimalFormat(String pattern);

9-17 Copyright © 2004, Oracle. All rights reserved.

Using the DecimalFormat


Special characters are used in the parts of the pattern. For example, if you are using the
decimal format constructor to create a format pattern for displaying decimal numbers, then the
structure of the pattern can be represented by the symbols in the following chart:
Symbol Meaning
0 a digit
# a digit; zero shows as absent
. placeholder for decimal separator
, placeholder for grouping separator
; separates formats
- default negative prefix
% multiply by 100 and show as percentage
unicode \u2030 multiply by 1000 and show as per mille
unicode \\u00A4 currency sign; replaced by currency symbol; if doubled, replaced by
international currency symbol

Oracle10g: Java Programming 9-17


Guided Practice

1. What is the output of each code fragment?


a.
String s = new String("Friday");
if(s == "Friday")
System.out.println("Equal A");
if(s.equals("Friday"))
System.out.println("Equal B");

b.

int num = 1234567;


System.out.println(String.valueOf(num).charAt(3));

9-18 Copyright © 2004, Oracle. All rights reserved.

Instructor Note
Students must be able to answer these questions on paper (or interactively, as a class
discussion) with reference to the online J2SE documentation.
Answers
1a. Equal B
s == "Friday" tests whether the string s and the string "Friday" point to exactly the
same location in memory. This is not true, so "Equal A" is not printed.
s.equals("Friday") tests whether the string s and the string "Friday" contain
exactly the same characters, which is true, so "Equal B" is printed.
1b. 4
String.valueOf(num) converts the integer 1234567 to the string "1234567".
"1234567".charAt(3) returns the character at index 3. Indexes always start from zero,
so the character at index 0 is 1, and the character at index 3 is 4.

Oracle10g: Java Programming 9-18


Guided Practice

2. What is the output of each code fragment?


a.
String s1 = "Monday";
String s2 = "Tuesday";
System.out.println(s1.concat(s2).substring(4,8));

b.
// s3 begins with 2 spaces and ends with 2 spaces
String s3 = " Monday ";
System.out.println(s3.indexOf("day"));
System.out.println(s3.trim().indexOf("day"));

9-19 Copyright © 2004, Oracle. All rights reserved.

Instructor Note
Answers
2a. ayTu
The result of s1.concat(s2) is "MondayTuesday".
"MondayTuesday".substring(4,8) returns the substring beginning at 4 and ending
at 7 (remember that substring(beginIndex, endIndex) returns a substring
beginning at beginIndex and ending at endIndex - 1).
Counting from the beginning of the string, starting with index 0, gives:
MondayTuesday
01234567
Characters 4, 5, 6, and 7 are "a", "y", "T", and "u".
2b. 5
3
You want to find out the index of the first character of "day" in " Monday ". The
first two characters of " Monday " are spaces. Counting from the left, starting with
index 0, gives index 5 for "d".
The result of " Monday ".trim() is "Monday". Again, counting from the left,
starting with index 0, gives index 3 for "d".

Oracle10g: Java Programming 9-19


Using Regular Expressions

• Matches character sequences against patterns


specified by regular expressions
• Includes a Matcher class which is the engine that
performs match operations
• Employs a Pattern class to provide a compiled
representation of a regular expression

Pattern p = Pattern.compile("a*b");
Matcher m = p.matcher("aaaaab");
boolean b = m.matches();

9-20 Copyright © 2004, Oracle. All rights reserved.

Using Regular Expressions


A regular expression is a pattern of characters that describe a set of strings. You can use the
java.util.regex package to find, display, or modify some of the occurrences of a
pattern in an input sequence.
Pattern Class
An instance of the Pattern class represents a regular expression that is specified in string
form in a syntax similar to that used by Perl. A regular expression, specified as a string, must
first be compiled into an instance of this class. The resulting pattern can then be used to create
a Matcher object that can match arbitrary character sequences against the regular
expression. All of the states involved in performing a match resides in the matcher; so, many
matchers can share the same pattern.
Matcher Class
A matcher is created from a pattern by invoking the pattern’s matcher method. After it is
created, a matcher can be used to perform three different kinds of match operations:
• The matches method attempts to match the entire input sequence against the pattern.
• The lookingAt method attempts to match the input sequence, starting at the
beginning, against the pattern.
• The find method scans the input sequence looking for the next subsequence that
matches the pattern.
Oracle10g: Java Programming 9-20
Regular Expression Examples
String class has new methods matches(regExpr), replaceFirst(regExpr),
replaceAll(regExpr) and split(regExpr).
Example 1
String p = "^[A-Z].*[\\.?!]$"; // ^ and $ irrelevant
String s = "Java is fun!";
System.out.println(s.matches(p)); //returns true. Note:
matches(..) always matches entire string
New classes for regular Expressions: java.util.regex.Pattern,
java.util.regex.Matcher and
java.util.regex.PatternSyntaxException
Example 2
String p = "^[A-Z].*[\\.?!]$";
String s = "Java is fun!";
Pattern pc1 = Pattern.compile(p, Pattern.CASE_INSENSITIVE);
Matcher m1 = pc1.matcher(s);
//Also possible: Pattern.matches(“regExp”,”string”). Less
efficient for repeated matches
System.out.println(m1.matches()); //returns true.
Example 3
Pattern pc2 = Pattern.compile("\\bis");
Matcher m2 = pc2.matcher("Java is a language. This is fun");
while (m2.find())
System.out.println(m2.start());//2 matches at 5 and 25
m2.reset("John is an actor. His movies are grisly.");
while (m2.find())
System.out.println(m2.start());//1 match at 5 only

Oracle10g: Java Programming 9-21


Regular Expression Examples (continued)
Example 4
Pattern pc2 = Pattern.compile("\\bis");
String frags = pc2.split("Java is a language. This is fun");
for (int i=0; i < frags.length; i++)
System.out.print("\"" + frags[i] + "\"\t");
output:"Java “ " a language. This " " fun"
Flags used by Pattern.compile(String regex, int flags):
CASE_INSENSITIVE: Matching is not case sensitive.
DOTALL: If set, the “.” character matches any character; otherwise, it matches all characters
except the end-of-line character.
MULTILINE: If set, the ^ and $ characters match not only the beginning and end of the string
but also matches the beginning and end of each line within the string.
UNIX_LINES: If set, then only the newline character (‘\n’) is considered a line terminator;
otherwise, the line terminators can be \n,\r and \r\n.
Special Metacharacters (Short List):
\escape character. \\, \n, \r, \t,\f matches \, newline, carriage return, tab, and formfeed
respectively.
^ matches beginning of string (or line if MULTILINE is set).
$ matches end of string (or line if MULTILINE is set).
\b matches on a word boundary.
xy matches x followed by y.
x | y matches either x or y.
(…) grouping operator groups into a unit that can be repeated with *,+ or ?
Character classes: [a-d] matches a single character ‘a’ through ‘d’.
[^a-d] matches any character except a-d.
Repetition: x? matches zero or one occurrence of x
x* matches 0 or more occurrences of x
x+ matches 1 or more occurrences of x

Oracle10g: Java Programming 9-22


About System.out.println

Understanding System.out.println()
• System is a class in the java.lang package.
• out is a public final static (class) variable.
– Declared as a PrintStream object reference
• println() is an overloaded method of the
PrintStream class.
– PrintStream is a FilterOutputStream that
subclasses OutputStream.
• System.err is also provided as a PrintStream
object reference to write to standard error.

9-23 Copyright © 2004, Oracle. All rights reserved.

Understanding System.out.println()
The principal way in which your Java program has been exposed to the external environment
in previous lessons is through System.out.println() where you have sent data to the
console output.
Most Java programs execute in an environment that has a notion of the console, to which both
output and errors can be directed. If you run your program from a UNIX or DOS command-
line shell, the Java run-time environment binds the console to the shell or command window.
Two of the three System items, standard output and standard err, are derived from the
PrintStream class. The third System stream is an in, which typically reads input
entered by the user.
public final static PrintStream out = …; // standard output
public final static PrintStream err = …; // standard error
About the PrintStream Class
The PrintStream class, a subclass implementation of an OutputStream, allows you to
print data in a platform-independent way, such as primitive values and objects formatted as
strings (that is, in their textual representations). This is achieved by calling one of the
overloaded implementations of the println() methods defined in the PrintStream
class.

Oracle10g: Java Programming 9-23


About OutputStream and PrintStream

• OutputStream provides basic byte I/O operations:


– write(int b) to write one byte
– write(byte[] b) to write an array of bytes
– write(byte[] b,int off,int len) to write a
subset of an array of bytes
– flush() and close() to flush and close the stream
• PrintStream is a subclass of (Filter)Output
Stream, which
– Converts Unicode to environment byte encoding
– Terminates lines in a platform-independent way
– Flushes the output stream

9-24 Copyright © 2004, Oracle. All rights reserved.

About OutputStream and PrintStream


The OutputStream class provides basic methods for low-level byte I/O operations. The
methods are:
• write(int b) to write one byte
• write(byte[] b) to write an array of bytes
• write(byte[] b, int off, int len) to write a subset of an array of bytes
• flush() and close() flushes and closes the stream
Using an OutputStream object is not very useful for printing text terminated by a new line
in a platform-independent way. However, PrintStream, a subclass of
FilterOutputStream, extends the basic I/O capabilities of OutputStream in the
following ways:
• It converts Java Unicode strings into the byte encoding of the environment, such that
you can see the text in a readable format.
• It terminates a line in a platform-independent way. In JDK releases before 1.2, new lines
written were not platform independent.
• It flushes the stream. In general, there is no guarantee that data written will be visible
immediately. Flushing the stream explicitly requests that the data be displayed now.

Oracle10g: Java Programming 9-24


What Is Object Serialization?

Serialization is a lightweight persistence mechanism


for saving and restoring streams of bytes containing
primitives and objects.
• A class indicates that its instances can be
serialized by:
– Implementing java.io.Serializable or
java.io.Externalizable interface
– Ensuring that all its fields are serializable, including
other objects referenced
– Using the transient modifier to prevent fields
from being saved and restored

9-25 Copyright © 2004, Oracle. All rights reserved.

Object Serialization
Object serialization is the process of encoding an object, and the objects it references, into a
stream of bytes. Object serialization also provides mechanisms for reconstructing the object,
and its referenced objects from the stream.
Serialization can be used for lightweight persistence (for example, permanent storage in file
on disk) or used for communication between distributed Java applications.
The object saved and the relationship it has with other objects, via object references, is called
an object graph. When an object is saved and restored, the objects it references must also be
maintained. By default, when an object is stored, all of the objects that are reachable from that
object are stored as well; that is, the object graph is stored.
For an object to be saved to and restored from a stream, its class can implement one of the
following:
• The java.io.Serializable interface
• The java.io.Externalizable interface
Only the identity of the class of an Externalizable instance is written in the serialization
stream and it is the responsibility of the class to save and restore the contents of its instances.

Oracle10g: Java Programming 9-25


Serialization: Example
package serdemo;
import java.io.ObjectInputStream;
import java.io.FileInputStream;
import java.io.Serializable;
import java.io.ObjectOutputStream;
import java.io.FileOutputStream;
public class SerializationDemo {
public static void main(String[] args) {
Person p1 = new Person("John", 'M', null);
Person p2 = new Person("Mary", 'F', p1);
p1.setSpouse(p2);
try{
ObjectOutputStream os = new ObjectOutputStream(new
FileOutputStream("person_graph.ser") );
os.writeObject(p1); //entire object graph is written
os.close();
ObjectInputStream is = new ObjectInputStream(new
FileInputStream("person_graph.ser") );
Person p3 = (Person) is.readObject(); //entire object
graph is read
is.close();
System.out.println(p3);
Person p4 = p3.getSpouse(); //Object obtained from graph.
System.out.println(p4);
}
catch(Exception ioe){
ioe.printStackTrace();
}
}//end main()
}
class Person implements Serializable{
private String name;
private char gender;
private Person spouse;

Oracle10g: Java Programming 9-26


Serialization: Example (continued)
Person(){
}
Person(String name, char gender, Person spouse){
setName(name);
setGender(gender);
setSpouse(spouse);
}
public String getName() {
return name;
}
public void setName(String newName) {
name = newName;
}
public char getGender() {
return gender;
}
public void setGender(char newGender) {
gender = newGender;
}
public Person getSpouse() {
return spouse;
}
public void setSpouse(Person newSpouse) {
spouse = newSpouse;
}
public String toString(){
return "\nName=" + name
+ "\nGender=" + gender
+ "\nSpouse=" + getSpouse().getName();
}
}

Oracle10g: Java Programming 9-27


Serialization Streams, Interfaces,
and Modifiers

• Example of implementing java.io.Serializable


– Mark fields with the transient modifier to prevent
them from being saved; that is, to protect the
information.
import java.io.Serializable;
public class Member implements Serializable {
private int id;
private String name;
private transient String password;

}

• Write object with java.io.ObjectOutputStream.


• Read object with java.io.ObjectInputStream.

9-28 Copyright © 2004, Oracle. All rights reserved.

Serialization Streams, Interfaces, and Modifiers


As already stated, for an object to be serialized, its class must implement the
Serializable interface, as shown in the slide, or the Externalizable interface.
Implementing the Serializable interface does not require that you write any methods and
acts as a marker to the Java serialization system that the object can be serialized.
Use the transient modifier for variables whose values you do not want saved when the
object contained is serialized (for example, to prevent sensitive information from being
stored). However, if a variable in your serializable object references another object that is not
serializable, then that variable must be made transient; otherwise, serialization will fail. The
java.io.NotSerializableException exception is thrown if serialization fails.
Stream for Writing Objects
Writing objects to a stream is accomplished by using the ObjectOutputStream class,
whose constructor accepts another OutputStream. Thus, wrapping another stream in an
ObjectOutputStream is quite common. For example, wrapping a
FileOutputStream in an ObjectOutputStream stores objects in a file.
Stream for Reading Objects
Reading objects from a stream is possible by using the ObjectInputStream class whose
constructor accepts another InputStream.

Oracle10g: Java Programming 9-28


Summary

In this lesson, you should have learned how to:


• Create strings in Java
• Use the conversion methods that are provided by
the predefined wrapper classes
• Use the StringBuffer class for manipulating
character data
• Manipulate objects by using the DateFormat,
DecimalFormat, and MessageFormat classes

9-29 Copyright © 2004, Oracle. All rights reserved.

Oracle10g: Java Programming 9-29


Practice 9: Overview

This practice covers:


• Creating a new Order class
• Populating and formatting orderDate
• Formatting existing orderDate values with the
GregorianCalendar class
• Formatting orderTotal

9-30 Copyright © 2004, Oracle. All rights reserved.

Practice 9: Overview
Note: If you have successfully completed the previous practice, then continue using the same
directory and files. If the compilation from the previous practice was unsuccessful and you
want to move on to this practice, then change to the les08 directory, load up the
OrderEntryWorkspaceLes08 workspace, and continue with this practice.
In this practice, you use the GregorianCalendar class. This class allows you to get a
date value for a specific point in time. You can specify a date and time and see the behavior of
your class respond to that specific date and time. The class can then be based on the values
you enter, not just the system date and time.
Viewing the model: To view the course application model up to this practice, load the
OrderEntryWorkspaceLes08 workspace. In the Applications – Navigator node, expand the
OrderEntryWorkspaceLes08 – OrderEntryProjectLes08 -
Application Sources – oe, and double-click the UML Class Diagram1 entry.
This diagram displays all the classes created to this point in the course.

Oracle10g: Java Programming 9-30


Practice 9: Using Strings, StringBuffer, Wrapper, and Text-Formatting Classes
Goal
The goal of this practice is to modify the Util class to provide generic methods to support
formatting the order details, such as presenting the total as a currency and controlling the date
string format that is displayed. This should give you exposure in using some of the
java.text formatting classes.
Note: If you have successfully completed the previous practice, then continue using the same
directory and files. If the compilation from the previous practice was unsuccessful and you
want to move on to this practice, then change to the les08 directory, load the
OrderEntryLes08 workspace, and continue with this practice.
Your Assignment
You create a method called toMoney() to return a currency formatted string for the order
total. You also create a method called toDateString() that formats the date in a
particular way. You then modify the Order class to use these methods to alter display of
order details, such as the order date and total.
Add Formatting Methods to the Util Class
1. Create a static method called toMoney() that accepts an amount as a double
and returns a String.
a. Add the following import statement to the class:

import java.text.DecimalFormat;

b. Add the following toMoney() method code to the class, to format a double:

public static String toMoney(double amount) {


DecimalFormat df = new DecimalFormat("$##,###.00");
return df.format(amount);
}

c. Save and compile the Util class.


2. Add the following static toDateString() method to format a date.
a. Add the following import statements to the Util class:

import java.util.Date;
import java.text.SimpleDateFormat;

b. Use the following code for your method:

public static String toDateString(Date d) {


SimpleDateFormat df =
new SimpleDateFormat("dd-MMMM-yyyy");
return df.format(d);
}
c. Save and compile the Util class.

Oracle10g: Java Programming 9-31


Practice 9: Using Strings, StringBuffer, Wrapper, and Text-Formatting Classes
(continued)
3. In this step of the practice, you use the GregorianCalendar class. This class allows
you to get a date value for a specific point in time. You can specify that date and time,
see the behavior of your class based on the values you enter, not just the system date and
time.
Create another static method called getDate() that accepts three integers
representing the day, month, and year, and returns a java.util.Date object
representing the specified date (For Example: month = 1 which represents January on
input). Because many of the methods in the Date class that could have been used are
deprecated, you use the GregorianCalendar class to assist with this task.
a. Import the java.util.GregorianCalendar class.
b. Use the following for the method:

public static Date getDate(int day,int month,int year)


{
// Decrement month, Java interprets 0 as January.
GregorianCalendar gc =
new GregorianCalendar(year, --month, day);
return gc.getTime();
}
c. Save and compile the Util class.
Use the Util Formatting Method in the Order Class
4. In the Order class, modify the toString() method to use the Util class methods
toMoney() and toDateString() altering the display format..
a. In the toString() method, replace the return value with the following text.
When shipMode is not specified, you do not need to display the information for
"Shipped: ".

return "Order: " + id +


" Date: " + Util.toDateString(orderDate) +
" Shipped: " + shipMode +
" (" + Util.toMoney(getOrderTotal()) + ")";

b. Save and compile the Order class, and then run the OrderEntry class to view
the changes to the displayed order details.

c. Now import the java.text.MessageFormat class in the Order class, and


use this class to format the toString() return value, as follows:
import java.text.MessageFormat;
Object[] msgVals = {new Integer(id),
Util.toDateString(orderDate), shipMode,
Util.toMoney(getOrderTotal()) };
return MessageFormat.format(
"Order: {0} Date: {1} Shipped: {2} (Total: {3})",
msgVals);

Oracle10g: Java Programming 9-32


Practice 9: Using Strings, StringBuffer, Wrapper, and Text-Formatting Classes
(continued)
d. Save and compile the Order class, and then run the OrderEntry class to view
the results of the displayed order. The change to the displayed total must appear.
Optional Extra Credit
Use Formatting in OrderItem Class
5. In the OrderItem class, modify the toString() method to use the
Util.toMoney() methods to alter the display format of item total.

a. In the toString() method, replace the return statement with the following:

return lineNbr + " " + quantity + " " +


Util.toMoney(unitPrice);

b. Save and compile the OrderItem class, and then run the OrderEntry class to
view the changes to the order item total.
Use Util.getDate() to Set the Order Date
6. In the OrderEntry class, alter the second order object creation statement to use the
Util.getDate() method to provide the value for the first argument in the
constructor. Choose the previous day’s date for the values of the day, month, and year
arguments supplied to the Util.getDate() method.

a. The call to the constructor should look like:

Order order2 =
new Order(Util.getDate(7, 3, 2002), "overnight");

b. Save, compile, and run the OrderEntry class to confirm that the order
date has been set correctly.

Oracle10g: Java Programming 9-33


Reusing Code with Inheritance
and Polymorphism

Copyright © 2004, Oracle. All rights reserved.

Schedule: Timing Topic


80 minutes Lecture
30 minutes Practice
110 minutes Total
Instructor Note
This lesson reviews the inheritance and polymorphism properties that were introduced in the
lesson titled “Defining Object-Oriented Principles,” but from a Java-language point of view.
Objectives

After completing this lesson, you should be able to do


the following:
• Define inheritance
• Use inheritance to define new classes
• Provide suitable constructors
• Override methods in the superclass
• Describe polymorphism
• Use polymorphism effectively

10-2 Copyright © 2004, Oracle. All rights reserved.

Lesson Aim
This lesson shows how to extend an existing class in Java, and illustrates the power of
polymorphism in object-oriented programs. You learn how to extend existing classes to
meet specific application needs. You also learn how to override superclass methods to fine-
tune object characteristics and behaviors.

Oracle10g: Java Programming 10-2


Key Object-Oriented Components

• Inheritance
• Constructors referenced by subclass
• Polymorphism
• Inheritance as an OO fundamental

Superclass
InventoryItem

Subclasses
Movie Game Vcr

10-3 Copyright © 2004, Oracle. All rights reserved.

Key Object-Oriented Components


What Is Inheritance?
Inheritance defines a relationship between classes where one class shares the data structure
and behaviors of another class. Inheritance is a valuable technique because it enables and
encourages software reuse by allowing you to create a new class based on the properties of
an existing class. As a result, the developer is able to achieve greater productivity than
would otherwise be possible.
Inheritance and Constructors
Constructors are blocks of code that are executed when an object of that class is created. By
using an inheritance model, each subclass has access to the superclass’s constructor. Any
common constructor code can be put in the superclass constructor and called by the
subclass. This technique minimizes the need for duplicated code and provides for consistent
object creation.
Polymorphism
Polymorphism describes the ability of Java to execute a specific method based on the object
reference that is used in the call. By using this technique, you can define a method in the
superclass and override it in the appropriate subclass. You can now write method calls to the
superclass, and if the method is overridden in a subclass, then Java automatically calls the
right method. This is a very powerful construct that you can use to define superclass
methods before knowing the details of any subclasses.
Oracle10g: Java Programming 10-3
Example of Inheritance

• The InventoryItem class defines methods and


variables.
InventoryItem

Movie

• Movie extends InventoryItem and can:


– Add new variables
– Add new methods
– Override methods in InventoryItem class

10-4 Copyright © 2004, Oracle. All rights reserved.

The InventoryItem Class


The InventoryItem class defines the attributes and methods that are relevant for all
kinds of inventory items. The attributes and methods may include:
• Attributes, such as the date of purchase, purchase cost, and condition
• Methods, such as calculating a deposit, changing the condition, and setting the price
Dealing with Different Types of InventoryItem
Depending on what you are trying to do in your program, you may need to represent a
specific type of InventoryItem in a particular way. You can use inheritance to define a
separate subclass of InventoryItem for each different type of InventoryItem. For
example, you may define classes such as Movie, Game, and Vcr.
Each subclass automatically inherits the attributes and methods of InventoryItem, but
can provide additional attributes and methods as necessary. For example, the Movie class
may define the following additional attributes and methods:
• Attributes, such as the title of the movie, the director, and the running length
• Methods, such as reviewing the movie and setting the rating
Subclasses can also override a method from the superclass if they want to provide more
specialized behavior for the method. In this example, the movie could override the
InventoryItem calculating a deposit method. A movie may have an additional amount
calculated into the deposit.

Oracle10g: Java Programming 10-4


Specifying Inheritance in Java

• Inheritance is achieved by specifying which


superclass the subclass extends.
public class InventoryItem {

}
public class Movie extends InventoryItem {

}

• Movie inherits all the variables and methods of


InventoryItem.
• If the extends keyword is missing, then the
java.lang.Object is the implicit superclass.

10-5 Copyright © 2004, Oracle. All rights reserved.

Specifying Inheritance in Java


When you define a subclass, you must provide code only for the features in the subclass that
are different from those of the superclass. In a very real way, the subclass is extending the
superclass. The syntax for specifying inheritance in Java makes use of the extends
keyword. For example:
public class InventoryItem {
// Definition of the InventoryItem class
}
public class Movie extends InventoryItem {
// Additional methods and attributes, to distinguish a
// Movie from other types of InventoryItem
}
Characteristics of Inheritance in Java
If you have experience with another OO language, such as C++, then note that Java allows
only single inheritance. In other words, a class can specify only one immediate superclass.
Also, remember that all classes in Java are automatically inherited from the root class
called Object, which sits at the top of the inheritance tree. If a class does not specify an
explicit superclass, as is the case with InventoryItem in the slide, then the class is
deemed to extend directly from Object, as if it were defined as follows:
public class InventoryItem extends Object { …
The java.lang.Object class is the root class for all the classes in Java.

Oracle10g: Java Programming 10-5


Defining Inheritance
by Using Oracle JDeveloper 10g

• When specifying a class, JDeveloper asks for its


superclass:

• JDeveloper generates the code automatically.

10-6 Copyright © 2004, Oracle. All rights reserved.

Defining Inheritance by Using Oracle JDeveloper 10g


To define a new class that inherits from another class, follow these steps:
1. Select File > New from the Main menu bar.
2. A dialog box is displayed that prompts you for the kind of feature you want to create.
Select the “General” category, and double-click the Java Class icon. This launches the
New Class dialog box.
3. Specify the name for your class, and browse to the name of the superclass that you
want to extend. In the Browse window, JDeveloper brings up all packages (and the
classes that are contained inside them) that it currently holds in memory. The default
superclass name is java.lang.Object; that is, the Object class that is located in
the java.lang package.
4. Click the OK button. JDeveloper generates a skeleton class to get you started, as
follows:
package practice17;
public class Movie extends InventoryItem {
}

Oracle10g: Java Programming 10-6


What Does a Subclass Object
Look Like?

A subclass inherits all the instance variables of its


superclass.

public class InventoryItem {


Movie
private float price;
private String condition; …
price
}
condition
public class
Movie extends InventoryItem { title
private String title; length
private int length; …
}

10-7 Copyright © 2004, Oracle. All rights reserved.

Variables in Superclass and Subclass


The superclass defines the variables that are relevant for all kinds of InventoryItem,
such as the purchase date and condition. The subclass, Movie, inherits these variables for
free and has to specify only the Movie-specific variables, such as the title.
What Does an Object Look Like?
If you create a plain InventoryItem object, then it contains only the instance variables
that are defined in InventoryItem :
InventoryItem i = new InventoryItem (…);
// an InventoryItem has a price and condition
However, if you create a Movie object, then it contains four instance variables: the two
inherited from InventoryItem, plus two added in Movie:
Movie m = new Movie(…);
// A Movie object has a price and condition, because a
// Movie is a kind of InventoryItem.
// The Movie object also has a title and length.
Declaring Instance Variables as private
Instance variables must normally be declared as private, which means that instances of
subclasses inherit the values, but cannot access them directly. You must define methods to
access private variables. You can define methods in the subclass or inherit them from the
superclass.
Oracle10g: Java Programming 10-7
Default Initialization

• What happens when a subclass


object is created?

Movie movie1 = new Movie(); Movie

• If no constructors are defined: price


condition
– First, the default no-arg
constructor is called in the
superclass. title
– Then, the default no-arg length
constructor is called in the
subclass.

10-8 Copyright © 2004, Oracle. All rights reserved.

Default Provision of Constructors


A class does not inherit any constructors from its superclass. Therefore, the
InventoryItem class has only the constructors explicitly declared in its definition or a
default no-arg constructor if there are no other constructors at all.
What Happens When a Subclass Object Is Created?
The example in the slide creates a movie1 object. For the moment, assume that neither the
Movie class nor the InventoryItem class provides any constructors; all they have is the
default no-arg constructor that is provided automatically by Java.
What happens when a movie1 object is created? Objects are always constructed from the
top class down to the bottom class; that is, from the Object class down to the class that is
being instantiated using new. This ensures that a constructor in a subclass can always rely
on proper construction of its superclass.
In the example, when you create a movie1 object, the no-arg constructor of
InventoryItem is called first to initialize the InventoryItem instance variables with
default values. The price is set to 0 and condition is set to its default: excellent.
After the superclass is initialized, the no-arg constructor of Movie is then called to initialize
the title and length instance variable with default values.

Oracle10g: Java Programming 10-8


The super Reference

• Refers to the base, top-level class


• Is useful for calling base class constructors
• Must be the first line in the derived class
constructor
• Can be used to call any base class methods

10-9 Copyright © 2004, Oracle. All rights reserved.

The super Reference


The super reference is useful only when a class has an ancestor. A subclass inherits all of
the superclass methods and variables as well as creates its own. Methods in the superclass
may be overridden in the subclass by creating methods with the same name and signature in
the subclass. You can use the super keyword to specifically access methods in the
superclass even though they have been overridden in the subclass.
Calling Constructors
One of the more common uses of super is to invoke a constructor provided by the
superclass. When the superclass was designed, it probably had a constructor to ensure proper
initialization of any new objects. Because a subclass inherits all of the superclass variables,
they must be initialized for subclass objects as well.
The syntax rule is that super() must be the first line in the subclass constructor.
Add the super reference within the subclass constructor to access the superclass constructor:
- subclass() { // constructor for the subclass
- super(); // call the superclass constructor
- … ; // subclass specific constructor code
- }
The super keyword may also be used to call any superclass methods.

Oracle10g: Java Programming 10-9


The super Reference Example

public class InventoryItem {


Base class
InventoryItem(String cond) { constructor
System.out.println("InventoryItem");

}
}
class Movie extends InventoryItem { Calls base
Movie(String title) { class
constructor
Movie(String title, String cond)
{super(cond);

System.out.println("Movie");
}
}

10-10 Copyright © 2004, Oracle. All rights reserved.

The super Reference Example


In the example, there are initialization routines that must happen for all inventory items.
Those routines are placed in the InventoryItem constructor. These routines must be
used regardless of the type of InventoryItem that is being constructed, whether it is a
Movie, Game, or a Book.
There are also constructors in each of the subclasses to take care of subclass-specific
routines. The Movie constructor reuses the InventoryItem constructor by referencing it
with the super keyword. This statement is the first statement in the Movie constructor and
may be followed by whatever other statements are necessary to fully construct a Movie
object.

Oracle10g: Java Programming 10-10


Using Superclass Constructors

Use super() to call a superclass constructor:

public class InventoryItem {


InventoryItem(float p, String cond) {
price = p;
condition = cond;
} …
public class Movie extends InventoryItem {
Movie(String t, float p, String cond) {
super(p, cond);
title = t;
} …

10-11 Copyright © 2004, Oracle. All rights reserved.

Nondefault Initialization with Inheritance


The superclass and subclass often have constructors that take arguments. For example,
InventoryItem may have a constructor that takes arguments to initialize price and
condition:
public InventoryItem (float p, String cond) {
price = p;
condition = cond;
}
Likewise, the Movie class may have a constructor that takes enough arguments to initialize
its attributes. This is where things get interesting. A Movie object has three attributes:
price and condition that are inherited from InventoryItem, plus title, which is
defined in Movie itself. The Movie constructor may therefore take three arguments:
public Movie(float p, String cond, String t) { … }

Oracle10g: Java Programming 10-11


Nondefault Initialization with Inheritance (continued)
Rather than initializing price and condition explicitly, all the Movie constructor has
to do is call the superclass constructor. This can be achieved by using the super keyword;
the call to super(…) must be the first statement in the constructor.
public Movie (float p, String cond, String t) {
super (p, cond); // Call superclass constructor
title = t; // Initialize Movie-specific attributes
If you do not explicitly call super(…), then the compiler calls the superclass no-arg
constructor by default. If the superclass does not have a no-arg constructor, then a compiler
error occurs.

Oracle10g: Java Programming 10-12


Specifying Additional Methods

• The superclass defines methods for all types of


InventoryItem.
• The subclass can specify additional methods that
are specific to Movie.

public class InventoryItem {


public float calcDeposit()…
public String calcDateDue()…
… public class Movie extends InventoryItem {
public void getTitle()…
public String getLength()…

10-13 Copyright © 2004, Oracle. All rights reserved.

Methods in the Superclass and Subclass


The slide shows some of the methods that are declared in the superclass and the subclass.
The superclass defines the methods that are relevant for all kinds of InventoryItem,
such as the ability to calculate a deposit or the due date for the item. The subclass, Movie,
inherits these methods from the superclass and has to add only the Movie-specific methods,
such as getting the title and getting the length.

Oracle10g: Java Programming 10-13


Methods in the Superclass and Subclass (continued)
What Methods Can Be Called?
When you create an object, you can call any of its public methods plus any public
methods that are declared in its superclass. For example, if you create an InventoryItem
object, then you can call the public methods that are defined in InventoryItem, plus
any public methods that are defined in its superclass, Object:
InventoryItem i = new InventoryItem (…);
i.getId(); // Call a public method in InventoryItem
i.getClass(…); // Call a public method in Object
If you create a Movie object, then you can call any public methods that are defined in
Movie, InventoryItem, or Object:
Movie m = new movie(…); // Create a Movie object
m.getTitle(); // Call a public method in Movie
m.getId(); // Call a public method in InventoryItem
m.getClass(…); // Call a public method in Object

Oracle10g: Java Programming 10-14


Overriding Superclass Methods

• A subclass inherits all the methods of its


superclass.
• The subclass can override a method with its own
specialized version.
– The subclass method must have the same signature
and semantics as the superclass method.

public class InventoryItem {


public float calcDeposit(int custId) {
if … public class Vcr extends InventoryItem {
return itemDeposit;
public float calcDeposit(int custId) {
} if …
return itemDeposit;
}

10-15 Copyright © 2004, Oracle. All rights reserved.

Overriding Superclass Methods


A subclass inherits all of the methods of its superclass. However, a subclass can modify the
behavior of a method in a superclass by overriding it, as shown in the slide.
To override a superclass method, the subclass defines a method with exactly the same
signature and return type as a method somewhere above it in the inheritance hierarchy.
The method in the subclass effectively hides the method in the superclass. It is important to
make sure that the method in the subclass has the return type and signature as the one that it
is overriding.
Which Method Is Called?
In the example that is shown in the slide, the InventoryItem class provides a
calcDeposit() method, and the Vcr class overrides it with a more specialized version.
If you create an InventoryItem object and call calcDeposit(), then it calls the
InventoryItem version of the method. If you create a Vcr object and call
calcDeposit(), then it calls the Vcr version of the method.

Oracle10g: Java Programming 10-15


Overriding Superclass Methods (continued)
Overriding and Overloading
Do not confuse “method overloading” with “method overriding”:
• Method overloading is a process by which you define multiple methods with different
signatures. Overloaded methods are resolved at compile time, based on the arguments
that you supply.
• Method overriding is a process by which you provide a method with exactly the same
signature as a method in a superclass. Overridden methods are resolved at run time,
unlike overloaded methods.

Oracle10g: Java Programming 10-16


Invoking Superclass Methods

• If a subclass overrides a method, then it can still


call the original superclass method.
• Use super.method() to call a superclass method
from the subclass.

public class InventoryItem {


public float calcDeposit(int custId) {
if …public class Vcr extends InventoryItem {
return 33.00;
public float calcDeposit(int custId) {
} itemDeposit = super.calcDeposit(custId);
return (itemDeposit + vcrDeposit);
}

10-17 Copyright © 2004, Oracle. All rights reserved.

Invoking Superclass Methods


Calling an Overridden Method from the Client Program
As previously mentioned, when a subclass overrides a method in a superclass, it hides that
method. For example, if the client program creates a Vcr object and calls the
calcDeposit() method, then it always executes the Vcr version of calcDeposit():
Vcr v = new Vcr(…); // Create a Vcr object
v.calcDeposit(); // Executes Vcr calcDeposit() method

Oracle10g: Java Programming 10-17


Invoking Superclass Methods (continued)
Calling an Overridden Method from the Subclass
Within the Vcr version of calcDeposit(), you can call the InventoryItem version
of calcDeposit() that is defined in the superclass by using the super keyword. The
super keyword is similar to this, except that it acts as a reference to the current object as
an instance of its superclass.
Calling an overridden superclass method by using super helps to avoid duplicating the
code that is contained in the overridden method; by reducing the amount of duplicate code,
the code is more consistent and easier to maintain.
The syntax for an example of overriding a method is:
super.calcDeposit();
Working in JDeveloper
You can take advantage of JDeveloper’s built-in functionality to see all the methods of a
given class, plus its inherited methods (taken from the superclass). To do this, select the
class (for example, Game, which extends InventoryItem), right-click and select Class
Editor, and then click the Methods tab (the third tab from the left). Toggle the Show
Inherited Methods check box to display methods. The same behavior is available in the
Fields tab.

Oracle10g: Java Programming 10-18


Example of Polymorphism in Java

Recall that the java.lang.Object class is the root


class for all Java Class.
• Methods in the Object class are inherited by its
subclasses.
• The toString() method is most commonly
overridden to achieve polymorphic behavior.
• For example: public class InventoryItem {
public String toString() {
return "InventoryItem value";
}
} = new InventoryItem();
InventoryItem item
System.out.println(item); // toString() called

10-19 Copyright © 2004, Oracle. All rights reserved.

Polymorphism and the toString Method


Polymorphism returns a string representation of the object. In general, the toString
method returns a string that “textually represents” this object. The result must be a concise
but informative representation that is easy for a person to read. It is recommended that all
subclasses override this method.
The toString method for the Object class returns a string consisting of the name of the
class of which the object is an instance, the “@” (at sign) character, and the unsigned
hexadecimal representation of the hash code of the object. In other words, this method
returns a string equal to the value of:
getClass().getName() + '@' + Integer.toHexString(hashCode())

Oracle10g: Java Programming 10-19


Treating a Subclass as Its Superclass

A Java object instance of a subclass is assignable to


its superclass definition.
• You can assign a subclass object to a reference
that is declared with the superclass.
public static void main(String[] args) {
InventoryItem item = new Vcr();
double deposit = item.calcDeposit();
}

• The compiler treats the object via its reference


(that is, in terms of its superclass definition).
• The JVM run-time environment creates a subclass
object, executing subclass methods, if overridden.
10-20 Copyright © 2004, Oracle. All rights reserved.

Subclass and Its Superclass


Any Java subclass object can be assigned to an object reference variable that is declared as
its superclass, or as the same class as itself. The slide example shows that a Vcr object is
assigned to the item object reference, which is declared as an InventoryItem. The
Vcr must previously be declared as a class that extends InventoryItem. The Java
compiler accepts this as valid syntax. This is necessary for polymorphism.
There are two ways to look at the code example:
The Compiler View
The compiler sees the Vcr object as if it were a “kind of” InventoryItem. Therefore, all
methods that are called from the item object reference can only be those defined in the
InventoryItem class, because item is defined as an InventoryItem. In essence, you
are writing generic code to deal with common functionality of any kind of inventory item
object.
The Run-Time View
At run time, JVM dynamically creates the Vcr object. Thus, when you call a method, such
as item.calcDeposit(), it is the Vcr’s calcDeposit() method that is invoked if
it overrides its superclass definition. Otherwise, the inherited method is called. JVM uses a
run-time type checking mechanism to ensure that the call is valid; otherwise, it throws an
exception.

Oracle10g: Java Programming 10-20


Browsing Superclass References
by Using Oracle JDeveloper 10g

Oracle JDeveloper makes it


easy to browse the contents
1
of your superclass.

2
3

10-21 Copyright © 2004, Oracle. All rights reserved.

Browsing Superclass References by Using Oracle JDeveloper 10g


You can use the structure pane on the bottom left of JDeveloper to browse the contents of
any of your superclass references. The following sections describe what to do:
1. Select your class in the navigation pane.
The structure pane at the top left of the navigation pane lists all the classes in your
project. Select the subclass that you want to start with, such as Individual.
2. Select the superclass in the structure pane.
The structure pane at the bottom left of the navigation pane lists all the methods,
variables, and constructors for the current class. It also contains an icon to represent
the superclass, which in this case is Customer.
3. View the superclass reference in the subclass code.
Select the extends superclass text in the Structure pane (in this case, extends
Customer) and the Code Editor displays the reference.

Oracle10g: Java Programming 10-21


Acme Video and Polymorphism

• Acme Video started renting only videos.


• Acme Video added games and Vcrs.
• What is next?
• Polymorphism solves the problem.

10-22 Copyright © 2004, Oracle. All rights reserved.

Acme Video and Polymorphism


Acme Video started as a simple video rental business that only rented videos. As business
began to improve, Acme Video decided to branch out and add video games to its inventory.
It soon started getting requests for Vcrs and for video game devices.
Each of the different items Acme is now renting has unique properties, and it handles each
type in a slightly different manner. For example, it requires a deposit on the Vcrs and video
game devices, but not on videos and games. The deposit is based on the type of equipment
and the customer. Regular, established customers with good credit are not required to leave
a deposit, whereas new customers are.
When the customer checks out, Acme must determine the price of the items as well as any
required deposit. Its application must be flexible enough to accept new types of items
without having to change or recompile existing code each time its business is expanded. It
accomplishes this goal by using Java’s polymorphic abilities.
Acme designed the ShoppingBasket class to simply accept and process
InventoryItems, whatever type they may be. It then allows Java determine the type of
the item and call the correct methods based on that type.
By using this technique, Acme can add as many new item types as you need without having
to change or recompile existing code.

Oracle10g: Java Programming 10-22


Using Polymorphism for Acme Video

InventoryItem
calcDeposit(){…}

Vcr Movie
calcDeposit(){…} calcDeposit(){…}

ShoppingBasket
void addItem(InventoryItem item) {
// this method is called each time
// the clerk scans in a new item
float deposit = item.calcDeposit();

}

10-23 Copyright © 2004, Oracle. All rights reserved.

Using Polymorphism for Acme Video


When Acme designed its video rental application, it did not know all the types of
InventoryItem that would be rented in the long term. In non-OO programming, this
would create a problem that would be solved by modifying code each time a new type was
added.
In Java, you can use polymorphism to solve the problem. Here’s how you can do it:
The calcDeposit() method in the InventoryItem class is overridden in the Vcr
and Movie classes to provide object-specific calculation logic. The ShoppingBasket
class includes an addItem(InventoryItem item) method that calls the
calcDeposit() method by using an InventoryItem object.

Oracle10g: Java Programming 10-23


Using Polymorphism for Acme Video (continued)
At run time, Java interrogates the argument to determine its actual object type and
determines whether the type has an overriding method. If it does, then Java uses the subclass
method in place of the superclass method.
For example, if movie is a variable of type Movie and Vcr is a variable of type Vcr:
addItem(movie); // calls the Movie version of calcDeposit()
addItem(vcr); // calls the Vcr version of calcDeposit()
The addItem method accepts any kind of InventoryItem object, including the plug-
compatible subclass objects.
The significance is that the ShoppingBasket or InventoryItem classes do not need
to change as new InventoryItem types are added to the business. The OO-designed
code will continue to work.

Oracle10g: Java Programming 10-24


Using the instanceof Operator

• You can determine the true type of an object by


using an instanceof operator.
• An object reference can be downcast to the
correct type, if necessary.

public void aMethod(InventoryItem i) {



if (i instanceof Vcr)
((Vcr)i).playTestTape();
}

10-25 Copyright © 2004, Oracle. All rights reserved.

The instanceof Operator


You can use the instanceof operator to determine the type of an object at run time. It is
useful in situations where you need to call some subclass-specific operation on an object, but
you must first verify that the object is the correct type.
The syntax of the instanceof operator is as follows:
objectRef instanceof className
The instanceof operator returns a Boolean value. If the object that is referred to by
objectRef is an instance of the specified className, or one of its subclasses, then the
instanceof operator returns true. Otherwise, it returns false.
Example
The method in the slide takes an object reference whose compile-time type is declared as
InventoryItem. However, at run time, the object that is passed into the method may be
any kind of InventoryItem, such as Vcr, Movie, or Game.
Inside the method, you use instanceof to test whether you have a Vcr object. If so, then
you convert the compile-time type of the object reference into the Vcr type, and then call a
Vcr-specific method. This is often called downcasting.
Downcasting
The downcast is necessary in this example. Without it, the compiler allows you to call only
those methods that are defined in the InventoryItem class. Having said that, you must
use downcasting sparingly. There are usually alternative designs that obviate the need for
excessive downcasting.
Oracle10g: Java Programming 10-25
Limiting Methods and Classes with final

• You can mark a method as final to prevent it


from being overridden.
public final boolean checkPassword(String p) {

}

• You can mark a whole class as final to prevent it


from being extended.
public final class Color {

}

10-26 Copyright © 2004, Oracle. All rights reserved.

final Methods
Methods and classes are made final for two primary reasons: security and optimization.
If a method is performing some vital operation, such as identity validation or authorization
checking, then it must be declared final to prevent anyone from overriding the method
and circumventing your security checks. Many of the methods that are defined in
java.net classes are final. For example,
final Classes
If you declare a class as final, then it can never be extended by any other class. This is a
strong design statement that the class is sufficient to cater to all current and future
requirements. The implication is clear: You do not even need to think about inheriting from
this class. For example, the Color class in java.awt is declared final.
final Classes and final Methods Yield More Efficient Code
final classes enable the compiler to produce more efficient code. Because a final class
cannot be extended, if the compiler encounters an object reference of that type, and you call
a method by using that object reference, then the compiler does not need to perform run-
time method binding to cater to any subclasses that may have overridden the method.
Instead, the compiler can perform static binding; that is, the compiler can decide which
method to call and avoid the overhead of run-time polymorphic lookup.
This is true for individual final methods as well. If you call a final method anywhere in
your program, then the compiler can call that method statically, without worrying about
whether the method may be overridden by some subclass.
Oracle10g: Java Programming 10-26
Ensuring Genuine Inheritance

• Inheritance must be used only for genuine “is a


kind of” relationships:
– It must always be possible to substitute a subclass
object for a superclass object.
– All methods in the superclass must make sense in
the subclass.
• Inheritance for short-term convenience leads to
problems in the future.

10-27 Copyright © 2004, Oracle. All rights reserved.

Inheritance Represents an “Is-a-Kind-of” Relationship


Use inheritance only to model a genuine “is a kind of” relationship. In other words, do not
use inheritance unless all of the inherited methods apply to the subclass. If you cannot
substitute a subclass object for a superclass object, then you do not have a genuine “is a kind
of” relationship. In this case, the classes may be related, but not hierarchically.
If you do use inheritance, then exploit the polymorphic nature of the instance methods in the
inheritance hierarchy. For example, if you find that you need to test for the type of an object
in an inheritance tree, then use polymorphism to avoid having to write separate code to
handle objects of each class. This maximizes the reusability of your code and makes your
code easier to maintain in the future.

Oracle10g: Java Programming 10-27


Summary

In this lesson, you should have learned the following:


• A subclass inherits all the variables and methods
of its superclass.
• You can specify additional variables and methods
and override methods.
• A subclass can call an overridden superclass
method by using super.
• Polymorphism ensures that the correct version of
a method is called at run time.

10-28 Copyright © 2004, Oracle. All rights reserved.

Oracle10g: Java Programming 10-28


Practice 10: Overview

This practice covers:


• Defining subclasses of Customer
• Providing subclass constructors
• Adding new methods in the subclasses
• Overriding existing superclass methods

10-29 Copyright © 2004, Oracle. All rights reserved.

Practice 10: Overview


Note: If you have successfully completed the previous practice, then continue using the
same directory and files. If the compilation from the previous practice was unsuccessful and
you want to move on to this practice, then change to the les09 directory, load the
OrderEntryWorkspaceLes09 workspace, and continue with this practice.
Viewing the model: To view the course application model up to this practice, load the
OrderEntryWorkspaceLes09 workspace. In the Applications – Navigator node,
expand the OrderEntryWorkspaceLes09 – OrderEntryProjectLes09 -
Application Sources – oe, and double-click the UML Class Diagram1 entry.
This diagram displays all the classes created to this point in the course.

Oracle10g: Java Programming 10-29


Practice 10: Reusing Code with Inheritance and Polymorphism
Scenario
In this practice, you add a few new classes as subclasses. The new classes that are added are
Company and Individual and they inherit from the Customer class. Here is a Class
diagram to show the relationship between Customer, Company, and Individual. Each
box represents a class. The name of the class appears at the top of each box. The middle
section specifies the attributes in the class, where underlined attributes represent class
variable. The lower section specifies the methods in the class.
Notice the arrow on the line connecting Company and Individual to Customer. This
is the UML notation for inheritance.

Customer

int nextCustomerId
int id
String name
String address
Person
String phoneclass

toString()
getNamen()
setName()
getAddress()
setAddress()

Company Individual
String contact String licNumber
int discount Person class
Person class toString()
toString()
setContact() setLicNumber()
getContact() getLicNumber()
setDiscount()
getDiscount()

Oracle10g: Java Programming 10-30


Practice 10: Reusing Code with Inheritance and Polymorphism (continued)
Goal
The goal of this practice is to understand how to create subclasses in Java, and use
polymorphism with inheritance through the Company and Individual subclasses of the
Customer class. Refine the subclasses and override some methods and add some new
attributes, making use of the Class Editor in JDeveloper.
Note: If you have successfully completed the previous practice, then continue using the
same directory and files. If the compilation from the previous practice was unsuccessful and
you want to move on to this practice, then change to the les09 directory, load the
OrderEntryWorkspaceLes09 workspace, and continue with this practice.
Your Assignment
Add two classes, Company and Individual, that inherit from Customer. The owners
of the business have decided to expand their business and sell their products to companies as
well as individuals. Because companies have slightly different attributes than individuals,
you have decided to create subclasses for Company and Individual. Each of the
subclasses will have a few of their own methods and will override the toString()
method of Customer. In JDeveloper, continue to use your workspace and project
(OrderEntryWorkspace and OrderEntryProject) from the previous practice
containing the files from the previous practices.
Define a New Company Class
1. Define a Company class that extends Customer and includes the attributes and
methods that were defined in the object model on the first page of this practice
(scenario section).
a. Right-click the OrderEntryProject.jpr project and select the New…
option from the pop-up menu. In the New Gallery window, select the General
category (if not selected by default) and Java Class from the Items list.
Then, click OK.
b. In the Create Java Class Wizard, enter Company in the Name field, then click
the Browse… button next to the Extends field. In the Class Browser window,
locate and expand the oe package, select the Customer class, and click the OK
button. The oe.Customer class must be shown in the Extends field. Leave the
Optional Attributes in their default state, and click the OK button. When the
source code for the generated class is displayed, save your work.
c. Select Company.java file in the Navigator and then select the Class tab at the
bottom of the code window. This displays the Class Editor. In the Class Editor,
select the Fields tab.
d. In the Fields tab, for each attribute, click the +Add button in the Declared Fields
area to add the following private attributes:
private String contact;
private int discount;
For each attribute in the Fields Setting dialog box, enter:
- A Field name (for example, Contact)
- A Field type (appropriate for the variable)
- A Scope set to private

Oracle10g: Java Programming 10-31


Practice 10: Reusing Code with Inheritance and Polymorphism (continued)
Note: In the Accessors section, note that Create get() method and
Create set() method check boxes are selected. Then, click the OK button
to create each field.
e. After adding the attributes, click the Methods tab to view the get and set
methods that JDeveloper has generated for each attribute. The methods are
named according to JavaBean coding standards. Modify the code created by
JDeveloper to match the code below, if required.
f. Save your changes.
2. Alter the Company constructor to have arguments.
a. Add the following arguments to the no-arg constructor:

public Company(String aName, String aAddress,


String aPhone, String aContact, int aDiscount) { …
}
b. Use the arguments to initialize the object state (including the superclass state).
Hint: Use the super(…) method syntax to pass values to an appropriate
superclass constructor to initialize the superclass attributes. For example:

super(aName, aAddress, aPhone);


contact = aContact; ...
3. Add a public String toString() method in the Company class to to return the
contact name and discount. Include in the return value the superclass details, and
format as follows:
(Scott Tiger, 20%)
return super.toString() + " ("+ contact + ", "+ discount
+ "%) ";
a. You can manually enter the toString() method signature to the class, or get
JDeveloper to generate the toString() method signature as described in step
(b). Skip step (b) if you manually enter the method.
b. Select the Tools> Override Methods... menu, to launch the Override Methods
Wizard. Ensure that oe.Company is visible in the Class field. Select the
toString(): String method from the Methods list and then click the OK
button. Scroll down to the end of the source code in the Company class to view
the results and modify the code for the method body to match with the displayed
code.
c. Save and compile the Company.java class.
Define a New Individual Class As a Subclass of Customer
4. Define an Individual class extending Customer, and include the attributes and
methods that are defined in the object model on the first page of this practice.
a. Create the Individual class similarly as mentioned for the Company class in point
1:a. Add the licNumber attribute as a String, with a private scope and
ensure that the get and set methods are created to retrieve the values.

Oracle10g: Java Programming 10-32


Practice 10: Reusing Code with Inheritance and Polymorphism (continued)
b. Alter the no-arg constructor to accept four arguments for the name, address,
phone, and the license number
c omplete the constructor body
initiali ation by assigning the
arguments to the appropriate
instance variables in the Individual
class and its superclass
d verride the toString() method that is
defined in the superclass and
append the license number enclosed
in brackets to the superclass
information
Note: You can write the code in bold without manually having to select the Tools
– Override menu option.
e ave and compile the Individual class
Modify the DataMan Class to Include Company and Individual Objects
ou add two new class variables to the
DataMan class one for a Company object and the
other for an Individual
5 pen DataMan in the Code Editor and add two
new class variables called customer5 and
customer6
a reate a Company variable called
customer5 and initiali e the variable
by using the Company constructor or
example

static Company customer5 =


new Company("Oracle","Redw…","80…","Larry…",20);
b reate an Individual variable called
customer6 and initiali e by using the
constructor from the Individual class
c ave and compile DataMan.java by right
clicking the file and selecting Make
from the shortcut menu
Test Your New Classes in the OrderEntry.java Application
odify the OrderEntry code that assigns a
customer object to each of the two order
objects in the main() method
6 pen OrderEntry.java in the Code Editor
a ocate the line assigning customer3
with the first order object
or example find

order.setCustomer(DataMan.customer3);
Oracle10g: Java Programming 10-33
int se Ctrl + F to display a search
d alog box
Practice 10: Reusing Code with Inheritance and Polymorphism (continued)
Optional Extra Credit
Refine the Util and Customer Classes and Test Results
t is not obvious to the casual user that
data that is printed for a customer
company or individual objects
represent different objects unless the
user is made aware of the meaning of the
subtle differences in the displayed
data herefore you are asked to modify
your code to explicitly indicate the
object type name in the text that is
printed before the rest of the object
details as follows
[Customer] <customer details>
[Company] <company details>
[Individual] <individual details>
f you manually add the bracketed text
string before the return values of the
toString() methods in the respective
classes then it produces a result that
concatenates [Company] to [Customer], and
[Individual] to [Customer] for the subclasses of
Customer herefore the solution is to use
inherited code called from the Customer
class that dynamically determines the
run time object type name
ou can determine the run time object
type name of any ava object by calling
its getClass() method which is inherited
from the java.lang.Object class he getClass()
method returns java.lang.Class object
reference through which you can call a
getName() method returning a String
containing the fully qualified run time
object name or example if you add this
line to the ustomer class
String myClassName = this.getClass().getName();
he variable myClassName will contain a fully
qualified class name that includes the
package name he value that is stored in
myClassName will be oe.Customer
o extract only the class name you must
strip off the package
Oracle10g: name and
Java Programming 10-34 the dot
that precedes the class name his can be
done by using a lastIndexOf() method in the
Practice 10: Reusing Code with Inheritance and Polymorphism (continued)
8 pen Customer.java in the ode ditor
a refix a call to the Util.getClassName()
method before the rest of the
return value data in the toString()
method as follows
return "[" + Util.getClassName(this) + "] " + id +…;
b ave and compile Customer.java
c un the OrderEntry.java application to
view the results
d n the above code what does this
represent nd why do you pass a
parameter value this to the
Util.getClassName() method
xplain why the compiler accepts
the syntax that is used

Oracle10g: Java Programming 10-35


Using Arrays and Collections

Copyright © 2004, Oracle. All rights reserved.

Schedule: Timing Topic


60 minutes Lecture
30 minutes Practice
90 minutes Total
Objectives

After completing this lesson, you should be able to do


the following:
• Describe how to create arrays of primitives and
objects
• Process command-line variables
• Work with vectors
• Explore other Java collections such as
Enumerators, Iterators, ArrayLists, and
Hashtables
• Process command-line and system properties

11-2 Copyright © 2004, Oracle. All rights reserved.

Lesson Aim
This lesson shows how to use Java collection objects, introducing the Java array of
primitive, array of Object references and other collection classes such as Vectors,
Hashtables, Properties, Enumerators and Iterators.

Oracle10g: Java Programming 11-2


What Is an Array?

An array is a collection of variables of the same type.


• Each element can hold a single item.
• Items can be primitives or object references.
• The length of the array is fixed when it is created.

[0] 1
[0] Action
[1] 2
[1] Comedy
[2] 4
[2] Drama
[3] 8

11-3 Copyright © 2004, Oracle. All rights reserved.

Arrays
Arrays are useful when you want a group of objects that you can manipulate as a whole.
For example, if you are writing a program to allow users to search for a movie, you would
probably store the list of categories in an array.
The slide shows an array of four integers and an array of three strings. The following slides
show how to create and initialize the arrays. As you will soon see, an array in Java is an
object.

Oracle10g: Java Programming 11-3


Creating an Array of Primitives

1. Declare the array: Null


arrayName
type[] arrayName;
… or …
type arrayName[]; 0
arrayName
0
type is a primitive, such as int and so on.
0
2. Create the array object:
// Create array object syntax 1
arrayName = new type[size]; arrayName
2
3. Initialize the array elements
4
(optional).

11-4 Copyright © 2004, Oracle. All rights reserved.

Creating an Array of Primitives


1. Declaration: Create the variable that references the array.
2. Creation: Create an array object of the required type and size, and store a reference
to the array in the array variable.
3. Initialization: Initialize the array elements to the values that you want. This is
optional for an array of primitives, because the elements are initialized to default
values when the array object is created. The following slides explain these three steps
in detail.

Oracle10g: Java Programming 11-4


Declaring an Array of Primitives

• Create a variable to reference the array object:

int[] powers; // Example

• When an array variable is declared:


– Its instance variable is initialized to null until the
array object has been created

powers null

– Its method variable is unknown until the object is


created

11-5 Copyright © 2004, Oracle. All rights reserved.

Declaring an Array
There are two ways to declare an array:
Syntax E xam ple
type[] arrayname; int[] powers;
type arrayname[]; int powers[];

Most Java programmers use the first style because it separates the variable type (in the
example, an array of int) from the variable name, making the code clearer to read.
When you declare an array variable, it refers to null initially, until you initialize the array
by using new.
Instructor Note
Although an array is an object, there is no array class. Instead, for every primitive type or
class, Java automatically provides an array class.

Oracle10g: Java Programming 11-5


Creating an Array Object for
an Array of Primitives
• Create an array of the required length and assign
it to the array variable:
int[] powers; // Declare array variable

powers = new int[4]; //Create array object

– The array object is created by using the new


operator.
• The contents of an array of primitives are
initialized automatically. powers 0
0
0
0

11-6 Copyright © 2004, Oracle. All rights reserved.

Creating an Array Object


If you are using the new operator, you must specify the array size inside the brackets. The
size must be an integer, but does not have to be a constant number; it could be an
expression that is evaluated at run time.
After the array object has been created, its length is fixed for the lifetime of the array.
Default Initialization of Array Elements
All elements in a new array of primitives are initialized automatically with default values,
as follows:
• char elements are set to '\u0000'.
• byte, short, int, and long elements are set to 0.
• boolean elements are set to false.
• float and double elements are set to 0.0.
Note: '\u0000' is Unicode 0000. Java uses the Unicode character set.
Examples of Valid Array Creation
Example 1
final int SIZE = 4;
int[] powers = new int[SIZE]; // SIZE is a constant

Oracle10g: Java Programming 11-6


Examples of Valid Array Creation (continued)
Example 2
int[] examMarks;
int num = askUserHowManyStudents(); // set the value of num
examMarks = new int[num]; // array is a fixed size
Examples of Invalid Array Creation
Example 1
int powers[4]; // Invalid syntax: you can’t set the size of
// the array in the declaration statement.
Example 2
int num;
int[] examMarks = new int[num]; // Compilation error: num has
not been initialized
Instructor Note
Arrays can be created and initialized at the same time; the syntax for doing this is covered
in the following slide.

Oracle10g: Java Programming 11-7


Initializing Array Elements

• Assign values to individual elements:


arrayName[index] = value; 1 [0]
powers 0 [1]
powers[0] = 1;
0 [2]
• Create and initialize arrays at 0 [3]
the same time:
type[] arrayName = {valueList};
2 [0]
primes 3 [1]
int[] primes = {2, 3, 5, 7};
5 [2]
7 [3]

11-8 Copyright © 2004, Oracle. All rights reserved.

Initializing Array Elements


First Method: Assign a Value to Each Array Element
To refer to an element in an array, use an index in brackets ([]) as shown in the slide.
Array elements are numbered from 0 to n-1, where n is the number of elements in the
array. In other words, the index of the first element in an array is 0, not 1.
Second Method: Use Array Initializers
As shown in the slide, there is a shorthand technique for creating and initializing an array
of primitives. Here, there is no need to use the new operator, and the length of the array is
set automatically. Note the use of the braces, and remember the semicolon at the end.
Array initializers are very useful for creating lookup tables, as in the following example:
int[] daysInMonth = {31, 28, 31, 30, 31, 30,
31, 31, 30, 31, 30, 31};
This method is useful only if the value of each element is known when the array is created.

Oracle10g: Java Programming 11-8


Creating an Array of Object References

arrVar
1. Declare the array: null

ClassName[] arrVar;
arrVar
… or … null
ClassName arrVar[];
null
null
2. Create the array object: arrVar
Action

// Create array object syntax Comedy


arrVar = new ClassName[size]; Drama

3. Initialize the objects in the array.

11-9 Copyright © 2004, Oracle. All rights reserved.

Creating an Array of Objects


The steps for creating an array of object references are the same as for arrays of primitives,
with one exception: You must initialize the elements in the array, because this is not done
automatically.
1. Declaration: The syntax is the same as for arrays of primitive objects. For example,
String[] categories;
declares a variable that can point to an array of String. If the variable is the
instance variable, the variable is set to null initially.
2. Creation: The syntax is the same as for arrays of primitive objects. For example,
categories = new String[3];
creates an array object of the correct type (String) and a size of 3. Initially, all of
the elements are set to null.
You can declare and create an array in the same statement. For example, String[]
categories = new String[3];
3. Initialization: Initialize the array elements to the values that you want. This is
described in the next slide.
Instructor Note
It is important to emphasize that step 2 creates an array of three nulls and that this is not
the same as an array of three empty strings.

Oracle10g: Java Programming 11-9


Initializing the Objects in the Array

• Assign a value to each array element:


// Create an array of four empty Strings
String[] arr = new String[4];
for (int i = 0; i < arr.length; i++) {
arr[i] = new String();
}

• Create and initialize the array at the same time:


String[] categories =
{"Action", "Comedy", "Drama"};

11-10 Copyright © 2004, Oracle. All rights reserved.

Initializing the Objects in an Array


As with arrays of primitives, there are two ways of initializing an array of object
references. You can initialize the array by assigning a value to each array element or by
initializing the array when you create it.
The length Property
Every array has a length attribute that contains the number of elements in the array. By
using length, you can avoid the need to hardcode or store the size of an array in your
code. Because the index of the first element in an array is 0, the index of its last element is
length – 1.
The example in the slide uses length to loop through all the elements of an array to
create an array of empty strings.
Incidentally, the System class provides a useful method for copying all or part of an array
to another array. For more information, refer to System.arraycopy() in the Java
Development Kit (JDK) documentation.
Instructor Note
It is a good practice to initialize an array of object references immediately after it is
created. That way you can be sure that the rest of your code can safely reference the
contents of the array. If you do not know the value of the array elements at creation time,
you must initialize each element to an empty object, like the example in the slide does.

Oracle10g: Java Programming 11-10


Using an Array of Object References

• Any element can be assigned to an object of the


correct type:

String category = categories[0];

• Each element can be treated as an individual


object:

System.out.println
("Length is " + categories[2].length());

• An array element can be passed to any method;


array elements are passed by reference.

11-11 Copyright © 2004, Oracle. All rights reserved.

Passing Arrays to Methods


Because arrays behave like objects when an array is passed into a method, it is passed by
reference like any other object. Therefore, if the method changes the contents of the array,
these changes operate on the original array, not a copy.
Instructor Note
The second example calls the method String.length() to determine the length of one
of the strings in the array. Assuming that the array has been initialized to {"Action",
"Comedy", "Drama"} as in the previous slide, this code fragment prints the following
line:
Length is 5
(That is the length of the string "Drama".)

Oracle10g: Java Programming 11-11


Arrays and Exceptions

• ArrayIndexOutOfBoundsException occurs
when an array index is invalid:
String[] list = new String[4];
//The following throws ArrayIndexOutOfBoundsException
System.out.println(list[4]);

• NullPointerException occurs when you try to


access an element that has not been initialized:
Movie[] movieList = new Movie[3];
// The following will throw NullPointerException
String director = movieList[0].getDirector();

11-12 Copyright © 2004, Oracle. All rights reserved.

Arrays and Exceptions


The slide shows the exceptions, or errors, that occur when you try to perform an invalid
operation on an array. Exceptions are covered in more detail in the lesson titled “Throwing
and Catching Exceptions”; these are included in this slide because you are likely to see
these errors if your code attempts to perform one of the operations that is described in the
slide.
If you try to access an invalid array index, then your program will crash with the error
"ArrayIndexOutOfBoundsException".
If you try to access an array element that has not been initialized, your program will crash
with the error "NullPointerException".
Instructor Note
In the first example, the code is trying to access an element beyond the bounds of the array.
The array length was fixed to 4 when the array was created.
In the second example, the code is trying to access a method of one of the elements of the
array, but the array has not been initialized; at this point, it is an array of three nulls.

Oracle10g: Java Programming 11-12


Multidimensional Arrays

Java supports arrays of arrays:

type[][] arrayname = new type[n1][n2];

int[][] mdarr = new int[4][2]; [0][0] [0][1]


mdarr[0][0] = 1;
mdarr[0][1] = 7; mdarr
1 7
[0]
[1] 0 0

[2] 0 0

[3] 0 0

11-13 Copyright © 2004, Oracle. All rights reserved.

Multidimensional Arrays
Java supports multidimensional arrays; that is arrays of arrays:
int[][] tax = new int[5][4];
This declares and creates a two-dimensional matrix; the matrix contains five rows, each of
which contains four columns. Individual elements can be accessed as follows:
tax[rowIndex][colIndex] = value;
Advanced Topic: Nonsquare Multidimensional Arrays
The following example creates a multidimensional array with 10 rows, but the number of
columns in each row is different: the first row has one element, the second row has two
elements, and so on.
int[][] a = new int[10][];
for (int i = 0; i < a.length; i++) {
a[i] = new int[i + 1];
}

Oracle10g: Java Programming 11-13


main() Revisited

• main() has a single parameter, args.


• args is an array of Strings that holds command-
line parameters:
C:\> java SayHello Hello World

public class SayHello {


public static void main(String[] args) {
if (args.length != 2)
System.out.println("Specify 2 arguments");
else
System.out.println(args[0]+" "+args[1]);
} …

11-14 Copyright © 2004, Oracle. All rights reserved.

Passing Command-Line Parameters to main()


A reference to an array can be passed to any method. A good example is the main()
method that is used in Java applications. When you start a Java application, as opposed to a
Java applet, the system locates and calls the main() method for that class.
The main() method has a single parameter, which is a reference to an array of String
objects. Each String object holds a command-line parameter; the first element in the
array contains the first command-line parameter, not the name of the program as in C and
C++.
Command-Line Parameters Are Always Converted to Strings
It is important to note that command-line parameters are always represented by String
objects. Inside the main() method, you may need to convert a parameter to a primitive
type. For example, if one of the command-line parameters represents a number, you may
need to convert it into an int to perform some arithmetic with it.
Specifying Command-Line Parameters in JDeveloper
JDeveloper has a dialog box that you can use to specify command-line parameters for a
Java application. When you run the application from the JDeveloper environment,
JDeveloper passes the parameters into the main() method, as usual.
To specify command-line parameters in JDeveloper, select the Project > Project Properties
item from the menu bar, and click the Run/Debug tab. This tab has a field where you can
define command-line parameters.

Oracle10g: Java Programming 11-14


Working with Variable-Length Structures

The Vector class implements a “resizable” array of


any type of object:
• Creating an empty vector:

Vector members = new Vector();

• Creating a vector with an initial size:

// Create a vector with 10 elements. The vector //


can be expanded later.
Vector members = new Vector(10);

11-15 Copyright © 2004, Oracle. All rights reserved.

Vectors
The Vector class, belonging to the java.util package, provides a resizeable
collection of objects. Remember that Java arrays are fixed in size, so a vector is useful
when you do not know how large an array will be at the time when you create the array.
For example, you may get a list of names from a server and want to store the names in a
local array. Before you fetch the data from the server, you have no idea how large the list
is.
You cannot create a vector of int, float, or any other primitive. Instead, you must use
the wrapper classes, which were discussed in the lesson titled “Using Strings,
StringBuffer, Wrapper and Text-Formatting Classes,” and create a vector of
Integer, Float, and so on.
The Vector class provides methods to modify and access the vector. The following slides
show some of these methods; the JDK 1.4 online documentation provides complete
information.
Instructor Note
To use vectors, you must import the Vector class:
import java.util.Vector;

Oracle10g: Java Programming 11-15


Modifying a Vector

• Add an element to the end of the vector:


String name = MyMovie.getNextName();
members.addElement(name);

• Add an element at a specific position:


// Insert a string at the beginning
members.insertElementAt(name, 0);

• Remove the element at a specific index:


// Remove the first element
members.removeElementAt(0);

11-16 Copyright © 2004, Oracle. All rights reserved.

Modifying a Vector
When you add an element to a vector, the vector is automatically expanded by one element.
When you remove an element from a vector, the size of the vector decreases automatically.
When you insert an element at a specific position, all elements after that position increase
their indexes by 1.

Oracle10g: Java Programming 11-16


Accessing a Vector

• Get the first element:


String s = (String)members.firstElement();

• Get an element at a specific position:


String s = (String)members.elementAt(2);

• Find an object in a vector:


int position = members.indexOf(name);

• Get the size of a vector:


int size = members.size();

11-17 Copyright © 2004, Oracle. All rights reserved.

Vector Indexing
The index of the first element of a vector is 0.
Note that a vector always contains objects. It can contain objects of different types. When
you get an element from a vector, you must cast it to the type of object that you added to
the vector.
Example of a Vector Containing Different Objects
The Vector.addElement() method accepts an Object as its parameter type. By
applying the principle of object reference substitution (subclass object plug-compatibility
with its superclass), the parameter can be any subclass of the java.lang. The
Object class, which includes just about every object that you can create. Here is a simple
example, assuming that you have a class called Member:
Vector v = new Vector();
v.addElement(new Member());
v.addElement("pat");
v.addElement(new Integer(10));
You must be sure of the type of object that you are getting returned from methods such as
Vector elementAt() or firstElement(). You can use the instanceof
operator to determine the object type that is returned by these methods.

Oracle10g: Java Programming 11-17


Java Collections Framework

Java Collections Framework is an API architecture for


managing a group of objects that can be manipulated
independently of their internal implementation. It is:
• Found in the java.util package
• Defined by six core interfaces and some
implementation classes:
– Collection interface: Generic group of elements
– Set interface: Group of unique elements
– List interface: Ordered group of elements
– Map interface: Group of unique keys and their
values
– SortedSet and SortedMap for a sorted Set and
Map

11-18 Copyright © 2004, Oracle. All rights reserved.

Java Collections Framework


Java Collections Framework is an API architecture for managing a collection of objects
that can be manipulated independently of their internal implementation. The framework is
a unified architecture for representing and manipulating collections. All collections
frameworks contain three things: Interfaces, Implementations, and Algorithms
The framework is built around six core interfaces and many implementation classes that are
found in the java.util package. The Collection interface is inherited by the Set
and List interfaces. The SortedSet is a subclass of Set, and SortedMap is a
subclass of Map.

Oracle10g: Java Programming 11-18


Java Collections Framework (continued)
The Collection interface is an abstraction representing a group of objects called
elements.
The Set interface models mathematical set abstraction. It is a collection that cannot
contain duplicate elements. The implementation classes are HashSet and TreeSet.
The List interface represents an ordered collection (or sequence) of elements, including
duplicates. Lists provide control over where each element is inserted. Elements can be
accessed by their integer index (position). Implementing classes are ArrayList and
LinkedList. Lists are similar to vectors.
The Map interface represents an object that maps one or more keys to their values. Maps do
not contain duplicate keys, and each key maps to a single value. Implementing classes are
HashMap and TreeMap. These are similar to a Hashtable.
Sorted collections are provided through the SortedSet and SortedMap interfaces,
which are sorted versions of Set and Map, respectively.

Oracle10g: Java Programming 11-19


Collections Framework Components

Collections Framework is a set of interfaces and


classes used to store and manipulate groups of data
as a single unit.
• Core Interfaces are the interfaces used to
manipulate collections, and to pass them from one
method to another.
• Implementations are the actual data objects used
to store collections, which implement the core
collection interface.
• Algorithms are pieces of reusable functionality
provided by the JDK.

11-20 Copyright © 2004, Oracle. All rights reserved.

Java Collections Framework Components


The design of programs often requires handling of groups of objects. This collection
framework offers a set of standard utility classes to manage the collection of these objects.
The framework is made up of three main components (listed on the previous page):
• Core Interfaces: These allow collections to be manipulated, independent of their
implementation. These interfaces describe a common set of functionality, displayed
by collections, and enhance data exchange between collections. In object-oriented
languages, these interfaces, generally, are contained within a hierarchy.
• Implementations: A small set of implementations exists as concrete implementations
of the core interfaces, which provide a data structure that a program can use. In a
sense, these are reusable data structures. The implementations come in three flavors:
general-purpose, wrapper, and convienience.
• Algorithms: Methods that perform useful computations, such as searching and
sorting, on objects that implement collection interfaces. These algorithms are said to
be polymorphic because the same method can be used on many different
implementations of the appropriate collections interface. In essence, algorithms are
reusable functionality.

Oracle10g: Java Programming 11-20


Using ArrayList and Hashtable

The ArrayList class:


• Is a resizable implementation of the List interface

Allows manipulation of the array size

Has capacity that grows as elements are added to
the list
The Hashtable class:
• Is a legacy class similar to Map implementations
• Is used to store arbitrary objects that are indexed
by another arbitrary object
• Is commonly used with String as the key to store
objects as values

11-21 Copyright © 2004, Oracle. All rights reserved.

ArrayList
The ArrayList is a resizable-array implementation of the List interface. It implements
all optional list operations, and permits all elements, including null. In addition to
implementing the List interface, this class provides methods to manipulate the size of the
array that is used internally to store the list.
Hashtable
The java.util.Hashtable class provides a table of keys, where each key is hashed
to an associated value object. The key and value can be any Java object. Here is an
example of using the Hashtable to store String objects on information about a book.
import java.util.Hashtable;
public class HashtableDemo {
public static void main (String args[]) {
Hashtable ht = new Hashtable();
ht.put ("title", "Beyond Freedom and Diginity");
ht.put ("author", "B.F. Skinner");
ht.put ("year", "1971");
System.out.println(ht);
System.out.println("Year: " + ht.get("year"));
}
}

Oracle10g: Java Programming 11-21


Using Iterators

The Iterator interface, which is part of Java


Collection Framework, can be used to process a series
of Objects. The java.util.Iterator interface:
• Implements an object-oriented approach for
accessing elements in a collection
• Replaces the java.util.Enumeration approach
• Contains the following methods:
– hasNext() returns true if more elements exist.
– next() returns the next Object, if any.
– remove() removes the last element returned.

11-22 Copyright © 2004, Oracle. All rights reserved.

Another Type of Collection


Collections differ from arrays in that the members of a collection are not directly accessible
using indices, as you would with arrays. When using an Enumeration or an Iterator
you can only move the current item pointer to the first or next element of a collection. The
Enumeration was part of the standard Java API, and the Iterator was added with
Java Collection Framework API. An Iterator supports removal of an object from the
collection, whereas an Enumeration can only traverse the collection.
The following example creates a Vector containing several String elements, and then
calls the iterator() method to return an Iterator object. The loop uses the
next() method of the Iterator is to get elements and display their string value in
uppercase.
When hasNext() is false the loop terminates.
import java.util.Vector;
import java.util.Iterator;
:
Vector v = new Vector();
v.addElement("Jazz");
v.addElement("Classical");
v.addElement("Rock 'n Roll");
for (Iterator e = v.iterator(); e.hasNext(); ) {
String s = (String) e.next();
System.out.println(s.toUpperCase());
}
Oracle10g: Java Programming 11-22
Summary

In this lesson, you should have learned how to:


• Create Java arrays of primitives
• Create arrays of object references
• Initialize arrays of primitives or object references
• Process command-line arguments in the main()
method
• Use the Vector object to implement resizable
arrays
• Use ArrayList and Hashtable classes

11-23 Copyright © 2004, Oracle. All rights reserved.

Oracle10g: Java Programming 11-23


Practice 11: Overview

This practice covers:


• Modifying the DataMan class
– Create an array to hold the Customer, Company, and
Individual objects.
– Add a method to ensure that the array is
successfully created and initialized.
– Add a method to find a customer by an ID value.

11-24 Copyright © 2004, Oracle. All rights reserved.

Practice 11: Overview


Note: If you have successfully completed the previous practice, then continue using the
same directory and files. If the compilation from the previous practice was unsuccessful
and you want to move on to this practice, then change to the les10 directory, load the
OrderEntryWorkspaceLes10 workspace, and continue with this practice.
Viewing the model: To view the course application model up to this practice, load the
OrderEntryWorkspaceLes10 workspace. In the Applications – Navigator node,
expand the OrderEntryWorkspaceLes10 – OrderEntryProjectLes10 -
Application Sources – oe, and double- click on UML Class Diagram1
entry. This diagram displays all the classes created to this point in the course.

Oracle10g: Java Programming 11-24


Practice 11: Using Arrays and Collections
Goal
The goal of this practice is to gain experience with Java array objects, and work with
collection classes such as the java.util.Vector class. You also work with command-
line arguments.
Note: If you have successfully completed the previous practice, then continue using the
same directory and files. If the compilation from the previous practice was unsuccessful
and you want to move on to this practice, then change to the les10 directory, load the
OrderEntryWorkspaceLes10 workspace, and continue with this practice.
Your Assignment
Continue to use JDeveloper to build on the application classes from the previous practices.
You will enhance the DataMan class to construct an array of Customer objects, and
then provide a method to find and return a Customer object for a given ID.
The Order class is modified to contain a vector of order items, requiring a method to add
items into the vector, and (optionally) another method to remove the items.
Modify DataMan to Keep the Customer Objects in an Array
1. Modify the DataMan class to build an array of customers.
a. Define a private static array of Customer objects named customers.
b. Initialize the array to a null reference.
2. Create a public static void method called buildCustomers() to populate the
array of customers. The array must hold six objects by using the four Customer
objects, the Company object and the Individual object that you have already
created.
a. In the body of the method, first test whether the customers variable is not
null, and if so, then return from the method without doing anything because a
non-null reference indicates that the customers array has been initialized. If
customers is null, then you must create the array object to hold the six
customer objects that are already created.
b. Now move (cut and paste) the definitions of the four existing Customer
objects, the Company, and the Individual into the body of this method,
after creating the array object. Then, delete the static keyword and class
name or type before each customer<n> variable name. Modify each variable
to be the name of the array variable followed by brackets enclosing an array
element number. Remember, array elements start with a zero base.
For example replace:
static Customer customer1 = new Customer(…);
with:
customers[0] = new Customer(…);
The example here assigns the customer object to the first element in the array.
Repeat this for each customer<n> object references in the code.
c. Create a static block that invokes the buildCustomers() method to create
and initialize the array of customer objects, when the DataMan class is loaded.
Place the block at the end of the DataMan class. (Static blocks in the class
definition are sometimes called class constructors.)

static
{
buildCustomers();
}

Oracle10g: Java Programming 11-25


Practice 11: Using Arrays and Collections (continued)
d. Save and compile the DataMan class. What other classes are compiled?
Explain the results. (Only fix errors that are related to the DataMan class, if
any. Any errors pertaining to OrderEntry class will be fixed after doing the
next set of questions).
Hint: Look in the Messages and Compiler tabs of the Log Window.
Modify DataMan to Find a Customer by ID
3. Create a public static method called findCustomerById(int custId),
where the argument represents the ID of the Customer object to be found. If found,
then return the object reference for the matching Customer, otherwise return a
null reference value.
a. Why is the customer array guaranteed to be initialized when the
findCustomerById() method is called? Thus, you can write code
assuming that the array is populated.
b. Write a loop to scan through the customers array, obtaining each customer
object reference to compare the custId parameter value with the return value
from the getId() method of each customer. If there is a match, then return
the customer object reference; otherwise, return a null.
c. Save and compile your DataMan class, only fixing the syntax errors that are
reported for the DataMan class.
4. You now fix the syntax errors in the OrderEntry class as a result of the
changes made to DataMan. The modifications that you make to
OrderEntry.java fix the syntax errors, and test the code that is added to the
DataMan class.
a. In the Code Editor, locate and modify each line that directly refers to the
DataMan.customer<n> variables that previously existed.
Hint: You can quickly navigate to the error lines by double-clicking the error
message line in the Compiler tab of the Log Window.
Replace each occurrence of the DataMan.customer<n> text with a method
call to: DataMan.findCustomerById(n). For example, replace:
System.out.println(DataMan.customer1.toString());
with
System.out.println(
DataMan.findCustomerById(1).toString());
b. Save, compile, and run the OrderEntry.java file to test your changes.
Optional Extra Credit
Modify the Order Class to Hold a Vector of OrderItem Objects
Currently, the Order class has hardcoded creation of two OrderItem objects as instance
variables, and the details of each OrderItem object is set in the getOrderTotal()
method. This is impractical for the intended behavior of the Order class. You must now
replace the two OrderItem variables with a Vector that will contain the OrderItem
objects. Therefore, you must create methods to add and remove OrderItem objects to
and from the vector.

Oracle10g: Java Programming 11-26


Practice 11: Using Arrays and Collections (continued)
Modify the Order Class to Hold a Vector of OrderItem Objects (continued)
5. In the Order class, define a Vector of order items, and replace the
OrderItem instance variables, removing code dependent on the original
OrderItem instance variables.
a. Add a statement at the beginning of your class, after the package statement, to
import the java.util.Vector class.
b. Declare a new instance variable called items as a Vector object reference.
Also remove, or comment out, the declarations of the two instance variables
called item1 and item2, and the code that is using these variables.
Hint: The following methods directly use the item1 and item2 variables:
getOrderTotal(), showOrder().
c. In the Order no-arg constructor, add a line to create the item vector, as
follows:
items = new Vector(10);
d ompile and save your changes to
the Order class
Modify OrderItem to Handle Product Information
6. Before you create the method to add an OrderItem object to the items vector,
you must first modify the OrderItem class to hold information about the product
being ordered. Each OrderItem object represents an order line item. Each
order line item contains information about a product that is ordered, its price, and
quantity that is ordered.
a. Edit the OrderItem class and add a new instance variable called product.
Declare the variable as a private int, and generate or write the
getProduct() method and setProduct() methods. Modify the
toString()method to add the product value between the lineNbr and
quantity.
b. Create an OrderItem constructor to initialize the object by using values that
are supplied from the following two arguments: int productId and
double itemPrice.
Initialize the item quantity variable to 1.
Note: The OrderItem class will not provide a no-arg constructor.
c. Save and compile the OrderItem class.
Modify Order to Add Products into the OrderItem Vector
7. In the Order class, create a new public void method called
addOrderItem()that accepts one argument: an integer called product,
representing an ID of the product being ordered. This method must perform the
following tasks:
a. Search the items vector for an OrderItem containing the supplied product.
To do this, create a loop to get each OrderItem element from the items
vector.

Oracle10g: Java Programming 11-27


Practice 11: Using Arrays and Collections (continued)
Hint: Use the size() method of the Vector object to determine the number of
elements in the vector. Use the getProduct() method of the OrderItem
class to compare the product value with the existing product value in the order
item.
If the product, with the specified ID, is found in an OrderItem elements from
the vector, then increment the quantity by using the setQuantity() method.
If the specified product does not exist in any OrderItem object in the vector,
then create a new OrderItem object by using the constructor that will accept
the product, and a price. Then add the new OrderItem object into the vector.
Note: Because line item numbers are set relative to their order, set the line
number for the OrderItem, by using the setLineNbr() method, after an
item is added to the vector. The line number is set using the size() of the
vector, because the elements are added to the end of the vector. For now,
assume that all products have a price of $5.00.
b. The orderTotal value will now be calculated as each product is added to the
order. Thus, you must also add the price of each product to orderTotal.
Hint: Use the getUnitPrice() method from the OrderItem class.
Because the orderTotal is now updated as each product is added to the
order, the getOrderTotal() method can simply return the orderTotal
value.
Note: This may already be done due to previous changes to the method.
c. Modify the showOrder() method to use an Enumeration technique to loop
through the items vector to display each OrderItem object by calling the
toString() method.
Hint: Import java.util.Enumeration, and use the Vector
elements() method to create an Enumeration. See your course notes for an
example, or ask your instructor for guidance.
d. Save and compile the Order class, and remove any syntax errors.
e. Test your changes to the OrderItem and Order classes by modifying the
OrderEntry class to add products 101, 102 to the first order object.
For example, before the call to showOrder(), enter the bold lines shown:
order.setCustomer(DataMan.findCustomerById(5));
order.addOrderItem(101);
order.addOrderItem(102);
order.addOrderItem(101);
order.showOrder();
f. Compile (eliminating syntax errors first), save and run OrderEntry.java.
Confirm that your results are accurate. For example, check whether the order
total is reported as $15.

Oracle10g: Java Programming 11-28


Structuring Code by Using
Abstract Classes and Interfaces

Copyright © 2004, Oracle. All rights reserved.

Schedule: Timing Topic


40 minutes Lecture
30 minutes Practice
70 minutes Total
Objectives

After completing this lesson, you should be able to do


the following:
• Define abstract classes
• Define abstract methods
• Define interfaces
• Implement interfaces

12-2 Copyright © 2004, Oracle. All rights reserved.

Lesson Aim
This lesson shows how abstract classes and abstract methods can be defined and used in Java.
The lesson also introduces interfaces, and shows how they can be used to specify a set of
methods that interested classes can implement if they want to. You learn how to use interfaces as
an effective alternative to multiple inheritance.

Oracle10g: Java Programming 12-2


Defining Abstract Classes

• An abstract class cannot be instantiated.


• Abstract methods must be implemented by
subclasses.
• Interfaces support multiple inheritance.

Abstract InventoryItem
superclass

Concrete Movie VCR


subclasses

12-3 Copyright © 2004, Oracle. All rights reserved.

Abstract Classes
In Java, you can define classes that are high-level abstractions of real-world objects. Using these
high-level classes gives the designer a vote in what subclasses look like and even which methods
are mandatory in the subclass.
An abstract class is simply a class that cannot be instantiated; only its nonabstract subclasses
may be instantiated. For example, an InventoryItem does not contain sufficient detail to
provide anything meaningful to the business. It must either be a movie or a VCR. An
InventoryItem does, however, serve as a collection of data and behaviors that are common
to all items that are available for rent.
Abstract Methods
Abstract methods go a step beyond standard inheritance. An abstract method is defined only
within an abstract class, and must be implemented by a subclass. The class designer can use this
technique to decide exactly what behaviors a subclass must be able to perform. The designer of
the abstract class cannot determine how the behaviors will be implemented, only that they will
be implemented.
Interfaces
An interface is the specification of a set of methods, which is similar to an abstract class. In
addition to what an abstract class offers, an interface can effectively provide multiple
inheritance. A class can implement an unlimited number of interfaces but can only extend one
superclass.

Oracle10g: Java Programming 12-3


Creating Abstract Classes

Use the abstract keyword to declare a class as


abstract.

public abstract class InventoryItem {


private float price;
public boolean isRentable()…
}

public class Movie public class Vcr


extends InventoryItem { extends InventoryItem {
private String title; private int serialNbr;
public int getLength()… public void setTimer()…

12-4 Copyright © 2004, Oracle. All rights reserved.

Creating Abstract Classes


Java provides the abstract keyword, which indicates that a class is abstract. For example, the
InventoryItem class in the slide has been declared as abstract:
public abstract class InventoryItem {

}
InventoryItem is declared abstract because it does not possess enough intelligence or detail
to represent a complete and stand-alone object. The user must not be allowed to create
InventoryItem objects, because InventoryItem is only a partial class. The
InventoryItem class exists only so that it can be extended by more specialized subclasses,
such as Movie and Vcr.
What Happens If You Try to Instantiate an Abstract Class?
If you try to create an InventoryItem object anywhere in the program, then the compiler
flags an error:
InventoryItem i = new InventoryItem (…);// Compiler error
The user can only create objects of the concrete subclasses:
Movie m = new Movie(…); // This is fine
Vcr v = new Vcr(…); // This is fine too

Oracle10g: Java Programming 12-4


What Are Abstract Methods?

• An abstract method:
– Is an implementation placeholder
– Is part of an abstract class
– Must be overridden by a concrete subclass
• Each concrete subclass can implement the
method differently.

12-5 Copyright © 2004, Oracle. All rights reserved.

The Need for Abstract Methods


When you design an inheritance hierarchy, there will probably be some operations that all
classes perform, each in its own way. For example, in a video rental business, the vendor must
know whether each item is rentable or not. Each type of item, however, determines whether the
item is rentable in a specific way.
To represent this concept in Java, the common “is this item rentable” method is defined in the
InventoryItem class. However, there is no sensible implementation for this method in
InventoryItem, because each different kind of item has its own requirements. One approach
may be to leave the method empty in the InventoryItem class:
public abstract class InventoryItem{
public boolean isRentable(); {
return true;
}
}

Oracle10g: Java Programming 12-5


The Need for Abstract Methods (continued)
This approach is not good enough because it does not force each concrete subclass to override
the method. For example, in the Vcr class, if the user forgets to override the
isRentable()method, then what will happen if the user calls the method on a Vcr object?
The isRentable()method in InventoryItem will be called and always return true.
This is not the desired outcome. The solution is to declare the method as abstract, as shown on
the next page.

Oracle10g: Java Programming 12-6


Defining Abstract Methods

• Use the abstract keyword to declare a method as


abstract:
– Provide the method signature only.
– The class must also be abstract.
• Why is this useful?
– Declare the structure of a given class without
providing complete implementation of every
method.
public abstract class InventoryItem {
public abstract boolean isRentable();

12-7 Copyright © 2004, Oracle. All rights reserved.

Defining Abstract Methods


To declare a method as abstract in Java, prefix the method name with the abstract keyword
as follows:
public abstract class InventoryItem {
abstract boolean isRentable();

}
When you declare an abstract method, you provide only the signature for the method, which
comprises its name, its argument list, and its return type. You do not provide a body for the
method. Each concrete subclass must override the method and provide its own body.
Now that the method is declared as abstract, a subclass must provide an implementation of that
method.
Abstract classes can contain methods that are not declared as abstract. Those methods can be
overridden by the subclasses but it is not mandatory.

Oracle10g: Java Programming 12-7


Defining and Using Interfaces

• An interface is like a fully abstract class:


– All its methods are abstract.
– All variables are public static final.
• An interface lists a set of method signatures
without any code details.
• A class that implements the interface must
provide code details for all the methods of the
interface.
• A class can implement many interfaces but can
extend only one class.

12-8 Copyright © 2004, Oracle. All rights reserved.

What Is an Interface?
An interface is similar to an abstract class, except that it cannot have any concrete methods or
instance variables. It is a collection of abstract method declarations and constants; that is,
static final variables. It is like a contract that the subclass must obey.
Any class that implements an interface must implement some or all of the methods that are
specified in that interface. If it does not implement all of the methods, then the class is an
abstract class and a subclass of the abstract class must implement the remaining abstract
methods.
A class can implement many interfaces but can extend only one class. Java does not support
inheritance from multiple classes, but it does support implementing multiple interfaces. For
example:
class Movie extends InventoryItem implements Sortable, Listable {

}
As demonstrated earlier, Movie inherits all of the attributes and behaviors of
InventoryItem. In addition, it now must provide implementation details for all of the
methods that are specified in the Sortable and Listable interfaces. Those methods can be
used by other classes to implement specific behaviors such as a sort routine.

Oracle10g: Java Programming 12-8


Examples of Interfaces

• Interfaces describe an aspect of behavior that


different classes require.
• For example, classes that can be steered support
the “steerable” interface.
• Classes can be unrelated.

Nonsteerable Steerable

12-9 Copyright © 2004, Oracle. All rights reserved.

Examples of Interfaces
Interfaces describe an aspect of behavior that many different classes require. The name of an
interface is often an adjective such as Steerable, Traceable, Sortable, and so on. This
is in contrast to a class name, which is usually a noun such as Movie or Customer.
The Steerable interface may include such methods as turnRight(), turnLeft(),
returnCenter(), and so on. Any class that needs to be steerable may implement the
Steerable interface.
The classes that implement an interface may be completely unrelated. The only thing that they
may have in common is the need to be steered.
For example, the core Java packages include a number of standard interfaces such as
Runnable, Cloneable, and ActionListener. These interfaces are implemented by all
types of classes that have nothing in common except the need to be Cloneable, or to
implement an ActionListener.
Instructor Note
Interface is a way to bypass the multiple inheritance restriction that Java has.

Oracle10g: Java Programming 12-9


Creating Interfaces

• Use the interface keyword:


public interface Steerable {
int MAXTURN = 45;
void turnLeft(int deg);
void turnRight(int deg);
}

• All methods are public abstract.


• All variables are public static final.

12-10 Copyright © 2004, Oracle. All rights reserved.

Creating Interfaces
You can define an interface by using the interface keyword. All methods that are specified
in an interface are implicitly public and abstract. Any variables that are specified in an
interface are implicitly public, static, and final; that is, they are constants.
Therefore, the interface definition that is shown in the slide is equivalent to the following
definition, where the public, static, final, and abstract keywords have been
specified explicitly.
public interface Steerable {
public static final int MAXTURN = 45;
public abstract void turnLeft(int deg);
public abstract void turnRight(int deg);
}

Oracle10g: Java Programming 12-10


Creating Interfaces (continued)
Because interface methods are implicitly public and abstract, it is a generally accepted
practice not to specify those access modifiers. The same is true for variables. Because they are
implicitly public, static, and final(in other words, constants), you must not specify
those modifiers.
Instructor Note
Every field declaration in the body of an interface is implicitly public, static, and final.
It is permitted, but strongly discouraged as a matter of style, to redundantly specify one or all of
these modifiers for such fields.

Oracle10g: Java Programming 12-11


Implementing Interfaces

Use the implements keyword:

public class Yacht extends Boat


implements Steerable {
public void turnLeft(int deg) {…}
public void turnRight(int deg) {…}
}

12-12 Copyright © 2004, Oracle. All rights reserved.

Implementing Interfaces
The slide shows an example of a Yacht class, that implements the Steerable interface.
Yacht must implement some or all of the methods in any interface that it implements; in this
case, Yacht may implement turnLeft() and turnRight().
A class can implement more than one interface by specifying a list of interfaces separated by
commas. Consider the following example:
public class Yacht
extends Boat
implements Steerable, Taxable {

}
Here, the Yacht class implements two interfaces: Steerable and Taxable. This means that
the Yacht class must implement all the methods that are declared in both Steerable and
Taxable.

Oracle10g: Java Programming 12-12


Sort: A Real-World Example

• Is used by several unrelated classes


• Contains a known set of methods
• Is needed to sort any type of object
• Uses comparison rules that are known only to the
sortable object
• Supports good code reuse

12-13 Copyright © 2004, Oracle. All rights reserved.

Sort
A sort is a classic example of the use of an interface. Many completely unrelated classes must
use a sort. A sort is a well-known and well-defined process that does not need to be written
repeatedly.
A sort routine must provide the ability to sort any object in the way that fits that particular
object. The traditional programming approach dictates several subroutines and an ever-growing
decision tree to manage each new object type. By using good OO programming technique and
interfaces, you can eliminate all of the maintenance difficulties that are associated with the
traditional approach.
The Sortable interface specifies the methods that are required to make the sort work on each
type of object that needs to be sorted. Each class implements the interface based on its specific
sorting needs. Only the class needs to know its object comparison, or sorting rules.
Implementing the sort in the OO way provides a model that supports very good code reuse. The
sort code is completely isolated from the objects that implement the sort.
Instructor Note
Use the sort examples to demonstrate. Open the Demo.jws. There are two projects: Sort and
ExtendedSort. Start with the Sort project and launch the SortApplication.java for a
simple demonstration. Use the ExtendedSort project for a more complex demonstration. Launch
the ExtendedSortApplication.java file to demonstrate a double sort application.

Oracle10g: Java Programming 12-13


Overview of the Classes

• Created by the sort expert:

public interface public abstract


Sortable class Sort

• Created by the movie expert:

public class Movie public class


implements Sortable MyApplication

12-14 Copyright © 2004, Oracle. All rights reserved.

Overview of the Classes


The slide shows the three classes and one interface that are involved in sorting a list of videos.
The classes are divided into two categories:
• Classes that are created by the sort expert, who knows all about sort algorithms but nothing
about individual objects that people may want to sort
• Classes that are created by the movie expert, who knows all about movies, but nothing
about sort algorithms
You see how interfaces can separate these two types of developers, enabling the separation of
unrelated areas of functionality.
Classes and Interfaces Used by the Example
• The Sortable interface declares one method: compare(). This method must be
implemented by any class that wants to use the sort class methods.
• The Sort class is an abstract class that contains sortObjects(), which is a
method to sort an array of objects. Most sort algorithms work by comparing pairs of
objects. sortObjects() does this comparison by calling the compare() method on
the objects in the array.
• The Movie class implements the Sortable interface. It contains a compare() method
that compares two Movie objects.
• MyApplication represents any application that must sort a list of movies. It can be a
form displaying a sortable list of movies.

Oracle10g: Java Programming 12-14


How the Sort Works

MyApplication

sortObjects() MyApplication passes


returns the 4 1 an array of movies to
sorted list. Sort.sortObjects().

Sort
The movie sortObjects()
returns the 3 2 asks a movie to
result of the compare itself with
comparison. another movie.
Movie

12-15 Copyright © 2004, Oracle. All rights reserved.

How the Sort Works


The slide shows the process of sorting a list of objects. The steps are as follows:
1. The main application passes an array of movies to Sort.sortObjects().
2. sortObjects()sorts the array. Whenever sortObjects() needs to compare two
movies, it calls the compare() method of one movie, passing it with the other movie as a
parameter.
3. The movie returns the results of the comparison to sortObjects().
4. sortObjects() returns the sorted list.
Instructor Note
The java.lang.Comparable interface that is used with Collections.sort(List)
from the java.util package provides the developer with ready-made sort functionality. The
class implementing the Comparable interface only needs to implement an int
compareTo(Object o) method, that returns a –1, 0, or 1 for a less than, equal to, or greater
than result, respectively.

Oracle10g: Java Programming 12-15


The Sortable Interface

Specifies the compare() method:

public interface Sortable {


// compare(): Compare this object to another object
// Returns:
// 0 if this object is equal to obj2
// a value < 0 if this object < obj2
// a value > 0 if this object > obj2
int compare(Object obj2);
}

12-16 Copyright © 2004, Oracle. All rights reserved.

The Sortable Interface


The Sortable interface specifies all of the methods and constants that are required for a class
to be sortable. In the example, the only method is compare().
Any class that implements Sortable must provide a compare() method that accepts an
Object argument and returns an int.
The result of the compare() method is as follows:

Value Meaning

Positive integer This object is greater than the argument.


Negative integer This object is less than the argument.
Zero This object is equal to the argument.
Note: It is entirely up to the implementer of compare() to determine the meaning of “greater
than,” “less than,” and “equal to.”

Oracle10g: Java Programming 12-16


The Sort Class

Holds sortObjects():

public abstract class Sort {


public static void sortObjects(Sortable[] items) {
// Step through the array comparing and swapping;
// do this length-1 times
for (int i = 1; i < items.length; i++) {
for (int j = 0; j < items.length - 1; j++) {
if (items[j].compare(items[j+1]) > 0) {
Sortable tempitem = items[j+1];
items[j+1] = items[j];
items[j] = tempitem; } } } } }

12-17 Copyright © 2004, Oracle. All rights reserved.

The Sort Class


The Sort class contains the sortObjects() method that sorts an array of Sortable
objects. sortObjects() accepts an array of Sortable as its argument. It is legal syntax to
specify an interface type for a method’s argument; in this case, it ensures that the method will be
asked to sort only objects that implement the Sortable interface. In the example,
sortObjects() executes a simple sort that steps through the array several times, and
compares each item with the next one and swaps them if necessary.
When sortObjects() needs to compare two items in the array, it calls compare() on one
of the items, passing the other item as the argument.
Note that sortObjects() knows nothing about the type of object that it is sorting. It knows
only that they are Sortable objects, and therefore it knows that it can call a compare()
method on any of the objects, and it knows how to interpret the results.
Interface as a Contract
You can think of an interface as a contract between the object that uses the interface and the
object that implements the interface. In this case, the contract is as follows:
• The Movie class (the implementer) agrees to implement a method called compare(),
with parameters and return value specified by the interface.
• The Sort class (the user) agrees to sort a list of objects in the correct order.

Oracle10g: Java Programming 12-17


The Movie Class

Implements Sortable:

public class Movie extends InventoryItem


implements Sortable {
String title;
public int compare(Object movie2) {
String title1 = this.title;
String title2 = ((Movie)movie2).getTitle();
return(title1.compareTo(title2));
}
}

12-18 Copyright © 2004, Oracle. All rights reserved.

The Movie class


The Movie class implements the Sortable interface. To call Sort.sortObjects(), it
must implement the Sortable interface, and if it implements the Sortable interface, then it
must implement the compare() method; this is the contract. The compare() method takes
an Object as an argument and compares it with the object on which it was called.
In this case, you use the String compareTo() method to compare the two title strings.
compareTo() returns a positive integer, a negative integer, or zero depending on the relative
order of the two objects. When implementing compare(), you can compare the two objects in
any way you like, as long as you return an integer that indicates their relative sort order.
Note: In the example, movie2 is an Object. So, it must be cast to Movie before you can call
getTitle() to get its title.

Oracle10g: Java Programming 12-18


Using the Sort

Call Sort.sortObjects(Sortable []) with an array


of Movie as the argument:

class myApplication {
Movie[] movielist;
… // build the array of Movie
Sort.sortObjects(movielist);
}

12-19 Copyright © 2004, Oracle. All rights reserved.

Using the Sort


To use the sort, you call Sort.sortObjects(Sortable []) from your application,
passing the array of objects that you want sorted. Each object that you want to sort must
implement the Sortable interface and provide the required compare() method. Only the
class implementing Sortable knows exactly how its objects are sorted.
You can make other types of objects in your application sortable. For example, you can make the
Rental and Member classes implement the Sortable interface and add a compare()
method to each class. Then, you can sort an array of Rental or Member by calling
Sort.sortObjects(). The compare() method in each of the classes can be radically
different or fundamentally the same. The only requirement is that the compare() methods
return an integer to indicate the relative sort order of the objects.

Oracle10g: Java Programming 12-19


Using instanceof with Interfaces

• Use the instanceof operator to determine


whether an object implements an interface.
• Use downcasting to call methods that are defined
in the interface:

public void aMethod(Object obj) {



if (obj instanceof Sortable)
((Sortable)obj).compare(obj2);
}

12-20 Copyright © 2004, Oracle. All rights reserved.

Using instanceof with Interfaces


In the lesson about inheritance, you learned how to use the instanceof operator to test
whether the run-time type of an object matched a certain type.
You can also use instanceof with interfaces, as shown by the method in the slide. The
method takes an argument whose compile-time type is Object. At run time, the argument can
be any kind of object inherited from Object. The instanceof operator tests the object to
see whether it is an instanceof Sortable. In other words, does the object support the
Sortable interface?
This means that you do not care what kind of object you are dealing with. Your concern is
whether the object is capable of having the compare() method called on it.
If the object does implement the Sortable interface, then you cast the object reference into
Sortable so that the compiler lets you call the compare() method.

Oracle10g: Java Programming 12-20


Summary

In this lesson, you should have learned the following:


• An abstract class cannot be instantiated.
• An abstract method has a signature but no code.
• An interface is a collection of abstract methods to
be implemented elsewhere.
• A class can implement many interfaces.
• Implementing more than one interface is
comparable to multiple inheritance.

12-21 Copyright © 2004, Oracle. All rights reserved.

Oracle10g: Java Programming 12-21


Practice 12: Overview

This practice covers:


• Making an interface and abstract class
• Implementing the java.lang.Comparable
interface to sort objects
• Testing the abstract and interface classes

12-22 Copyright © 2004, Oracle. All rights reserved.

Practice 12: Overview


Note: To complete this practice, you must load a new workspace and use its contents. Before
starting this practice, open the \labs\les12start directory, load the
OrderEntryWorkspaceLes12Start workspace, to continue with this practice.
Viewing the model: To view the course application model up to this practice, load the
OrderEntryWorkspaceLes11 workspace. In the Applications – Navigator node, expand
the OrderEntryWorkspaceLes11 – OrderEntryProjectLes11 -
Application Sources – oe, and double-click the UML Class Diagram1 entry.
This diagram displays all the classes created to this point in the course.

Oracle10g: Java Programming 12-22


Practice 12: Structuring Code by Using Abstract Classes and Interfaces
Goal
The goal of this practice is to learn how to create and use an abstract class, and how to create and
use an interface.
Note: To complete this practice, you must load a new workspace and use its contents. Before
starting this practice, open the \labs\les12start directory, load the
OrderEntryWorkspaceLes12Start workspace, to continue with this practice. The
solution for this practice is found in the \labs\les12 directory, by loading the
OrderEntryWorkspaceLes12 workspace.
Your Assignment
The OrderItem class currently only tracks a product as an integer. This is insufficient for the
business, which must know the name, description, and retail price of each product. To meet this
requirement, you create an abstract class called Product, and define three concrete subclasses
called Software, Hardware, and Manual.
To support the business requirement of computing a sales tax on the hardware products, you
create an interface called Taxable that is implemented by the Hardware subclass.
To test your changes, you must modify DataMan to build a list of Product objects, and
provide a method to find a product by its ID.
• Modify OrderItem to hold an object reference for a Product, and not an integer for ID
of product, and also change Order to find a Product by its ID value.
• Compile and run OrderEntry class to test the changes.
Create an Abstract Class and Three Supporting Subclasses
1. Add a public abstract class called Product to the OrderEntryProject.
a. Declare the following attributes and their getXXX() and setXXX() methods.
Hint: Use the JDeveloper Class Editor to rapidly build this class.
Note: Remember to add the abstract keyword before the class keyword in the
Source code after the Product.java file is created.
private static int nextProductId = 2000;
private int id;
private String name;
private String description;
private double retailPrice;
b. Define a public no-arg constructor that assigns the nextProductId to the ID of a
new product object, before incrementing nextProductId.
c. Add a public String toString() method to return the ID, name, and
retailPrice. Prefix with the class name by using getClassName(this)
from the Util class lso format retailPrice
with Util.toMoney()
d. Compile and save the Product class.
e. Use JDeveloper and its Class Editor to create three concrete subclasses of the
Product class, each with attributes and initial values that are listed in the table on
the next page (generate or add the appropriate get and set methods):

Oracle10g: Java Programming 12-23


Practice 12: Structuring Code by Using Abstract Classes and Interfaces (continued)
1.e. (continued)
Subclass Attributes
Software String license = "30 Day Trial";
Hardware int warrantyPeriod = 6;
Manual String publisher = "Oradev Press";
f. Modify the no-arg constructor for Software, Hardware, and Manual subclasses
to accept three arguments for the product name, description, and price. Use
this code example for the Software class as an example:
public Software(String name,String desc,double price)
{
setName(name);
setDescription(desc);
setRetailPrice(price);
}
g. Compile and save all your new subclasses.
Modify DataMan to Provide a List of Products and a Finder Method
Use the new class definitions in the DataMan class to build an inventory of products.
2. In DataMan, create an object to hold a collection of products.
a. Create a private static inner class called ProductMap that extends
HashMap.
Note: Remember to import java.util.HashMap.
b. In the ProductMap inner class, create the following method to add product objects
to the collection. The ID is the key, and object reference is the value:
public void add(Product p) {
String key = Integer.toString(p.getId());
put(key, p); // use inherited put() method
}
c. Declare a private static ProductMap variable called products. For example:
private static ProductMap products = null;
d. Compile and save your DataMan class.
3. Create a method to populate the ProductMap variable with product objects.
a. Create the method called buildProducts() in the DataMan class as follows:
public static void buildProducts() {
if (products != null) return;
products = new ProductMap();
products.add(new Product());
}
b. Save and compile your code. Explain the compilation error that is listed for the line
adding the Product to the products map.

Oracle10g: Java Programming 12-24


Practice 12: Structuring Code by Using Abstract Classes and Interfaces (continued)
c. Fix the compilation error by adding concrete subclasses of the Product class.
Replace the line of code products.add(new Product()) with the following
text:
Note: Either copy the following code, or to save time, cut and paste the lines of code
from a file called \labs\les12.txt:
products.add(
new Hardware("SDRAM - 128 MB", null, 299.0));
products.add(new Hardware("GP 800x600", null, 48.0));
products.add(
new Software("Spreadsheet-SSP/V2.0", null, 45.0));
products.add(
new Software("Word Processing-SWP/V4.5",null,65.0));
products.add(
new Manual("Manual-Vision OS/2x +", null, 125.0));
d. Compile the DataMan code and save your changes. Your compilation should
work this time.
e. At the end of the file, in the static block of DataMan, add a call to the
buildProducts() method.
f. Add the following method called findProductById() to return a Product
object matching a supplied ID.
public static Product findProductById(int id) {
String key = Integer.toString(id);
return (Product) products.get(key);
}
Note: Because products is a HashMap, you simply find the product object by
using its key; that is, the ID of the product.
g. Compile and save the changes to the DataMan class.
h. Test the DataMan code, and additional classes, by printing the product that is found
by its ID. Add the following line to OrderEntry class at the end of main():
System.out.println("Product is: " +
DataMan.findProductById(2001));
i. Compile, save, and run the OrderEntry application to test the code.

Oracle10g: Java Programming 12-25


Practice 12: Structuring Code by Using Abstract Classes and Interfaces (continued)
Optional Extra Credit
Modify OrderItem to Hold Product Objects
4. Replace usages of the product variable as an int type with the Product class.
a. In OrderItem.java, change the type declaration for the product instance
variable to be Product instead of int.
b. Replace the two argument constructors with a single argument called newProduct
whose type is Product; that is, remove productId and itemPrice arguments.
c. Change the body of the constructor to store the newProduct in the product
variable, and set the unitPrice to be the value that is returned by calling the
getRetailPrice() method of the product object.
d. Modify getProduct() method to return Product instead of an int, and change
setProduct() method to accept a Product instead of an int.
e. Alter the toString() method to display the item total instead of the unitPrice.
Hint: Use the getItemTotal() method.
f. Compile and save your code changes. Only eliminate syntax errors from the
OrderItem class. Errors that are reported for the Order class are corrected in the
next step of this lab.
Modify Order to Add Product Objects into OrderItem
Alter the Order.java class to use the Product objects instead of an int value.
5. Make the following changes to the addOrderItem() method:
a. Rename the argument to be productId, and in the for loop replace:
productFound = (item.getProduct() == product);
with
productFound =
(item.getProduct().getId() == productId);
b. In the else section of the if statement, call findProductById() from
DataMan by using the productId value. If a product object is found, then create
the OrderItem by using with the product object; otherwise, do nothing. For
example:
item = new OrderItem(product, 5.0);
items.addElement(item);
becomes:
Product p = DataMan.findProductById(productId);
if (p != null) {
item = new OrderItem(p);
items.addElement(item);
}

Oracle10g: Java Programming 12-26


Practice 12: Structuring Code by Using Abstract Classes and Interfaces (continued)
6. Test changes that are made to your code supporting the Product class and its subclasses,
by modifying OrderEntry class to use the new product ID values.
a. Because the ID of Product objects (or its subclasses) start at 2000, edit the file
OrderEntry.java, replacing parameter values in all the calls to the
order.addOrderItem() method, as shown by the following table:
eplace With
101 2001
102 2002
b. Save, compile, and run the OrderEntryProject project, and check the changes
to the printed items. Check whether the price calculations are still correct.
Create and Implement the Taxable Interface
7. Create an interface called Taxable.
a. Right-click the OrderEntryProject.jpr file in the Navigator, and select
New … from the pop-up menu. Enter Taxable in the class name and ensure that
you clear Generate Default Constructor.
Then, click the OK button.
b. In the Code Editor, replace the keyword class with the keyword interface.
c. Add the following variable and method definitions to the interface:
double TAX_RATE = 0.10;
double getTax(double amount);
Note: Remember that all variables are implicitly public static final, and that
methods are all implicitly public.
The implementer of the interface must multiply the amount, such as a price, by the
TAX_RATE and return the result as a double.
d. Compile and save the interface.
8. Edit the Hardware class to implement the Taxable interface.
a. Add the bold text to the class definition to implement the interface, as shown:
public class Hardware extends Product
implements Taxable {
b ompile the Hardware class and explain
the error
c dd the following method to complete
the implementation of the interface
public double getTax(double amount) {
return amount * TAX_RATE;
}
Note: To perform the two steps above, select the Tools > Implement Interface menu
item, and select oe.Taxable from the tree in the Implement Interface window,
then click OK. JDeveloper generates all the code except for the return value
calculation. You can modify the generated body to return the desired result, as
shown above. Alternatively, you can also type the code manually in the Source.
d. Compile and save the Hardware class.

Oracle10g: Java Programming 12-27


Practice 12: Structuring Code by Using Abstract Classes and Interfaces (continued)
9. Change the OrderItem class to obtain the tax for each item.
a. Add a public double getTax() method to determine whether the Product
in the item is taxable. If the product is taxable, then return the tax amount for the item
total (use getItemTotal() method); otherwise, return 0.0. For example:
double itemTax = 0.0;
if (product instanceof Taxable)
{
itemTax =((Taxable)
product).getTax(getItemTotal());
}
b. Modify the toString() method to display the tax amount for the item, if and only
if the product is taxable. Use the getTax() method that you created, and format the
value with Util.toMoney().
c. To view changes, compile OrderItem.java, and run OrderEntry.
10. Modify the Order class to display the tax, and order total to include the tax.
a. In the showOrder() method, add a local double variable called taxTotal
initialized to 0.0 that accumulates the total tax for the order.
b. Modify the for loop by using the Enumeration to call the getTax() method for
each item, and add the value to taxTotal.
Hint: To do this, you must cast the return value of e.nextElement() to
OrderItem
c dd three System.out.println() statements
after the loop one to print the taxTotal
the second to print the orderTotal
including taxTotal
and the last without a parameter to
print a blank line se the Util.toMoney()
method to format the totals
d o view results compile and save
Order.java and then run OrderEntry

Oracle10g: Java Programming 12-28


Throwing and Catching Exceptions

Copyright © 2004, Oracle. All rights reserved.

Schedule: Timing Topic


45 minutes Lecture
25 minutes Practice
70 minutes Total
Objectives

After completing this lesson, you should be able to do


the following:
• Explain the basic concepts of exception handling
• Write code to catch and handle exceptions
• Write code to throw exceptions
• Create your own exceptions

13-2 Copyright © 2004, Oracle. All rights reserved.

Lesson Aim
Many Java methods in the Java Development Kit (JDK) class library throw an exception
when they encounter a serious problem that they do not know how to handle. This lesson
explains how exceptions work in Java, and shows you how to handle such exceptions in
your applications.

Oracle10g: Java Programming 13-2


What Is an Exception?

An exception is an unexpected event.

13-3 Copyright © 2004, Oracle. All rights reserved.

What Is an Exception?
An exception is an event that occurs during the execution of a program that disrupts the
normal flow of instructions. For example, trying to access an element outside the bounds of
an array, trying to divide a number by zero, and trying to access a URL with an invalid
protocol are all exceptions.
What Is an Error?
An error in Java is an unrecoverable abnormal condition. For example, an error condition
exists if there is some internal error in Java Virtual Machine (JVM) or if JVM runs out of
memory.
What Is the Difference?
Your code can handle an exception and move on; if an error occurs, then your program must
exit.
Instructor Note
There are some instances when errors can be caught and handled. For example, under some
circumstances your code can catch the error java.lang.ThreadDeath. See the
javadoc for details.

Oracle10g: Java Programming 13-3


How Does Java Handle Exceptions?

• A method throws an exception.


• A handler catches the exception.

Exception object

Handler
for this
Yes exception? No

13-4 Copyright © 2004, Oracle. All rights reserved.

Exception Handling in Java


When an exception occurs within a Java method, the method creates an Exception object
and hands it off to the run-time system. This process is called throwing an exception. The
Exception object contains information about the exception, including its type and the
state of the program when the error occurred.
When a Java method throws an exception, the run-time system searches all the methods in
the call stack in sequence to find one that can handle this type of exception. In Java
terminology, this method catches the exception.
If the run-time system does not find an appropriate exception handler, then the whole
program terminates.
The following slides discuss some of the advantages of Java’s exception handling over
traditional error handling in other languages.

Oracle10g: Java Programming 13-4


Advantages of Java Exceptions:
Separating Error Handling Code

• In traditional programming, error handling often


makes code more confusing to read.
• Java separates the details of handling unexpected
errors from the main work of the program.
• The resulting code is clearer to read and,
therefore, less prone to bugs.

13-5 Copyright © 2004, Oracle. All rights reserved.

Advantage 1: Separating Error Handling Code from Other Code


In traditional programming, error handling often makes code more confusing to read.
For example, if you want to write a function that reads the first line of a file, then the
pseudocode for the function may be:
readFirstLine {
open the file; // the open could fail
read the first line; // the read could fail
close the file; // the close could fail
}
The traditional way of checking for the potential errors in this function is to test each
possible error and set an error code. The table on the next page compares the traditional
method with Java’s exception handling; the original three statements are in bold.

Oracle10g: Java Programming 13-5


Advantage 1: Separating Error Handling Code from Other Code (continued)

Traditional Error Handling Java Exception Handling


readFirstLine { readFirstLine {
int errcode = 0; try {
open the file; open the file;
if (openError) { read the first line;
errcode = OPEN_ERR; close the file;
} }
else { catch (openError) {
read the first line; handle error;
if (readError) { }
errcode = READ_ERR; catch (readError) {
} handle error;
close the file; }
if (closeError) { catch (closeError) {
errcode = errcode handle error;
and CLOSE_ERR; }
} }
}
return errcode;
}

Java separates the details of handling unexpected errors from the main work of the program,
making the code clearer to read (which, in turn, makes it less prone to bugs).
Instructor Note
The term try means that the code is trying something that may throw an exception; catch
means that the code is handling the exception.

Oracle10g: Java Programming 13-6


Advantages of Java Exceptions:
Passing Errors Up the Call Stack

Traditional error Java exceptions


handling
method1 Method1
//handle error Error //handle ex
code
method2 method2
Error Exception
code ex
method3 method3
Error
method4 code method4

Each method checks for method4 throws an


errors and returns an error exception; eventually
code to its calling method. method1 catches it.

13-7 Copyright © 2004, Oracle. All rights reserved.

Advantage 2: Passing Errors Up the Call Stack


A Java exception is sent immediately to the appropriate exception handler; there is no need
to have if statements at each level to pass the error up the call stack. For example, a series
of nested methods can handle errors as follows:
method1 handles all errors
method1 calls method2
method2 calls method3
method3 calls method4
The following table shows the steps that are taken by traditional error handling and Java
exception handling if an error occurs in method4. Exception handling requires fewer steps.
Traditional Error Handling Java Exception Handling
1. method4 returns an error code to 1. method4 throws an exception and it is
method3. propagated to method3.
2. method3 checks for errors, and 2. method3 receives a return from method 4 and
passes the error code to method2. propagates it to method2.
3. method2 checks for errors, and 3. method2 receives a return from method3 and
passes the error code to method1. propagates it to method1.
4. method1 handles the error. 4. method1 catches and handles the exception.

Oracle10g: Java Programming 13-7


Advantages of Java Exceptions:
Exceptions Cannot Be Ignored

Traditional error Java exceptions


handling
method1 method1
//handle error //handle ex

method2 method2
Exception
ex
method3 method3
Error
method4 code method4
If method3 ignores the The exception must be
error, then it will never be caught and handled
handled. somewhere.

13-8 Copyright © 2004, Oracle. All rights reserved.

Advantage 3: Exceptions Cannot Be Ignored


After a method has thrown an exception, it cannot be ignored; it must be caught and handled
somewhere. In the example in the slide, the programmer writing method3, method2, or
method1 can choose to ignore the error code that is returned by method4, in which case
the error code will be lost.
Instructor Note
The following slide describes the two types of exceptions. The compiler requires that
checked exceptions be caught and handled somewhere. The compiler does not make this
requirement for run-time exceptions, but an uncaught run-time exception causes the program
to terminate. The details of the slide are true only for checked exceptions, but it is true that
no exception can be ignored. You may want to make this point here, or you may want to
leave it until the two types of exceptions have been covered.
The Java exceptions diagram uses dotted arrows to show the exception propagating, by
returning from method4 to method3, and then from method3 to method2. It uses a solid
arrow to show a return from method2 to method1. In this case, the dotted lines indicate that
the exception has just been propagated, and the solid line indicates that the exception has
been picked up and caught by the caller.

Oracle10g: Java Programming 13-8


Checked Exceptions, Unchecked
Exceptions, and Errors

All errors and exceptions extend the Throwable class.

Throwable

Error Exception

Unrecoverable Checked RuntimeException


errors exceptions

Unchecked (run-time)
exceptions

13-9 Copyright © 2004, Oracle. All rights reserved.

Standard Error and Exception Classes


All the standard errors and exceptions in Java extend the Throwable class.
Errors
Errors are extensions of the Error class. If an error is generated, then it normally indicates
a problem that will be fatal to the program. Examples of this type of error are: running out of
memory or being unable to load a class. Do not catch Errors in your Java code.
Unchecked Exceptions
Unchecked (or run-time) exceptions are extensions of the RuntimeException class. All
the standard run-time exceptions (for example, dividing by zero or attempting to access an
array beyond its last element) are extensions of RuntimeException. You can choose
what to do with run-time exceptions; you can check for them and handle them, or you can
ignore them. If a run-time exception occurs and your code does not handle it, JVM
terminates your program and prints the name of the exception and a stack trace.

Oracle10g: Java Programming 13-9


Standard Error and Exception Classes (continued)
Checked Exceptions
Checked exceptions are extensions of the Exception class. Checked exceptions must be
caught and handled somewhere in your application; this rule is enforced by the compiler.
Exceptions that you create yourself must extend the Exception class.
Note: Run-time exceptions do not need to be caught, but they cannot be ignored. If they are not
caught, then the program terminates with an error.
Instructor Note
Ask the students: Why must you extend the Exception class?
If you subclass the Exception class to create a “Checked” exception (that is, if the error is
significant enough), then the developers who use your Exception class are forced to explicitly
handle the exception when it is thrown. This forces a more robust code to be written.
Subclass a RuntimeException if the developer does not want to force the developers to
catch the exception. In the case of subclassing a RuntimeException, the type of errors must
be of a less critical type, which does not cause the code to terminate or function badly if it is not
handled.
In general, to promote a robust code, subclass the Exception class to force the developer to
manage the exception before the code is compiled.

Oracle10g: Java Programming 13-10


What to Do with an Exception

• Catch the exception and handle it.


• Allow the exception to pass to the calling method.
• Catch the exception and throw a different
exception.

13-11 Copyright © 2004, Oracle. All rights reserved.

Handling Exceptions
If you call a method that may throw a checked exception, then you have three choices:
• Catch the exception and handle it.
• Allow the exception to pass through your method; another handler somewhere else
must handle it.
• Catch the exception and throw a different exception; the new exception must be
handled by another handler somewhere else.
Run-Time Exceptions
Your code does not need to handle run-time exceptions; these are handled by JVM. JVM
handles run-time exceptions by terminating your program; if you do not want a run-time
exception to have this effect, then you must handle it.

Oracle10g: Java Programming 13-11


Catching and Handling Exceptions

• Enclose the method try {


call in a try block. // call the method
• Handle each }
exception in a catch catch (exception1) {
block. // handle exception1
• Perform any final }
processing in a catch (exception2) {
finally block. // handle exception2
}…
finally {
// any final processing
}

13-12 Copyright © 2004, Oracle. All rights reserved.

Catching and Handling Exceptions


If a block of code calls one or more methods that may throw exceptions, then enclose the
code in a try block, with one or more catch blocks immediately after it. Each catch
block handles a particular exception.
You can add a finally block after all the catch blocks. A finally block may be
executed, depending on what happens before the block (for example, System.exit).
How Do You Know Whether a Particular Java Method Throws an Exception?
All the standard Java classes are documented in the JDK documentation; part of the
specification for each method is a list of exceptions that the method may throw. Whenever
you call a Java method, you must know what exceptions may arise as a consequence. For
example, the following are declarations that are taken from the JDK documentation for
java.io.FileInputStream:
public FileInputStream(String name)
throws FileNotFoundException …
public int read() throws IOException
eneral uidelines for try-catch-block
tructures
try block must have at least one catch
block or a finally block
- catch block is required for checked
exceptions unless it is
propagated Oracle10g: Java Programming 13-12
try block can have more than one catch
block
Catching a Single Exception

int qty;
String s = getQtyFromForm();
try {
// Might throw NumberFormatException
qty = Integer.parseInt(s);
}
catch ( NumberFormatException e ) {
// Handle the exception
}
// If no exceptions were thrown, we end up here

13-13 Copyright © 2004, Oracle. All rights reserved.

Catching a Single Exception


The example in the slide uses Integer.parseInt() to process the value that an end
user has entered on a form. parseInt() throws a NumberFormatException if the
string is not an integer value. The catch block can handle this exception by prompting the
user to enter the value again.
Instructor Note
You can show the JDK documentation for Integer.parseInt(String s), or ask
students to look it up themselves to find out exactly what it does.
Because NumberFormatException is a run-time exception, your code does not have to
catch it, although in this case, it is a good idea.

Oracle10g: Java Programming 13-13


Catching Multiple Exceptions

try {
// Might throw MalformedURLException
URL u = new URL(str);
// Might throw IOException
URLConnection c = u.openConnection();
}
catch (MalformedURLException e) {
System.err.println("Could not open URL: " + e);
}
catch (IOException e) {
System.err.println("Could not connect: " + e);
}

13-14 Copyright © 2004, Oracle. All rights reserved.

Catching Multiple Exceptions


The example constructs a URL and then connects to it. The example uses two catch
blocks, because there are two possible exceptions that can occur. If an exception occurs in
the try block, then JVM checks each catch handler in sequence until it finds one that
deals with that type of exception; the rest of the try block is not executed.
A catch statement catches the exception that is specified as well as any of its subclasses.
For example, the javadoc for MalformedURLException shows that it extends
IOException; thus, you can replace the two catch blocks with one:
catch (IOException e) {
System.err.println("Operation failed: " + e);
}
You will use a single catch block if you wanted your code to behave in the same way for
either exception.
Order of catch Statements
Note that you get a compiler error if you specify a catch handler for a superclass first,
followed by a catch handler for a subclass. This is because the superclass catch handler
hides the subclass catch handler, which will therefore never see any exceptions. For
example, reversing the two catch blocks in the example causes a compiler error.

Oracle10g: Java Programming 13-14


Cleaning Up with a finally Block

FileInputStream f = null;
try {
f = new FileInputStream(filePath);
while (f.read() != -1)
charcount++;
}
catch(IOException e) {
System.out.println("Error accessing file " + e);
}
finally {
// This block is always executed
f.close();
}

13-15 Copyright © 2004, Oracle. All rights reserved.

Cleaning Up with a finally Block


The example opens a file and counts the characters in the file. The file is then closed, even if
the read operation causes an exception. A finally block is useful when you want to
release system resources, such as open files.
A finally block is executed regardless of how the try block exits:
• Normal termination, by falling through the end brace
• Because of return or break statement
• Because an exception was thrown
Note: f.close() can throw an IOException and, therefore, must be enclosed in its
own try…catch block inside the finally block.
Instructor Note
The FileInputStream constructor throws the FileNotFoundException, and
read() throws the IOException. However, FileNotFoundException is a
subclass of IOException, so the catch block works in either case.
Note that you can have a finally block without any intervening catch blocks:
try { … }
finally { … }
You cannot, however, have a finally block on its own, without a try block preceding it.
Oracle10g: Java Programming 13-15
Catching and Handling Exceptions:
Guided Practice
void makeConnection(String url) {
try {
URL u = new URL(url);
}
catch (MalformedURLException e) {
System.out.println("Invalid URL: " + url);
return;
}
finally {
System.out.println("Finally block");
}
System.out.println("Exiting makeConnection");
}

13-16 Copyright © 2004, Oracle. All rights reserved.

Catching and Handling Exceptions


Examine the code that is shown in the slide, and describe what it is doing. Note that the url
argument is a string such as http://www.oracle.com.
1. What will be printed to standard output if the URL constructor executes without
throwing an exception?
2. What will be printed to standard output if the URL constructor throws a
MalformedURLException?
Instructor Note
1. Finally block
Exiting makeConnection
2. Invalid URL: <url>
Finally block

Oracle10g: Java Programming 13-16


Catching and Handling Exceptions:
Guided Practice
void myMethod () {
try {
getSomething();
} catch (IndexOutOfBoundsException e1) {
System.out.println("Caught IOBException ");
} catch (Exception e2) {
System.out.println("Caught Exception ");
} finally {
System.out.println("No more exceptions ");
}
System.out.println("Goodbye");
}

13-17 Copyright © 2004, Oracle. All rights reserved.

Catching and Handling Exceptions (continued)


1. What will be printed to standard output if getSomething() throws an
IllegalArgumentException?
2. Would anything change if the order of the two catch blocks was reversed? That is:

try …
catch (Exception e) {…}
catch (IndexOutOfBoundsException e) {…}

Instructor Note
1. Caught Exception
No more exceptions
Goodbye
2. The code will not compile because the second catch block can never be reached.
The relevant subclassing information is:
public class RuntimeException extends Exception
public class IndexOutOfBoundsException extends
RuntimeException
public class IllegalArgumentException extends
RuntimeException

Oracle10g: Java Programming 13-17


Allowing an Exception to Pass to the
Calling Method

• Use throws in the method declaration.


• The exception propagates to the calling method.

public int myMethod() throws exception1 {


// code that might throw exception1
}

public URL changeURL(URL oldURL)


throws MalformedURLException {
return new URL("http://www.oracle.com");
}

13-18 Copyright © 2004, Oracle. All rights reserved.

Allowing an Exception to Pass to the Calling Method


If you cannot meaningfully handle an exception locally, or you choose not to, then it can be
passed back to the code that called your method.
In the example in the slide, the URL constructor can throw a
MalformedURLException, but the method does not catch this exception locally.
Instead, the exception passes automatically to the method that called changeURL().
If you want an exception to propagate to the calling method, then you must declare the
exception in your method declaration:
public URL changeURL(URL oldURL) throws MalformedURLException
{

}
The method that calls changeURL() can catch MalformedURLException, or it can
also let the exception pass through. If the calling method allows the exception to pass
through, then it must also contain throws MalformedURLException in its
declaration.

Oracle10g: Java Programming 13-18


Throwing Exceptions

• Throw exceptions by using the throw keyword.


• Use throws in the method declaration.

throw new Exception1();

public String getValue(int index) throws


IndexOutOfBoundsException {
if (index < 0 || index >= values.length) {
throw new IndexOutOfBoundsException();
}

}

13-19 Copyright © 2004, Oracle. All rights reserved.

Throwing Exceptions
You can throw exceptions in your own code to indicate some abnormal situation. The
exceptions that you throw can be standard system exceptions, or you can create your own.
If you do decide to throw exceptions, remember that what you are really doing is creating an
object and passing it to a higher-level method. Therefore, you must create this exception
object by using the new operator, as shown in the slide.
A method can throw multiple exceptions, in which case the exception names are separated
by commas.
Four types of exception are System, Application, Run-time and Custom. The
java.lang.IndexOutOfBoundsException is a run-time Exception.

Oracle10g: Java Programming 13-19


Creating Exceptions

Extend the Exception class.


public class MyException extends Exception { … }

public class UserFileException extends Exception {


public UserFileException (String message) {
super(message);
}
}

13-20 Copyright © 2004, Oracle. All rights reserved.

Creating Exceptions
You can create your own exceptions by extending the Exception class. You must not
extend the RuntimeException class because this is for common exceptions that need
not be checked.
The example creates an exception called UserFileException with one constructor that
just calls the constructor of the superclass.
You can create multiple exceptions for different circumstances in your code. For example, if
your code accesses different files, then you can throw a different exception for each file.
This approach is useful for several reasons:
• You can handle each exception differently.
• If your exception handlers print out the exception, then this gives you or your users
more information about where the exception occurred.
• You can customize your exception. For example, you can add a
UserFileException constructor that sets an attribute for the line number of the
file and a method that prints out the line number.

Oracle10g: Java Programming 13-20


Catching an Exception and Throwing a
Different Exception

catch (exception1 e) {
throw new exception2(…);
}

void readUserFile() throws UserFileException {


try {
// code to open and read userfile
}
catch(IOException e) {
throw new UserFileException(e.toString());
}
}

13-21 Copyright © 2004, Oracle. All rights reserved.

Catching an Exception and Throwing a Different Exception


The example catches IOException and handles it by throwing UserFileException.
You do this if you want this method to throw a different exception from other methods. The
method uses the throws keyword in its declaration to indicate that it throws a
UserFileException.

Oracle10g: Java Programming 13-21


Summary

In this lesson, you should have learned how to do the


following:
• Use Java exceptions for robust error handling
• Handle exceptions by using try, catch, and
finally
• Use the throw keyword to throw an exception
• Use a method to declare an exception in its
signature to pass it up the call stack

13-22 Copyright © 2004, Oracle. All rights reserved.

Oracle10g: Java Programming 13-22


Practice 13: Overview

This practice covers:


• Creating a custom exception
• Changing DataMan finder methods to throw
exceptions
• Handling the exceptions when calling the DataMan
finder methods
• Testing the changes to the code

13-23 Copyright © 2004, Oracle. All rights reserved.

Practice 13: Overview


Note: If you have successfully completed the previous practice, then continue using the
same directory and files. If the compilation from the previous practice was unsuccessful and
you want to move on to this practice, then change to the les12 directory, load the
OrderEntryWorkspaceLes12 workspace, and continue with this practice.
Viewing the model: To view the course application model up to this practice, load the
OrderEntryWorkspaceLes12 workspace. In the Applications – Navigator node,
expand the OrderEntryWorkspaceLes12 – OrderEntryProjectLes12 -
Application Sources – oe, and double-click the UML Class Diagram1 entry.
This diagram displays all the classes created to this point in the course.

Oracle10g: Java Programming 13-23


Practice 13: Throwing and Catching Exceptions
Goal
The goal of this practice is to learn how to create your own exception classes, throw an
exception object by using your own class, and handle the exceptions.
Note: If you have successfully completed the previous practice, then continue using the
same directory and files. If the compilation from the previous practice was unsuccessful and
you want to move on to this practice, then change to the les12 directory, load the
OrderEntryWorkspaceLes12 workspace, and continue with this practice.
Your Assignment
The application does not appropriately handle situations when an invalid customer ID is
supplied to the DataMan.findCustomerById() method, or an invalid product ID is
given to the DataMan.findProductById() method. In both cases, a null value is
returned. Your tasks are to:
• Create a user-defined (checked) exception called oe.NotFoundException.
• Modify DataMan.findCustomerById() to throw the exception when an
invalid customer ID is provided.
• Modify the DataMan.findProductById()method in the DataMan class to
throw the exception if the given product ID is not valid (that is, not found).
Create the NotFoundException Class
1. In the OrderEntryProject, create a new class called NotFoundException.
a. Right-click the project name in the Navigator, and select New … from the pop-
up menu. From the New gallery window, ensure that the Category selected is
General and the Item selected is Java Class. Enter the class name
NotFoundException, and make it a subclass of java.lang.Exception.
b. Modify the default no-arg constructor to accept a message String argument,
and pass the string to the superclass constructor. For example:

public NotFoundException(String message) {


super(message);
}
c. Compile and save the NotFoundException class.
Throw Exceptions in DataMan Find Methods and Handle Them in OrderEntry
2. Edit DataMan.java, and modify the findCustomerById() method to throw
the NotFoundException when the given customer ID is not found in the array.
a. At the end of the for loop, if the local customer object reference is null (that
is, the customer is not found), then throw an exception object, using the
following error message structure in the constructor argument:
"Customer with id " + custId + " does not exist“
b. Compile the DataMan class. Explain the error.
c. Fix the error by modifying the method declaration to propagate the exception.
d. Compile DataMan again. What errors do you get this time? Explain the errors.

Oracle10g: Java Programming 13-24


Practice 13: Throwing and Catching Exceptions (continued)
e. Fix the compilation errors by handling the exceptions with a try-catch block
in the OrderEntry class. For simplicity, use one try-catch block to handle
all the calls to the DataMan.findCustomerById() methods. Alternatively,
if desired, then handle each call in its own try-catch block.
try { // calls to findCustomerById() here …
}
catch (NotFoundException e) {
// handle the error here …
}
In the catch block, you can use the exception’s inherited methods to display
error information. Use the following two methods to display error information:
- e.printStackTrace() to display the exception, message, and stack
trace
- e.getMessage() to return the error message text as a String.
f. Compile, save, and run OrderEntry.java. Test your code with the errors.
3. Now modify the findProductById() to throw NotFoundException when
the supplied product ID is not found in the product map.
a. The findProductById() method calls get(key) to find a product from
the HashMap. If get(key) returns a null, then throw a
NotFoundException by using the following error message; otherwise, return
product object found. You must also add the product declaration line and modify
the current return statement.
"Product with id " + id + " is not found"
b. Modify the findProductById() declaration to propagate the exception.
c. Compile and save DataMan, and explain the compile time error reported.
d. In the Order class, modify the addOrderItem() to propagate the exception.
e. Compile the Order class, and explain why it compiles successfully.
f. In OrderEntry.java, use a value of 9999 as the product ID in the first call
to order.addOrderItem(2001) ompile and run
OrderEntry
xplain why the application
terminates immediately after
adding product 9999
g n Order.java remove throws NotFoundException
from the end of the addOrderItem() method
declaration rite a try-catch block to
handle the exception in this
method
int ou must return from the method
in the catch block to ensure the
itemTotal is not affected
h. Compile Order and run OrderEntry.java, and explain the difference in
output results.
i. In OrderEntry, replace the 9999 product ID with 2001. Compile, save, and
run.

Oracle10g: Java Programming 13-25


User Interface Design: Swing Basics
Planning the Application Layout

Copyright © 2004, Oracle. All rights reserved.

Schedule: Timing Topic


55 minutes Lecture
35 minutes Practice
90 minutes Total
Objectives

After completing this lesson, you should be able to do


the following:
• Explain Abstract Window Toolkit (AWT), Swing,
and Java Foundation Classes (JFC)
• Detail the Swing UI containment hierarchy
• Describe how to use layout managers
• Add UI containers to an application to group
components
• Embed UI components into UI containers
• Use the Swing pluggable look and feel

14-2 Copyright © 2004, Oracle. All rights reserved.

Lesson Aim
This lesson shows you how to provide a Java applet or application with a graphical user
interface based on Swing components, such as buttons and text fields. Participants learn how
to embed Swing components into Swing containers and how to use layout managers to
provide an interface that is usable across platforms.

Oracle10g: Java Programming 14-2


Running Java UI Applications

14-3 Copyright © 2004, Oracle. All rights reserved.

Running Java UI Applications


Java applications and applets are not limited to run on any one platform. You can run them
on any platform that supports a Java Virtual Machine (JVM) because each of the platforms
has its own specific display methods and characteristics.
Java provides layout managers that help to optimize the look and feel of your application for
the platform on which it is running. This is performed dynamically without any need for
code modification. This behavior is one of the aspects of the Java “write once, run
anywhere” (WORA) concept.
The screenshot on the slide uses different layout managers to produce the desired effect. It
uses Border, Grid, and GridBag layouts. By combining different layout managers, you can
obtain the layout that you want and deploy the program on multiple platforms.

Oracle10g: Java Programming 14-3


AWT, Swing, and JFC

• AWT, or Abstract Window Toolkit (java.awt):


– A graphical user interface library
– The predecessor to Swing components and the
foundation for Swing and JFC
• Swing (javax.swing):
– A more powerful graphical user interface library
– Built on top of the AWT class hierarchy
• Java Foundation Classes (JFC):
– A collection of APIs including: AWT, Swing,
Accessibility API, Pluggable Look and Feel
– Java 2D API, Drag and Drop support (since JDK 1.2)

14-4 Copyright © 2004, Oracle. All rights reserved.

Abstract Window Toolkit (java.awt)


The AWT was Java’s original toolkit or set of visual components for the development of
graphical user interface applications. AWT is the foundation upon which Swing and the rest
of the JFC are constructed. AWT was not designed for high-powered UI development,
which can be appreciated when you understand that it has a smaller set of components.
AWT classes are found in the java.awt package and its subpackages.
Swing (javax.swing)
Swing provides lightweight components built on top of the AWT library. It provides many
more components that are intended for high-powered user interface, which are more
efficient than their AWT counterparts. Swing components adhere to the AWT event
handling model that was introduced in JDK 1.1. Swing classes are found in the
javax.swing package and its subpackages.

Oracle10g: Java Programming 14-4


Java Foundation Classes (JFC)
The Java Foundation Classes is a set of classes and APIs that was first released with JDK
1.1. The version of JFC that is included in JDK 1.2 contains:
• AWT and the Swing GUI components
• Accessibility API for people with disabilities
• Pluggable look and feel, to adapt the UI to an operating system look and feel
• Java 2D API for two-dimensional graphics and imaging
• Drag and drop support
Because Swing is the major component of JFC, the terms Swing and JFC are often used
interchangeably. Oracle JDeveloper 10g supports JDK 1.4.2, so Swing is fully supported.
Note: You can create Java client applications that rely on standard Swing components in
your application. The Java client application in JDeveloper is known as a JClient
application. When a JClient form has been deployed to a client machine, users can use it to
display and manipulate data in the form. This course is not intended to teach you about
JClient, only to show you how to develop Java applications using JDeveloper.

Oracle10g: Java Programming 14-5


Swing Features

A set of visual components that have been available


since JDK 1.1, but part of core JDK since version 1.2:
• Lightweight components compared to AWT
• Pluggable look and feel API
InventoryItem
• Many more components than AWT

JButton JSlider JTree

JComboBox JTextField JProgressBar

14-6 Copyright © 2004, Oracle. All rights reserved.

The Swing Package


The Swing components are all part of the javax.swing package, which was added in
JDK 1.2. Swing transformed the Java UI development by providing lightweight components
that could adapt to the look and feel of the operating system in which the application
executed. Swing provides many more types of UI components for user interaction than
found in AWT.
Lightweight Versus Heavyweight Components
Swing components are considered lightweight, meaning that they are rendered (visually
constructed) in their container window; that is, they are created within the Java environment.
The container window is usually a native (operating system) window. However, AWT
components are heavyweight, meaning that each component is rendered in its own native
window. This makes Swing components smaller and more efficient than their AWT
counterparts.

Oracle10g: Java Programming 14-6


The Swing Package (continued)
Pluggable Look and Feel
Developers can use the pluggable look and feel feature of Swing to specify the look and feel
of applications that are developed with Swing components. The default is to use the Java
look and feel (called the Metal look and feel). By using the pluggable look and feel API, you
can develop your application to use the native look and feel of whatever platform the
application happens to be running on, or you can develop your own look and feel.
Instructor Note
The javax.swing.UIManager class controls the look and feel of an application. Some
simple code examples at the end of this lesson are provided to show how to change the look
and feel for Swing applications.

Oracle10g: Java Programming 14-7


Lightweight or Heavyweight Components?

Heavyweight components Lightweight components


• Strong dependency on • No dependence on native
native peer code peer code
• Each rendered in its own • Can have transparent
opaque window backgrounds
• Early AWT components • Most Swing components
were mostly are lightweight
heavyweight • When displayed, they can
• Include some Swing appear nonrectangular
top-level components • Must be displayed in
(JFrame, JApplet, heavyweight container
JDialog)

14-8 Copyright © 2004, Oracle. All rights reserved.

Using Lightweight and Heavyweight Components


Heavyweight components were developed in early releases of the AWT. Each heavyweight
component is tightly associated with a native peer component in the client environment.
When rendered, each heavyweight component relies on the creation of its own native opaque
window. All top-level containers are heavyweight and provide the context for lightweight
containers and components.
Lightweight components must ultimately be displayed in heavyweight top-level containers,
such as JFrame, JApplet, or JDialog. However, lightweight components are visually
more flexible because they can be transparent, and appear nonrectangular. These features
allow lightweight components to be easily adapted to a different look and feel. Lightweight
components do not have a native peer, as they are rendered directly by the Java code.
Therefore, lightweight components are more portable.
Note: As a general rule, avoid mixing heavyweight and lightweight low-level components,
such as buttons, text fields, and so on. In other words, avoid using AWT and Swing
components in the same visual container or application.

Oracle10g: Java Programming 14-8


Planning the UI Layout

Building a UI application involves planning, even more


so when building Swing applications. Planning
requires understanding the following concepts and
their relationship:
• UI containment hierarchy (a root component that
comprises nested containers and components)
• Container levels and types (such as top-level or
intermediate containers)
• Layout managers and their types (used by each
container)
• Components that can be added into containers

14-9 Copyright © 2004, Oracle. All rights reserved.

Planning the UI Layout


Building a Java UI application, whether it is stand-alone or embedded in a browser such as
an applet, requires some basic understanding of:
• The Java UI containment hierarchy that provides a layer of containers nested within
containers, and components within containers
• The types of Java containers and their relationship in the containment hierarchy
• The concept of layout managers and their types
• Components that can be added into containers
Most graphical applications have a main display area, usually a main window, or the applet
display area in a Web browser. In Java, the main window, or applet display area, is called a
top-level container. A top-level container is considered the root of the containment hierarchy
for that window or area.
Note: An application can comprise many top-level windows.
A main window can be divided into regions or sections, which are represented by
intermediate containers, and ultimately into components that contain the user data or accept
user input. These components will be positioned within the top-level or intermediate
containers. Together, the top-level and intermediate containers with their components form a
containment hierarchy.
Each container makes use of a layout manager to control the size and placement of
components within a container.
Oracle10g: Java Programming 14-9
The Containment Hierarchy

• Top-level containers Frame


– Frame
– Dialog
– Applet
• Intermediate containers
– Panel
– Scroll Pane
• Atomic components
– Label
Panel
– Text items Atomic
– Buttons components

14-10 Copyright © 2004, Oracle. All rights reserved.

Swing Containment Hierarchy


The slide lists the three levels of containers for Swing components that are commonly used
in applications: top-level containers, intermediate-level containers, and atomic components.
Top-level containers provide a place for other Swing components to display or paint
themselves, such as a main application window. Top-level containers cannot be placed
within another top-level container, and usually contain an intermediate container called a
content pane. Commonly used top-level containers are JFrame, JDialog, and JApplet.
Intermediate containers simplify the way you organize visual items within a top-level
container, and can contain other intermediate containers, and lower-level atomic
components. For example, a panel (sometimes called a pane) can be nested within another
panel. Common intermediate containers are: JPanel, JScrollPane, JSplitPane,
and JToolBar.

Oracle10g: Java Programming 14-10


Swing Containment Hierarchy (continued)
Atomic components are self-sufficient entities (or widgets) that are used to present
information to, or receive data from, the user. Common atomic components are JButton,
JLabel, and JTextField (as shown on the slide). Many atomic components exist for
text, combination boxes, check boxes, tables, and lists, to name a few.
Note: The slide shows the following containment hierarchy:
Frame (top-level container contains a …)
Panel (intermediate container, which contains …)
a Label
a TextField
a Button

Oracle10g: Java Programming 14-11


Top-Level Containers

• Swing provides JFrame, JDialog, or JApplet,


with changeable properties such as:
– A content pane for holding intermediate containers
or components, by using the getContentPane() or
setContentPane() methods
– A border, by using a setBorder() method
– A title, by using a setTitle() method
– Window decorations such as buttons for closing
and minimizing (excludes applets)
• AWT provides Frame, Dialog, or Applet
– These do not provide properties such as a content
pane or borders.

14-12 Copyright © 2004, Oracle. All rights reserved.

Top-Level Containers
Each Swing application has at least one top-level container or frame. The top-level container
can be an instance of JFrame, JDialog, or JApplet. It is easy to customize the top-
level content pane to add a border or set the layout manager. However, using the top-level
content pane methods is tricky. The methods of the top-level containers return a
Container object, not a JComponent object. This means that you must typecast the
return value of the methods in order to use them.
An easier way to achieve the same results is to create your own content pane, typically by
using a JPanel object. You then call the JFrame setContentPane() method to set
the top-level content pane to be your customized JPanel. You now have complete control
of the content pane without the restrictions of the top-level or root container.

Oracle10g: Java Programming 14-12


Top-Level Containers (continued)
The following example creates a top-level container by using a JFrame object, and an
intermediate container as a JPanel. After customizing the panel by changing its layout
manager and applying a border, the top-level container’s content pane is modified to use the
panel by calling the setContentPane() method:
JFrame topLevelContainer = new JFrame();
JPanel myContentPane = new JPanel();
myContentPane.setLayout(new BorderLayout());
myContentPane.setBorder(new
LineBorder(Color.lightGray,0));
topLevelContainer.setContentPane(myContentPane); // or
topLevelContainer.getContentPane().add(myContentPane);

Oracle10g: Java Programming 14-13


Intermediate Containers

• Designed to contain components (or containers):


Can be nested within other containers
• Types of intermediate containers:
– Panels for grouping containers or components
– Scroll Panes to add scroll bars around components
that can grow, such as a list or a text area
– Split Panes to display two components in a fixed
area, which is adjustable by the user
– Tabbed Panes for containing multiple components,
showing only one at a time, based on user selection
– Tool Bars for grouping components, such as
buttons
– Internal Frames for nested windows

14-14 Copyright © 2004, Oracle. All rights reserved.

Intermediate Containers
The next level of containers in Swing is designed for the sole purpose of containing other
components. These containers may hold any other Swing component including other
containers. By nesting intermediate containers within other containers, you can control the
layout of your application. This technique is described later in this lesson.
The intermediate containers are the following:
• Panels: These are the most frequently used intermediate containers. They are
implemented with the JPanel class. They are generally used to group components
for logical presentation to the user. A JPanel can use any layout manager; by default
it uses the FlowLayout, and you can set its border to any border.
• Scroll pane: These provide scroll bars around any large component or one that may
grow. They are implemented with JScrollPane.
• Split pane: This container is used to present two components in a fixed amount of
space while letting the user adjust the space that is devoted to each item. Split Pane is
implemented with JSplitPane.
• Tabbed pane: This container possesses multiple components but the user can see only
one at a time. The user can switch between the components by clicking on the visible
tabs. Tabs are implemented with JTabbedPane.
• Toolbar: In addition to holding multiple components, instances of JToolBar can be
repositioned by the user.
• Internal frame: Top-level containers can support internal windows or frames, which
are implemented by JInternalFrame and best used with a JDesktopPane.
Oracle10g: Java Programming 14-14
Atomic Components

• Buttons
• Check boxes
• Combo boxes
• Text
• Lists
• Labels

14-15 Copyright © 2004, Oracle. All rights reserved.

Atomic Components
Atomic components exist solely to present or accept information. They do not serve as
containers for other components. Atomic components inherit from JComponent and thus
support standard component features such as borders and tool tips.

Oracle10g: Java Programming 14-15


Layout Management Overview

14-16 Copyright © 2004, Oracle. All rights reserved.

Layout Management Overview


You can use layout managers to control the process of placing components onto a container
at run time. Each container has a layout manager by default. The layout manager ultimately
controls the layout and position of components within the container. However, each
component can provide hints about itself to assist the layout manager, such as its preferred
size and position.
Java provides many layout managers. The following five are commonly used:
• java.awt.BorderLayout, which is the default for JFrame containers, arranges
the container into five areas that are called North, South, East, West, and Center.
• java.awt.FlowLayout, which is the default for Jpanel organi es
items from left to right and then from
top to bottom The rows can be centered (default), right justified, or
left justified.
• java.awt.GridLayout arranges items in a grid in rows and columns with cells of
the same size.
• java.awt.GridBagLayout arranges items in a grid of rows and columns with
different cell sizes. This is the most flexible and complex of all the layout managers,
and it allows components to span multiple rows and column cells.
• javax.swing.BoxLayout arranges items in a stack horizontally or vertically.

Oracle10g: Java Programming 14-16


Layout Management Overview (continued)
You can set a container layout property to null forcing the container not to use any layout
manager with the rules described. In this case, absolute positioning, specific position, and
size in pixels control the UI component. Absolute positioning is inflexible to changes in the
shape of the top-level container at run time. However, it can be useful in design stages to
provide precise control over the placement and size of each component.

Oracle10g: Java Programming 14-17


Border Layout

• Has five areas: North, South, West, East, and


Center
• Has center area that expands to fill the available
space
• Displays only one component in each area
• Makes each area useful for holding intermediate
panels

14-18 Copyright © 2004, Oracle. All rights reserved.

Border Layout
Border layout provides five areas for components: north, south, east, west, and center. If the
user enlarges the window, then the center area expands to use as much of the space as
possible. The other areas expand only as much as necessary to fill the available space. For
example, if the user makes the frame wider, then the center will expand horizontally, but the
east and west areas will not; however, the south area will expand to fill the new window
size.
Each area will display only one component. To overcome this restriction and make Border a
useful layout manager, add containers to the areas instead of atomic components. Most
panels that use Border use only one or two of the areas, such as center and south. South may
be used for a toolbar or navigation, whereas center may contain a panel that will hold all the
atomic data components. This technique is useful in creating a resizable frame.

Oracle10g: Java Programming 14-18


GridBag Layout

• Is based on a grid
• Allows components to span multiple rows and
columns
• Allows rows and columns to differ in size
• Uses the component’s preferred size to control
cell size

14-19 Copyright © 2004, Oracle. All rights reserved.

GridBag Layout
GridBag layout is the most flexible and the most complex of the layout managers. The
flexibility comes from its ability to allow components to span multiple rows and columns. In
addition to spanning multiple columns and rows, the components can provide hints or
suggestions about how the component would like to appear. For instance, a component can
specify how much space to automatically set around the component, both inside and outside
of the component’s cell. You can also specify minimum, maximum, and preferred size for
each component.
Components can span multiple cells in both directions, row and column. The row and
column sizes are determined by the size of the components that occupy the row or column.

Oracle10g: Java Programming 14-19


GridBag Constraints

External insets

Component
Cell position padding

Cell span

Expansion
weighting Anchoring

Fill rules

14-20 Copyright © 2004, Oracle. All rights reserved.

GridBag Constraints
Each component in a GridBagLayout container has properties that you can set to control
the layout behavior for the component. You edit the constraints by selecting the component
and clicking constraints in the Properties Inspector window. Alternatively, you can right-
click the component and select constraints from the context menu.
Layout Constraints
• Cell position: The X and Y properties specify the grid cell for the upper left corner of
the component. The values are integers and represent the cell number in a row and
column.
• Cell Span: These properties specify how many columns (Width) and rows (Height) the
component occupies.
• External Insets: These values specify the amount of space between the component
and the edge of its display area. You can specify a value for the top, bottom, left, and
right.
• Component padding: These values specify the amount of space around a component
within a cell. The width of the component is calculated as the minimum width plus the
width property. The height is calculated as the minimum height plus the height
property.

Oracle10g: Java Programming 14-20


GridBag Constraints (continued)
Layout Constraints (continued)
• Expansion weighting: This specifies how extra space is distributed vertically (X) and
horizontally (Y). The range of values is 0 through 1.0. Weight determines what share
of the extra space is allocated to each component.
• Fill rules: These values specify what to do if the display area is larger than the
component.
• Anchoring: This indicates where to anchor the component if the component is smaller
than the display area.

Oracle10g: Java Programming 14-21


Using Layout Managers

• Layout managers are designed to manage multiple


components simultaneously.
• Using a layout manager with containers requires:
– Creating a container and a layout manager object
– Setting the layout property of the container
– Adding items (components or other containers) into
the regions that are defined by the layout manager
• Different layout managers require different
arguments to control component placement.

14-22 Copyright © 2004, Oracle. All rights reserved.

Using Layout Managers


These layout managers are designed to manage multiple components at once. The basic
steps to use a layout manager are shown on the slide. The examples on the slide show
creating a frame by using the javax.swing.JFrame class, to which you apply a
java.awt.BorderLayout manager.
First you create the layout manager object, then call the frames setLayout() method,
and start adding components or other containers into the regions that are provided by the
layout manager.
Create container and manager
JFrame myFrame = new JFrame();
BorderLayout layoutMgr = new BorderLayout();
Set properties
myFrame.setLayout(layoutMgr);
Add items
myFrame.add(new JButton(), BorderLayout.NORTH);
myFrame.add(new JTextField(), BorderLayout.SOUTH);
myFrame.add(new JPanel(), BorderLayout.CENTER);

Oracle10g: Java Programming 14-22


Using Layout Managers (continued)
Adding Components to Containers
When adding a component to a container, you must always consider the layout manager that
is used by the container. Each type of layout manager may require different arguments to
control the placements and/or size of component that is added. For example, when adding a
component to a container by using the BorderLayout manager, you are required to
specify the border area in which you want the component placed, such as North, South, and
so on. FlowLayout does not require a placement parameter, and just appends components
in the order that they are added to the container.
For most Swing code, such as the examples shown on the slide, you should import classes
from the following packages: javax.swing, java.awt, and java.awt.event.
Note: If you are using an IDE tool like JDeveloper, then you can set the layout property of a
container to null to force the absolute position to be used. This makes it very convenient
for you when designing and prototyping a user interface. Later, you can switch the layout
property to a suitable Java layout manager class for the application.

Oracle10g: Java Programming 14-23


Combining Layout Managers

Border

null

VerticalFlow

GridBag

Grid

14-24 Copyright © 2004, Oracle. All rights reserved.

Combining Layout Managers


Different layout managers are good at different tasks. Because you can place multiple panels
in a frame and each one may have a different layout manager, you have a lot of control over
the ultimate layout.
Nesting panels and layout managers is a common practice. In the example on the slide, you
use the Border, null, VerticalFlow, GridBag, and Grid layout managers.
The top-level frame uses Border, which allows you to specify what nested panels go in the
north, south, east, and west areas. The top panel uses null, which allows you to place the
components where you want them to be displayed.
The RentalID panel uses VerticalFlow, which displays the items that are stacked vertically.
You use GridBag in the Rental panel (east) so that you can align components of differing
sizes. Lastly, you use Grid in the bottom panel, which contains only one component.
Using a combination of these layout managers offers very fine control over the layout of
your application. You can create a form that is resizable without losing its general look and
feel.
Instructor Note
Due to differences in the way various platforms calculate x, y coordinates, the null layout
works well in Windows NT, but does not translate well to other platforms. To ensure that
your layout is neatly laid out on other displays, do not leave any containers in null layout in
your final design.
Oracle10g: Java Programming 14-24
Using Frames or Dialogs

A Java frame is equivalent to an application window.


• Use the JFrame for a main window
– It has properties for icons, title, window decorations
for minimize, maximize, and close buttons.
– It uses BorderLayout by default.
– It provides a default content pane that occupies the
center region of the layout.
– You can set the frame size with the setSize()
method, and make it visible by using the
setVisible() method.
• Use JDialog for a modal window
– You must dismiss a modal window before the
application that invokes it can become active.

14-25 Copyright © 2004, Oracle. All rights reserved.

Using Java Frame Classes


The Java frame is analogous to a top-level application window. These windows contain all
the frills and dressings that are provided by the operating system to manage the window,
such as a bar containing title string, an icon, and the minimize, maximize, and close buttons.
These windows are also resizable unless you programmatically disable this feature.
When you create a Java JFrame object, you automatically get a content pane that provides
the container for the window objects or components. As stated in a previous slide, you
typically replace the content pane with an intermediate component like a JPanel, to
simplify management of the visual contents of the container.
The JFrame uses a BorderLayout manager by default, where default content pane is
located in the center region. You can alter the frame to have a menu and/or a toolbar, to be
commonly placed in the north region, and a status bar that would typically be placed in the
south.
JDialog classes can be modal, or nonmodal. They tend to be modal in nature. It is more
common to create dialogs by using the JOptionPane class methods, such as the
showMessageDialog() among others therwise you
can use the JDialog class to create custom
dialog boxes
Note: On the next page, there is an example of a simple frame application, with a default
content pane, but no intermediate containers or components.
Oracle10g: Java Programming 14-25
Creating a Simple Frame Application
This example shows how to build a Java GUI application by using the JFrame class. The
code example illustrates the points that are discussed on the slide of the previous page.
import java.awt.Color;
import javax.swing.JFrame;
public class MyFrame extends JFrame
{
public MyFrame()
{
setDefaultCloseOperation(EXIT_ON_CLOSE);
getContentPane().setBackground(Color.blue);
setTitle("Default Frame Title");
setLocation(50, 50);
setSize(600, 400);
}

public static void main(String[] args)


{
JFrame f = new MyFrame();
f.setResizable(true);
f.setVisible(true);
}
}

Note
• By default the JFrame default operation on a close event is to hide the window. The
call to setDefaultCloseOperation(EXIT_ON_CLOSE) changes the default
operation that is performed by the JVM when the window is closed. The
EXIT_ON_CLOSE constant is defined in javax.swing.WindowConstants,
which is an interface implemented by JFrame.
• The getContentPane() method is used to access the frame’s default container and
change the background color to blue.
• The setLocation() determines the top left x and y coordinates (in pixels) of the
window relative to the top left corner of the screen.
• The setSize() method sets the width and height of the window (in pixels).
• The setLocation() and setSize() can be done in one step by calling
setBounds(x, y, width, height)
• The example shows how you can set properties of the frame in the constructor, or by
using a reference to the frame (as shown in the main() method).

Oracle10g: Java Programming 14-26


Using JPanel Containers

JPanel is a general purpose container.


• Can use any layout manager
(uses Flowlayout by default)
• Can use any border
• Can have added components
or other panels/containers
by using the add() method

JPanel myPanel = new JPanel(new BorderLayout());


JTextArea jTextArea1 = new JTextArea();
myPanel.setBorder(BorderFactory.createRaisedBevelBorder());
myPanel.add(jTextArea1, BorderLayout.SOUTH);

14-27 Copyright © 2004, Oracle. All rights reserved.

Using JPanel Containers


JPanel is a general purpose container that is designed to hold other components. You can
use JPanel containers to group components within an area of an application. You may add
a border to the panel to help visually separate the components from other components in the
application.
Setting the Layout Manager
The default layout manager for JPanel is FlowLayout, which places all the components
within the container in a row. You can make the panel use another layout manager by calling
the setLayout() method or by specifying the layout manager when you create the panel.
For example:
JPanel myPanel = new JPanel();
myPanel.setLayout(new BorderLayout());
or
JPanel myPanel = new JPanel(new BorderLayout());

Oracle10g: Java Programming 14-27


Using JPanel Containers (continued)
Adding Components
You can add components to the panel by using the add() method. The arguments that are
provided to the add() method depend on which layout manager is used by the panel. For
example, FlowLayout, GridLayout, and GridBagLayout typically accept one
argument. If the layout manager is BorderLayout, then additional arguments are used to
specify the position of the contained components.
For example:
myPanel.add(button); // if FlowLayout
myPanel.add(button, BorderLayout.NORTH); // if BorderLayout
myFrame.getContentPane().add(myPanel); // add to a frame

Oracle10g: Java Programming 14-28


Adding Borders to Components

• Borders are Swing objects.


– Defined in javax.swing.borders
• Use setBorder() to assign a
border to a component.
• Create borders with the class called
javax.swing.BorderFactory.
• Create borders separately to use with many
components.
jPanel1.setBorder(BorderFactory.createBevelBorder(
BevelBorder.LOWERED,Color.lightGray,Color.darkGray));
Border etchedBorder =
BorderFactory.createEtchedBorder();//pre-create border
jPanel2.setBorder(etchedBorder); // use border`

14-29 Copyright © 2004, Oracle. All rights reserved.

Adding Borders to Components


Any JComponent object or subclass may have one or more borders. To place a border
around a component, use its setBorder() method.
Because borders are objects, they must be created. You create a border by using the
BorderFactory class. You can include the border object creation in the call to
setBorder(), or you can create the border object with a separate line of code. If you use
the same border style for multiple components, then it would be easier and more consistent
to create one border object for each style needed. The following code illustrates the
technique for creating reusable Border objects:
import javax.swing.BorderFactory;
import javax.swing.border.*;

Border etchedBorder = BorderFactory.createEtchedBorder();


Border raisedBorder = BorderFactory.createRaisedBevelBorder();
jPanel1.setBorder(raisedBorder);
jPanel2.setBorder(etchedBorder);

Oracle10g: Java Programming 14-29


Using Internal Frames

An internal frame is the equivalent of a document


window that is contained within an application window
for multiple-document interface (MDI) window
applications.
• Use JInternalFrame for an internal window:
– Similar to JFrame, it can contain intermediate
containers and components and use a layout
manager.
– By default it is not “closable,” “iconifiable,”
“maximizable,” or visible.
• Use a JDesktopPane as the content pane in which
the internal frames are added:
– Controls the size and placement of internal frames
– Uses a null layout manager by default

14-30 Copyright © 2004, Oracle. All rights reserved.

Using Java Internal Frames


The Swing API also provides an internal frame, which is implemented by the
JInternalFrame class. An internal frame creates a window within another window that
you can use to build an application that conforms to the popular multiple document interface
(MDI) model of the Windows platform.
When using a JInternalFrame, the JDesktopPane class is provided as a container to
manage the size and placement of the internal frames within the containing window.
Therefore, you would normally create a JDesktopPane object to replace the existing
frame’s default content pane. The internal frames are then added to the desktop pane.
Like a JFrame, the JInternalFrame has a window title bar, with a title, icon, and
window decorations such as maximize, “iconify,” and close buttons, which by default are
disabled. The internal frames can be dragged over each other, and an internal frame provides
methods to control whether it is on top and selected, and so on. For example:
setResizable(boolean), setIconifiable(boolean)
setMaximizable(boolean), setVisible(boolean)
toFront(), toBack()
The desktop pane provides methods to obtain an array of internal frame objects that have
been added to its container; for example:
getAllFrames() returns an array of JInternalFrame objects.
getSelecedFrame() returns the currently selected JInternalFrame.
Note: Most getXXX() methods have a corresponding setXXX() method.
Oracle10g: Java Programming 14-30
Creating a Multiple Document Interface (MDI) Application
This code example uses a JFrame as the main MDI application window, whose default
content pane is replaced with a JDesktopPane object. Two JInternalFrame objects
are then added to the main application window desktop pane.
import java.awt.Color;
import javax.swing.JFrame;
import javax.swing.JInternalFrame;
import javax.swing.JDesktopPane;

public class MdiFrame extends JFrame {


public MdiFrame() {
setDefaultCloseOperation(EXIT_ON_CLOSE);
setTitle("MDI Frame Example");
setBounds(50, 50, 600, 400);
}
public static void main(String[] args) {
JFrame f = new MdiFrame();
JDesktopPane desktop = new JDesktopPane();
JInternalFrame iFrame1 =
new MyInternalFrame("Internal 1", Color.red);
JInternalFrame iFrame2 =
new MyInternalFrame("Internal 2", Color.green);
f.setResizable(true);
f.setVisible(true);
f.setContentPane(desktop);
iFrame1.setBounds(10, 20, 350, 200);
iFrame2.setBounds(60, 70, 350, 200);
desktop.add(iFrame1);
desktop.add(iFrame2);
iFrame2.toFront(); //only after frames are added
}
}
class MyInternalFrame extends JInternalFrame {
public MyInternalFrame(String name, Color c) {
super(name); setBackground(c);
setResizable(true); setMaximizable(true);
setIconifiable(true); setClosable(true);
setVisible(true);
}
}
Note
The text in boldface highlights some of the important parts of the code, such as:
• Creation of the desktop pane (line 14), and internal frame objects (from line 16 through
18)
• Replacing MdiFrame default content pane with the desktop pane (line 21)
• Adding the internal frames into the desktop frame (lines 24 and 25)
• Making the second internal frame the front/top internal frame (line 26)
• Making the internal frames visible (line 34)

Oracle10g: Java Programming 14-31


Swing Text Controls

14-32 Copyright © 2004, Oracle. All rights reserved.

Swing Text Controls


Swing provides five text components (along with supporting classes and interfaces) that
meet even the most complex text requirements. All of Swing’s text components inherit from
JTextComponent.
Text Fields
Also known as text controls, text fields can display and edit only one line of text and are
action-based, like buttons. Use them to get a small amount of textual information from the
user and take some action after all the text has been entered. The text fields are
JTextField and JPasswordField.
Plain Text Areas
JTextArea can display and edit multiple lines of text. This field is useful when you want
the user to enter text of any length or to display large amounts of unformatted text.
JTextArea can display text in any font; however, all of the text displayed must be in the
same font.
Styled Text Areas
Styled text components can display and edit text using more than one font. These
components can display text that is stored in different formats such as HTML and Rich Text
Format (RTF). They also support images and some support buttons and other controls. The
styled text components are JEditorPane and JTextPane.
Oracle10g: Java Programming 14-32
Adding Components
with Oracle JDeveloper 10g

• Use the wizard to create a JFrame.


• Select a layout manager.
• Add components from the Component Palette.
• Fine-tune component properties.

14-33 Copyright © 2004, Oracle. All rights reserved.

Adding Components with JDeveloper


Adding components to an application is a straightforward process with Oracle JDeveloper.
You can use the Frame Wizard to create an empty frame and then add the components that
you want. The components can be Swing containers or Swing atomic components, such as
text fields, buttons, check boxes, and so on. After you add the components, you can fine-
tune the components by using the Properties Inspector or by adding or changing the code in
the Code Editor window.

Oracle10g: Java Programming 14-33


Creating a Frame

Frame

14-34 Copyright © 2004, Oracle. All rights reserved.

Creating a Frame
To create a new JFrame, select File > New from the JDeveloper menu. Expand the Client
Tier, then select the SWING/AWT node. Look for the Frame item in the Items list. In the
Frame Builder Wizard, change the name of the class and the frame title to something
meaningful. Select javax.swing.JFrame as the base class. You can ask the wizard to
create a menu bar, status bar, toolbar, and about box. These are all optional attributes.
You can use the wizard to specify the preferred superclass for the new frame. JDeveloper
will generate a class with the required import statements and the code that is necessary to
create a usable frame. Now you can use the JDeveloper UI Editor to construct the
application UI structure visually.

Oracle10g: Java Programming 14-34


Adding Components

Use the Component Palette to add


Swing items to the Frame

14-35 Copyright © 2004, Oracle. All rights reserved.

Adding Components
The JFrame that is created by the Frame Builder Wizard includes the frame and an
intermediate JPanel container. The wizard does not set the layout manager for the
generated JPanel. It uses the default layout manager for its type of container
(FlowLayout).
Because it is a default layout manager, JDeveloper cannot provide the ability to alter the
properties of the layout manager. It is best to change the layout manager so that you can
manipulate the layout properties.
After setting the layout manager, you can then add components by selecting them from the
Swing component toolbar and dragging an area onto the JPanel in the Design window.
Alternatively, you can click the component and then click JPanel in the Component pane of
the structure window. If you choose the latter, then JDeveloper uses default sizes for
components. In either case, the layout manager affects the final location of the component.

Oracle10g: Java Programming 14-35


Adding Components (continued)
To invoke the UI Editor, in the navigator select a class, right-click, and choose UI Editor.
In general, add components to the structure window instead of directly to the panel. This
approach is best if you want to avoid adding a component to the wrong panel by accident.
For instance, adding components to a JTabbedPane inside a panel can be done in an
easier manner by using the structure pane.
When visually adding a component into a frame/panel with JDeveloper, it generates code to:
• Declare and instantiate the selected component object
• Set minimal properties for the default state
• Add the component into the chosen container

Oracle10g: Java Programming 14-36


Setting Pluggable Look and Feel

Swing applications provide support for a different look


and feel to adapt to the visual environment of the
operating system. The look and feel:
• Is application-specific:
– Can be initialized when the application starts
– Can change dynamically
• Affects lightweight Swing components
• Supports Win, Mac, Java (Metal) and Motif
• Uses javax.swing.UIManager class
– Provides the setLookAndFeel() method, which
accepts a look and feel class name string.

14-37 Copyright © 2004, Oracle. All rights reserved.

Pluggable Look and Feel (plaf)


Java provides a set of classes in the javax.swing.plaf package and subpackages that
assist to render components in a platform-specific manner. The default Java look and feel is
known by its code name “Metal,” which is the name of the project that was assigned to a
team at Sun Microsystems, Inc., to create a unique and distinctive look and feel for Swing
1.0 (JFC 1.1).
Setting UI Look and Feel
Use the javax.swing.UIManager class to initialize, or dynamically change the look
and feel of your application. For example, in the main() method of your frame application,
you can add the following code:
try { UIManager.setLookAndFeel(
UIManager.getSystemLookAndFeelClassName());
} catch (Exception e) { }

Oracle10g: Java Programming 14-37


Setting UI Look and Feel (continued)
he value that is returned by
getSystemLookAndFeelClassName() is a string
representing a fully qualified class
name that implements the look and feel
of the current platform he class name
string is provided as the parameter to
UIManager.setLookAndFeel(). Some possible values for the class names of
different platforms are:
javax.swing.plaf.metal.MetalLookAndFeel
com.sun.java.swing.plaf.windows.WindowsLookAndFeel
com.sun.java.swing.plaf.motif.MotifLookAndFeel
Note: If you want to change the look and feel dynamically, then you can call the
SwingUtilities.updateComponentTreeUI(getContent Pane())method.
This method will make the existing components reflect the new look and feel.

Oracle10g: Java Programming 14-38


Summary

In this lesson, you should have learned the following:


• Frames are top-level containers.
• Panels are intermediate containers that can be
nested.
• Each container can have its own layout manager.
• Layout managers control component placement.
• You can combine layout managers within an
application.
• You can control the application’s look and feel.

14-39 Copyright © 2004, Oracle. All rights reserved.

Oracle10g: Java Programming 14-39


Practice 14: Overview

This practice covers:


• Creating a class based on JFrame for the main
window of the OrderEntry application.
– Add a default menu and status bar.
– Add a JDesktopPane and set it as the content pane.
• Creating a class based on JInternalFrame to
manage order creation and data entry.
– Create the container layout hierarchical structure
for the order-entry frame components.
– Add some of the components to this frame.
• Setting layout managers for each container

14-40 Copyright © 2004, Oracle. All rights reserved.

Practice 14: Overview


Note: If you have successfully completed the previous practice, then continue using the
same directory and files. If the compilation from the previous practice was unsuccessful and
you would like to move on to this practice, then change to the les13 directory, load up the
OrderEntryWorkspaceLes13 workspace, and continue with this practice.
Viewing the model: To view the course application model up to this practice, load the
OrderEntryWorkspaceLes13 workspace. In the Applications – Navigator node,
expand the OrderEntryWorkspaceLes13 – OrderEntryProjectLes13 -
Application Sources – oe, and double-click the UML Class Diagram1 entry.
This diagram displays all the classes created to this point in the course.

Oracle10g: Java Programming 14-40


Practice 14: User Interface Design: Swing Basics Planning the Application
Layout
Goal
The goal of this practice is to use JDeveloper to create the main application frame as an MDI
window, and the internal order frames that will be contained within the main window. These
frames will serve as a way to explore Swing classes and ways of building GUI applications.
Note: If you have successfully completed the previous practice, then continue using the
same directory and files. If the compilation from the previous practice was unsuccessful and
you would like to move on to this practice, then change to the les13 directory, load up the
OrderEntryWorkspaceLes13 workspace, and continue with this practice.
Your Assignment
Create the main window as an extension of the JFrame class. This class will contain a
JDesktopPane object to manage the internal frame layout. You will also create a class
based on the JInternalFrame class in which the customer and order details will be
entered via atomic Swing components. The components layout will be managed through the
use of panels and associated layout managers. You use the JDeveloper Frame Wizard to
create a basic menu for the application, and a status bar in the main application window.
Create the Main Application Window
1. In OrderEntryProject, create a new subclass of the JFrame class.
a. Right-click the project name in the navigator, and select New… from the context
menu. Select the Frame item from Client tier > Swing/AWT category, and click
the OK button.
b. In the Create Frame dialog box, enter the class name OrderEntryMDIFrame,
and extend javax.swing.JFrame. In the Optional Attributes section, set the
Title field to: Order Entry Application, and select only the Menu Bar
and Status Bar check boxes. Then click the OK button.
c. Examine the code for the new class that is generated by JDeveloper by selecting
the Source tab. You will notice that JDeveloper creates a jbInit() method
that is called from the default no-arg constructor. The jbInit() method should
contain all code to initialize the user interface structure. You should modify the
code if required, to match with the one displayed.
d. In the Editor window, select the Design tab, and examine the visual container
hierarchy and presentation of the frame. The container hierarchy is visible in the
JDeveloper Structure pane (located under the Navigator pane).
e. Return to the Code Editor for the class by selecting the Source tab
and make the following changes:
Replace the JPanel panelCenter variable declaration, with:
JDesktopPane desktopPane = new JDesktopPane();
Note: Remember to import javax.swing.JDesktopPane.
In the jbInit() method, replace panelCenter references with
desktopPane.
f. Compile and save the OrderEntryMDIFrame class.
g. Modify OrderEntry.java by renaming the main() method to
test1(…)
reate a new public static void main(String[]
args) method which creates an instance of the
OrderEntryMDIFrame and makes it visible.
Oracle10g: Java Programming 14-41
Practice 14: User Interface Design: Swing Basics Planning the Application
Layout (continued)
h. Compile, save, and run the OrderEntry application.
Create the JInternalFrame Class for Order Data
This frame will contain the bulk of the UI code for data entry and user interaction for an
order, and assigning a customer and adding items to the order.
2. Right-click the OrderEntryProject and select New… from the context menu.
a. Navigate to the Client Tier > Swing/AWT node and select the Frame item. In the
New FrameWizard, enter the class name OrderEntryFrame, and extend the
javax.swing.JInternalFrame. Set the title to the text Order.Then
click the OK button.
Note: The JInternalFrame class can be selected by clicking the Browse
button.
b. The OrderEntryFrame that is generated does not have the desired layout
manager or content pane. To set the layout manager, and add a panel to the
content pane, open OrderEntryFrame with the UI Editor.
Note: When the UI Editor is activated (UI Editor can be invoked by clicking the
Design tab), the Property Inspector window is also displayed, showing the
properties of the object that is selected in the UI Editor.
c. Select the internal frame object by clicking the frame title bar in the UI Editor or
the node labeled this in the structure window. (You may have to expand the UI
node to view objects in the containment hierarchy.) In the Inspector pane, locate
the layout property and select BorderLayout from the pop-up list options.
d. Which lines of code has JDeveloper added or changed in your class? When
creating a Swing UI by using the JDeveloper UI Editor, it is wise to view
changes that are made to the source code as an aid to learning what you would
need to write yourself if you are building the UI manually. Remove the
private declaration from the BorderLayout.
e. JDeveloper provides a Component Palette in the toolbar (ask the instructor, if
needed). In the palette, choose Swing Containers from the pop-up list.
Click the JPanel icon, and then click the center of the frame in the UI Editor (or
click the node labeled this in the UI Structure pane) to add a new panel to the
center region of the border layout.
If the JPanel icon is not visible, they have to expand the Component Palette
window by increasing the height.
Note: Confirm that the panel is in the center by selecting the JPanel object
added and checking that its constraints property (in the Inspector) has the
value Center. If not, then set it to Center.
3. The panel was added to the frame’s content pane, and will be used to lay out the rest of
the application UI objects. The panel will be divided into two areas: a top (for order
and customer data), and a bottom (for order item data). Divide the panel into two by
using a GridLayout for the layout, with one column and two rows:
a. Select jPanel1, and set its layout manager property to GridLayout.
b. Expand jPanel1 in the UI Structure pane, select the gridLayout1 object,
set the columns property to 1 and press the Enter key, set the rows property
to 2, and then press Enter.
Oracle10g: Java Programming 14-42
Practice 14: User Interface Design: Swing Basics Planning the Application
Layout (continued)
Using the following picture as a visual guide to the desired results for the layout of
these containers, add another panel to the top, and a scroll pane to the bottom
of the content panel.

c. Add a second panel to the top half (or first row) of the first panel, by clicking the
JPanel icon in the Swing Components palette, and then clicking the jPanel1
object in the UI Editor, or in the Structure pane.
Note: Confirm that the new panel is called jPanel2, and more importantly,
that it is nested inside jPanel1 in the hierarchy.
d. Add a raised-bevel border to the new panel, called jPanel2, by selecting its
border property in the Inspector, and select Swing Border… from the pop-up
list. In the Border dialog box, choose BevelBorder and select the RAISED
option button, then click the OK button.
Note: jPanel2 should visually occupy the top half of the jPanel1.
e. Add a scroll pane object to the bottom half (second row) of the jPanel1, by
clicking the JScrollPane icon in the Swing Components palette, and click the
bottom area of the jPanel1. (Alternatively, click the jPanel1 object in the
Structure pane to add the JScrollPane.)
f. Use the Structure pane to check whether you have the following containment
hierarchy:

g. Save your OrderEntryFrame class. Then compile the class.

Oracle10g: Java Programming 14-43


Practice 14: User Interface Design: Swing Basics Planning the Application
Layout (continued)
Modify OrderEntryMDIFrame Class to Contain an Internal OrderEntryFrame
4. To view the visual results of your internal frame at run time modify the constructor in
OrderEntryMDIFrame to create an instance of OrderEntryFrame, and make it
visible.
a. Edit OrderEntryMDIFrame.java, and at the end of the constructor add the
following lines of code:
OrderEntryFrame iFrame = new OrderEntryFrame();
iFrame.setVisible(true);
desktopPane.add(iFrame);
Note: The bounds (size and location) of the internal frame must now
be set, otherwise it will not become visible. In addition, you must also alter the
dimensions of OrderEntryMDIFrame to be larger than the initial size of the
internal frame OrderEntryFrame.
b. In the jbInit() method of the OrderEntryMDIFrame class, locate the
following statement:
this.setSize(new Dimension(400,300));
Then modify the dimension arguments to be 700,500.
c. In the OrderEntryFrame, add the following line into the jbInit()
method:
this.setBounds(0, 0, 400, 300);
d. Compile and save OrderEntryMDIFrame and OrderEntryFrame.
e. Run the OrderEntry class to view the results.
5. You will notice that the internal frame cannot be maximized, “iconified” (minimized),
or closed. Make changes to OrderEntryFrame to enable these features.
a. In the jbInit() method, add the following lines of code to enable the internal
frame to maximized, “iconified,” and closed.
this.setMaximizable(true);
this.setIconifiable(true);
this.setClosable(true);
b. Compile and save the changes to OrderEntryFrame.java.
c. Run the OrderEntry application, and observe the changes.
Add UI Components to OrderEntryFrame
6. Before adding UI components to jPanel2 in OrderEntryFrame, set its layout to
null.
Note: You could also use the JDeveloper XYLayout.
In either case, JDeveloper will use absolute positioning and sizing for components that
are added to the panel. It is easier to use absolute positioning when building the initial
UI layout. You will change the layout again in a subsequent lesson.
Use the following image as a guide to the desired results:

Oracle10g: Java Programming 14-44


Practice 14: User Interface Design: Swing Basics Planning the Application
Layout (continued)

a. In the Design mode, select the Swing option in the Component Palette pop-up
list. Then add a Jlabel to jPanel2 and set its text property to Order Id.
Resize the label to see the label value, if needed. What lines of code have been
added to your class?
Hint: You should find at least five lines of code (some of them in the
jbInit() method). Try to identify the three that make the object visible in the
panel.
Note: The setBounds value can be modified if required in the source to make
the label clearly visible.
b. From Swing icons, select and add a JTextField component into jPanel2, to
the right of the label, then delete the default value in the text property of the
text field (remember to press the Enter key after deleting the text value).
Note: setBounds values can be changed if required.
c. Compile and save OrderEntryFrame, and run OrderEntry to view the
results.

Oracle10g: Java Programming 14-45


Adding User Interface Components
and Event Handling

Copyright © 2004, Oracle. All rights reserved.

Schedule: Timing Topic


50 minutes Lecture
70 minutes Practice (total for both mid lesson and end of lesson)
120 minutes Total
Objectives

After completing this lesson, you should be able to do


the following:
• Add Swing components to an application
• Get and modify the contents of the components
• Provide event handlers for common types of
events
• Create a menu bar

15-2 Copyright © 2004, Oracle. All rights reserved.

Lesson Aim
This lesson shows how to provide a Java applet (or application) with a graphical user
interface based on components, such as buttons and text fields. You learn how to use
standard Java Swing components as well as the more sophisticated controls provided by
JDeveloper. You also learn how to provide event handler methods, to deal with events such
as button clicks and text changes.
Instructor Note
Further reading: The Java tutorial has a very good section on the Swing components:
http://java.sun.com/docs/books/tutorial/

Oracle10g: Java Programming 15-2


Swing Components

• Text controls
– JTextField
– JPasswordField
– JTextArea
– JEditorPane
– JTextPane
• Graphic controls
– JTree
– JTable
– JToggleButton

15-3 Copyright © 2004, Oracle. All rights reserved.

Swing Components
Swing text components display text and can optionally allow the user to edit text. There are
five different text components that support the varying complexities and requirements. They
are:
• JTextField: Can display and edit only one line of text at a time
• JPasswordField: A subclass of JTextField (It works the same as
JTextField except that the input is hidden from the user.)
• JTextArea: Can display and edit multiple lines of text (This component is used to
allow the user to enter text of any length. It can display text in any font.)
• JEditorPane: Allows the use of more sophisticated text styles including multiple
fonts and embedded images (JEditorPane can read and write plain text, HTML,
and RTF text.)
• JTextPane: In addition to the facilities that are provided by JEditorPane, it
allows embedded components.

Oracle10g: Java Programming 15-3


Swing Components (continued)
Graphic components
• JTree: A control that displays a set of hierarchical data as a tree diagram
• JTable: A component that displays data in a two-dimensional table format
• JToggleButton: Toggle buttons are similar to JCheckBox. When they are
pushed (set to true), they remain true until they are programmatically set to
false.
The Swing Containers Toolbar
The Swing Containers toolbar holds components that are intended to contain other
components.

Oracle10g: Java Programming 15-4


Swing Components in JDeveloper

Use the Swing Component Palette to add items.

15-5 Copyright © 2004, Oracle. All rights reserved.

Swing Components in JDeveloper


The main window contains the Component Palette, which holds all the graphical and
nongraphical controls that are available. The Swing Control Category contains the Swing
components. Here is a brief summary:
• JButton: A push button
• JCheckBox: A check box that can be selected or cleared
• JComboBox: A combination of text field and drop-down list
• JEditorPane: A styled text area that can display text in different formats including
RTF and HTML
• JLabel: A short text string or an image that cannot be selected
• JList: A list of items that the user can select from
• JPasswordField: A text field that displays a character such as an asterisk (*)
instead of showing what the user enters
• JProgressBar: A graphic display showing how much of a task is completed
• JRadioButton: One of a group of option buttons
• JScrollBar: A horizontal or vertical scroll bar
• JSeparator: A component that draws a straight line
• JSlider: A component that the user can use to select a value by sliding a knob

Oracle10g: Java Programming 15-5


Swing Components in JDeveloper (continued)
• JTextArea: A multiline text field
• JTextField: A single-line text field
• JTextPane: A styled text area that you can use to define your own text formats
• JTree: A control that displays a set of hierarchical data as a tree diagram
• JTable: A component that displays data in a two-dimensional table format
• JToggleButton: Toggle buttons are similar to JCheckBox. When they are pushed
(set to true), they remain true until they are programmatically set to false.

Oracle10g: Java Programming 15-6


Invoking the UI Editor

Right-click and select Open from the Context menu.

Code Editor
System Navigator
Context menu

15-7 Copyright © 2004, Oracle. All rights reserved.

UI Editor
You can invoke the Context menu by right-clicking the class in the Application Navigator
and selecting Open to view the class. The class will be displayed in the Code Editor. On the
bottom of the pane, there will be three tabs: Source, Class, and Design. Clicking the Design
tab will display the class using the UI Editor.

Oracle10g: Java Programming 15-7


How to Add a Component to a Form
1: Open the Component
Palette; select the Swing
category.

2: Drag the component to the form. The


class updates automatically.

15-8 Copyright © 2004, Oracle. All rights reserved.

Adding Components to the Structure Pane


Note that you can add components to the structure window instead of directly to the panel.
This approach is best if you want to avoid adding a component to the wrong panel by
accident, particularly in cases when the panel regions are not perceptually visible in the UI
Editor. Make sure that you drag the component to its container in the structure window. For
instance, adding components to a JTabbedPane inside a panel is easily done by using the
structure window.
Changes JDeveloper Makes to the Source Code when Adding Components
If you examine the source code changes before, and again after you add a component, then
you will notice that JDeveloper makes the following changes to the class that is being
edited:
• Adds an import statement for the component’s class (if not already present)
• Creates an instance variable by using the component class name as the type, and a
default instance variable name (by using default/package level access)
• Adds lines to the jbInit() method in order to set the default properties for the
component, such as the initial text value of a JTextField. In addition, a code line is
generated to add the component into its container.

Oracle10g: Java Programming 15-8


Edit the Properties of a Component

Change property values


in the Inspector.

15-9 Copyright © 2004, Oracle. All rights reserved.

Editing the Properties of a Component


Select a Swing component, and in the JDeveloper menu navigate to View > Property
Inspector to view the component’s properties.
Changes that are made to the properties of a component modify the source code to reflect
the changes that are made in the Inspector window.
Note: When changing a textual field that requires you to enter the value, press the Enter key
to accept the change that is made.

Oracle10g: Java Programming 15-9


Code Generated by JDeveloper

For example: Adding a JButton to a Jframe:


import javax.swing.JButton;
public class JFrame1 extends JFrame {
JButton jButton1 = new JButton();
...
public void jbInit() throws Exception {
...
jbutton1.setText("jButton1");
...
this.getContentPane().add(jButton1,
new XYConstraints(21, 20, 118, 48));
}

15-10 Copyright © 2004, Oracle. All rights reserved.

Generated Code
Whenever you modify a UI in JDeveloper, it automatically updates the source code for that
class in order to achieve the design that you have just specified. In fact, the source code is all
that matters; the Designer tool is just an easy way to generate the source code that is
required to achieve a certain visual appearance.
Instance Variables and Their Names
Each time you add a component to the UI, JDeveloper adds a corresponding instance
variable to your class. By default, the instance variable is assigned a default name based on
the class name and number, for example, jButton1 (as shown on the slide). To give the
variable a more meaningful name, change its name property in the Inspector, to replace all
usages of the name in the class. If you change the variable name manually in the source
code, then you must remember to replace all occurrences of the variable in the class.
The code lines that are generated in the jbInit() method to initialize the component and
add it to its container will vary based on the type of layout manager that is used by the
container. On the slide, the second parameter to the add() method on the content pane uses
the XYConstraints object because the container layout manager is XYLayout.

Oracle10g: Java Programming 15-10


Generated Code (continued)
Methods That Set Properties
JDeveloper calls a method to set each property that you edited in the Property Inspector. In the
example, you changed the button’s text to Find and changed the font of the button’s text to 16
point. The two methods that are called are setText() and setFont():
jButton1.setText("Find");
jButton1.setFont(new Font("Dialog", 1, 16));
Component Objects Added to the Container
The jbInit() method adds each component object to the container:
this.getContentPane().add(jButton1,
new XYConstraints(21, 20, 118, 48));
Parameters for the XYConstraints constructor:
new XYConstraints(X, Y, width, height);
where X and Y are the coordinates of the component relative to the upper left-hand corner of its
container.

Oracle10g: Java Programming 15-11


Creating a Menu

• Select “Create Menu Bar” during application


creation.
• Add a JMenuBar from the Component Palette.
• JDeveloper creates:
– JMenuBar for visual container for menus
– JMenu, which represents a menu of items, added to
a menu bar
– JMenuItems, which are placed in a JMenu
• Each JMenuItem supports events, interfaces, and
handler methods in the same way as with other
Swing UI components.
• A JMenuBar can be added to any top-level
container, such as Frames, Dialogs, or Applets.

15-12 Copyright © 2004, Oracle. All rights reserved.

Creating a Menu Manually


Follow these steps to create a menu bar manually with a single menu and single item:
1. Create a JMenuBar object.
2. Create a JMenu object.
3. Create a JMenuItem object.
4. Add the menu item to the JMenu.
5. Add the JMenu to the JMenuBar.
Adding a Menu Bar to a Container
Finally, associate the JMenuBar with the Frame, Dialog, or Applet by calling its
setJMenuBar() method. Write menu event handling code for the JMenuItem by
registering the appropriate event listeners, or using the Swing Action objects.

Oracle10g: Java Programming 15-12


Using JDeveloper Menu Editor

• In the JDeveloper Menu Editor, use the Structure


pane:
– Expand the Menu node.
– Click the menu bar object for a visual
representation.
– Right-click menu or menu items to alter
structure from the Context menu options.

Context menu
when
right-clicking a
Click
menu item
menu bar
object in
Structure pane
to display
menu bar

15-13 Copyright © 2004, Oracle. All rights reserved.

Using the Menu Editor in JDeveloper


In the UI Editor, the menu bar can be altered by adding, deleting, and moving components.
To Add a Menu or Menu Item
You can right-click a menu component to add another menu to the menu bar, as shown on
the slide screenshot.
If you right-click a menu item, then you can use the context menu selection to:
• Add another menu item
• Add a separator
• Add a submenu
• Mark a menu item as a check box menu item
• Disable the menu item
To Delete Menu Components
Press the Delete key after selecting a menu component.
To Rearrange the Menu Structure
You can drag the components visually.

Oracle10g: Java Programming 15-13


Practice 15-1: Overview

This practice covers:


• Creating the OrderEntryMDIFrame menu
• Adding the menu items and a separator to the
Order menu
• Adding components to OrderEntryFrame to form
its visual structure

15-14 Copyright © 2004, Oracle. All rights reserved.

Practice 15-1: Overview


Note: If you have successfully completed the previous practice, then continue using the
same directory and files. If the compilation from the previous practice was unsuccessful and
you want to move on to this practice, then change to the les14 directory, load the
OrderEntryLes14 workspace, and continue with this practice.

Oracle10g: Java Programming 15-14


UI for Java Application

15-15 Copyright © 2004, Oracle. All rights reserved.

Sample Order Entry Application


The slide shows a snapshot of the final visual appearance of the application’s main window
OrderEntryMDIFrame, and a sample OrderEntryFrame for an order that is created
as an internal frame.
Using the Application
The OrderEntryMDIFrame provides the main application menu, from which the user
clicks the Order > New menu option to create a new order for a customer.
The new order request should create the internal OrderEntryFrame, and a new Order
object from which the Order Id text field in the frame is set by using the ID of the new order
object.
The customer details are entered by entering an ID value in the Customer Id field and
clicking the Find button. The Find button event validates if the customer exits (by using the
DataMan.findCustomerById() method) and if so, assigns the customer to the order
and displays the customer details in the fields provided; otherwise an error message is
displayed.

Oracle10g: Java Programming 15-15


Sample Order Entry Application (continued)
Using the Application (continued)
Products are added to the order by entering a value in the Product Id field and clicking the
Add button. The products that are found by using the DataMan.findProductById()
method, are added to the order contained in the order item objects that are added to the
JList in the bottom pane of the OrderEntryFrame. Multiple products can be added to
the order, but adding a product that already exists in the order increments the item quantity.
Note: If you have successfully completed the previous practice, then continue using the
same directory and files. If the compilation from the previous practice was unsuccessful and
you would like to move on to this practice, then change to the les14 directory, load the
OrderEntryLes14 workspace, and continue with this practice.
Viewing the model: If you load the OrderEntryWorkspaceLes14 workspace, and in
the Applications – Navigator node, expand the OrderEntryWorkspaceLes14 –
OrderEntryProjectLes14 - Application Sources – oe, and double click
the UML Class Diagram1 entry. This diagram displays all the classes created to this
point in the course.

Oracle10g: Java Programming 15-16


Practice 15-1: Adding User Interface Components
Goal
In this practice, you create the menu and visual components for the user to manage order
entry details. The application will include a button to find a customer that will be assigned to
the order, and buttons to add and remove products as items in the order. You learn how to
build a Swing-based UI application by using the JDeveloper UI Editor to construct the user
interface. You also learn how to handle events for the Swing components that are added to
the application.
Note: Whenever you create a UI component, JDeveloper will declare it as private and you
can remove that if required.
Your Assignment
Modify the menu of the OrderEntryMDIFrame, and add several Swing components to
the OrderEntryFrame to meet the user requirements by using the following screenshot
as a guide:

Create the OrderEntryMDIFrame Menu


1. The menu bar structure that is added to the main window should be as follows:

Use the JDeveloper UI Editor to modify the menu to include the Order menu and its
menu items, as shown above.
Note: File > Exit already exists.
a. Edit the OrderEntryMDIFrame by using the UI Editor, expand the Menu
item in the Structure pane, and click the menuBar entry to display the initial
menu structure in the UI Editor window.
Oracle10g: Java Programming 15-17
Practice 15-1: Adding User Interface Components (continued)
b. Add the Order menu after the File menu. Right-click the outlined box on the right
side of the File menu item, and select the Insert Menu option from the context
menu.
c. The new menu should be selected and shown as jMenu1. With the menu
selected enter the text: Order, overwriting the default menu label text, and then
press the Enter key.
d. Select the new Order menu, and replace the name property value of jMenu1
with: menuOrder, and press the Enter key.
e. Save your work, and compile the class ensuring that there are no compilation
errors. What lines has JDeveloper added to the OrderEntryMDIFrame class?
2. Add the menu items and a separator to the Order menu.
a. Create each menu item by selecting the blank outline box at the bottom of the
Order menu, and enter the menu label text in the box. You can select the
menuOrder menu from the Structure so that the outline boxes are visible. After
creating the menu item entry, select the menu item box and set its name
property in the Inspector, according to the following table:
Menu item text Menu name property value
New newMenuItem
Open openMenuItem
Save saveMenuItem
Close closeMenuItem
<separator> See step b.
Print printMenuItem

Hint: You may want to add all menu labels first, and then set the name
properties.
b. Save and compile the class. Then run OrderEntry.java to view the menu.
Add Components to OrderEntryFrame to Form its Visual Structure
3. To add UI components, open OrderEntryFrame.java by right-clicking its name
in the Navigator; select the Design tab to invoke the UI Editor.
a. In the top panel, add Jlabel and JTextField components for the Customer
details. (These components can be found in the Swing pulldown.) Use the sample
window on the previous pages as a guide for the layout. Create label and text
field items by using the following table:
JLabel text property JTextField name property
Customer Id custIdTxt
Name custNameTxt
Address custAddressTxt
Phone custPhoneTxt
Hint: Aligning UI components works best with XYLayout manager, in which
alignment is relative to the first component clicked. Select additional
components, while holding [Shift] or [Control]. Right-click a selected component
and choose an Align option from the context menu. (Null layout hints on next
page).
Oracle10g: Java Programming 15-18
Practice 15-1: Adding User Interface Components (continued)
Hint: If you are using the null layout manager, then JDeveloper generates calls
to each component setBounds() method, with a Rectangle parameter
defining the components x, y location, width, and height. You can alter the
parameters (x, y, width, height) in the Rectangle constructor to manually
align and size components, or set the bounds property for each component in
the Inspector.
b. Select the JTextField1 component next to the Order Id label. Change its
name property to orderIdTxt.
c. Multiselect all customer JTextField items that you created in 3a, and delete
the text property, then press the Enter key.
Note: Selecting multiple components and changing a property value sets the
property to the same value for all the selected items.
d. Add a JButton to the right of the customer ID text field, and set the text
property to Find, and the name property to findBtn. Then save your work.
4. Add the components for the other order information, and components for adding
products to the order.
a. Create a JLabel and set the text property to Product Id. To the right of
the label add a JTextField and set its name property to prodIdTxt and
delete the value in the text property (and press the Enter key).
b. Below the product ID label and text field create a JButton component, and set
the name and text properties as follows:
Name property Text property
addBtn Add
c. Add two Jlabel components at the top-right side of the top panel, for the order
date. Set the first label text property to Order Date. Set the second label’s
name to orderDateLbl and its text property to the empty string. Select the
Swing Border option from the list and from the Border window, select the
LineBorder value. Set the border thickness to 1, if its not already set.
d. Add two more Jlabel components under the order date labels, for the order
total. Set the first label text property to Order Total. Set the second label’s
name to orderTotalLbl and its text property to the empty string. Select
the Swing Border option from the list and from the Border window, select the
LineBorder value. Set the border thickness to 1, if its not already set.
e. Add a JList component into the scroll pane in the bottom panel of the
OrderEntryFrame. The list component should fill the entire bottom section
of the frame (just click in the lower pane, and the Jlist will expand and take
up the entire pane). Set the list name property to orderItemList.
f. Save and compile the OrderEntryFrame class.
g. Run the OrderEntry.java application to view the resulting UI layout in the
internal frame. Quickly make minor adjustments to the UI layout to make all
items pleasantly visible.

Oracle10g: Java Programming 15-19


Java Event Handling Model

• How it works:
– Event originates from source and generates an
event object.
– An event listener hears a specific event.
– An event handler determines what to do.
• Setting it up:
1. Create an event source object.
2. Create an event listener object implementing an
interface with methods to handle the event object.
3. Write an event-specific method to handle the event.
4. Register the listener object with the event source
for the specified event.

15-20 Copyright © 2004, Oracle. All rights reserved.

Java Event Handling Model


There are four components of the Java event handling model:
• Event source: The object or component from which the event comes. For example, a
mouse-click event could originate from a button.
• Event object: The object that is generated when the event occurs. (This object is
passed to an event listener.)
• Event listener: A method whose job is to listen for a specific event, and then run an
event handler when the event occurs by receiving the event object from the event
source
• Event handler: A method whose job is to handle a specific event and event object
The following slides illustrate the event handling model in detail.

Oracle10g: Java Programming 15-20


Event Handling Code Basics

• Create the event source.


Jbutton findBtn = new Jbutton("Find");
• Create the event listener implementing the
required event interface.
class MyListener implements ActionListener {
public void actionPerformed(ActionEvent e) {
// handler logic
}
}

• Register the listener with the event source.


findBtn.addActionListener(new MyListener());

15-21 Copyright © 2004, Oracle. All rights reserved.

Java Event Handling Code Basics


The above slide shows the key steps to create an event source object; for example, a
JButton. When the button (event source) is pressed with an Enter key (if it has focus), or
if you click the button with the mouse, the button creates the event object, a
java.awt.eventActionEvent object. If listeners are registered with a button to listen
for the ActionEvent, then their handler method will be called by the event firing
mechanism of the button.
The second code example in the slide shows creating the class for the event listener that
implements the java.awt.event.ActionListener interface, requiring that you
write a single method with the following signature:
public void actionPerformed(ActionEvent e);
The actionPerformed() method receives an event object reference that is created by
the event source, in this case an ActionEvent. The handler code can optionally use the
event object to get information from or find out about the event source. The body of the
method effectively handles the event by implementing the code to manage the event. The
event handling code executes on the Java event handling thread.
The third code example shows the final piece to the puzzle, where the listener object is
created in the argument of the addActionListener() method, thereby registering the
listener object with event source to handle the ActionEvent; that is, the button-pressed or
clicked event.
Oracle10g: Java Programming 15-21
Event Handling Process: Registration

Source
Event listener object

OK
Handler method

MyListener actionListenerObj = new MyListener();


public void jbInit() {
button1.addActionListener(actionListenerObj);

}

15-22 Copyright © 2004, Oracle. All rights reserved.

Event Handling Process: Registration


Registering the Listener
As already seen, the final stage in the event handling coding process is the registration of the
listener with the event source. The event listener registers “interested” in a particular type of
event. For example, “I am interested in button clicks.”
Registering Listener Objects
An event listener receives events from a source only if it registers with that source as a
listener for a particular type of event. For each type of event that it can generate, a source
object provides a method that allows objects to register themselves as listeners for that
event.

Oracle10g: Java Programming 15-22


Event Handling Process: Registration (continued)
Registering Listener Objects (continued)
For example, consider a button. A Button object can generate ActionEvents, so the
Button class provides a method called addActionListener(). The example on the
slides shows how to call this method to register the listener object that was created on the
previous slide. This MyListener object is added to a list of listeners that are informed
when the button is clicked. This listener object contains the code to handle the
event.
Note: There is a method called removeActionListener(), which allows a listener to
be removed from the list of registered listeners; for example,
findBtn.removeActionListener( actionListenerObj);
The event handling model is enforced because the classes follow coding rules as follows:
• The event object class is called XXXEvent
• The listener implements an interface called XXXListener interface.
• The event source provides an addXXXListener() method, which accepts an object
argument that implements the appropriate XXXListener interface.

Oracle10g: Java Programming 15-23


Event Handling Process:
The Event Occurs

Source
Event listener object

OK
Notified Handler method

public void jbInit() {


button1.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
// Your code to handle the ActionEvent
}
}); … }

15-24 Copyright © 2004, Oracle. All rights reserved.

Notifying the Listener of the Event


When the event occurs, the listener is notified that the event it is interested in has occurred.
An event source notifies an event listener object by invoking a method on it and passing it
an event object. Events are delivered only to registered listener objects. An object never
receives unsolicited events, and events that are not handled are simply ignored.
Listening for an Event
When an event occurs, the event source notifies an event listener by calling an event-
specific method on the listener; all listeners for a particular type of event must provide the
appropriate method. For example, the event that occurs when a button is clicked is
ActionEvent. All listeners for an ActionEvent must provide an
actionPerformed() method, because this is what the event source will try to call.
Implementing the Event Listener as an Inner Class
The example on the slide shows how to implement the event listener object and register it
with the event source in one step. You can do this by implementing the event listener object
as an anonymous inner class.
The particular type of inner class event adapters that JDeveloper generates by default are
known as anonymous adapters. This implementation of anonymous adapters avoids the
creation of a separate (named) adapter class. The resulting code is compact and elegant.
Oracle10g: Java Programming 15-24
Event Handling Process:
Running the Event Handler

Source
Event listener object

OK Handler method:
Source
save changes and quit

15-25 Copyright © 2004, Oracle. All rights reserved.

Running the Event Handler


The event listener contains an event handler. After the event listener receives notification, it
runs its event handler. For example, if the button is a Save button, the event handler would
save the data on the form.
How Is This Enforced?
All listeners for an ActionEvent must implement the ActionListener interface. The
various listener interfaces specify the methods that you must implement in your listener
class. The ActionListener interface only stipulates one method for you to implement:
public interface ActionListener {
public void actionPerformed(ActionEvent e);
}
Instructor Note
Writing event handling code can be confusing. If the students have problems understanding
the implementation details, you could tell them that JDeveloper simplifies the
implementation of event handling. They must understand the concepts and have an idea of
the different classes; JDeveloper handles the rest. Handling errors with JDeveloper is
covered later in this lesson.

Oracle10g: Java Programming 15-25


Using Adapter Classes for Listeners

Adapter classes are “convenience” classes that


implement event listener interface:
• They provide empty method implementations.
• They are extended and the desired method
overridden.
interface MouseListener {
// Declares five methods
}
class MouseAdapter implements MouseListener {
// Empty implementations of all five methods
}

public class MyListener extends MouseAdapter {


// Override only the methods you need
}

15-26 Copyright © 2004, Oracle. All rights reserved.

The Adapter Classes


Some of the event listener interfaces contain more than one method. For each of these
interfaces, there is a simple adapter class that provides an empty body for each method in the
interfaces.
For example, MouseListener contains five methods. If you implement
MouseListener directly, then you must implement all five of its methods, even if you
are only interested in one of them. Alternatively, you can extend the MouseAdapter class.
If you do this, then you can override the methods that you need and ignore the rest.
There is no adapter class for the ActionListener interface, because the interface has
only one method.

Oracle10g: Java Programming 15-26


Swing Model View Controller Architecture

• Model, View, Controller principles


modify View
Event Controller View

modify Notify update


Model
Get changed data
• Terms explained:
– Model represents the data or information.
– View provides a visual representation of the data.
– Controller handles events modifying the
view/model.
• Always update Swing components on the event
thread queue, or use SwingUtilities methods.

15-27 Copyright © 2004, Oracle. All rights reserved.

Importance of Swing Model View Controller Architecture


The Model View Controller (MVC) design forms dynamic associations between the visual
representation of the data object, the data, and events. The MVC design allows multiple
views to the same data (model), keeping the various views synchronized as the data is
modified. This forms the foundation for creating data aware components.
The slide shows that when an event occurs that causes changes to a visual component, the
view requests the appropriate data from the model. If the event causes a change to the
model, then the model notifies the view that a change occured and the view in turn makes a
request for the changed data from the model.
In Swing terms, a UI component represents a view. Each component passes an event object
to a “listener” object or controller to handle the event. Depending on the event, the
controller modifies the view or model. If the model class is one of those provided by the
Swing API that is suitable for the associated UI component, then changes to the model are
automatically visible through the view.

Oracle10g: Java Programming 15-27


Importance of Swing Model View Controller Architecture (continued)
Using a JList with a Vector is possible, but adding elements to the Vector does not
update the JList contents for two reasons:
• The Vector is not the appropriate model class for a JList.
• The JList creates an internal ListModel from the vector items.
However, if you explicitly create a DefaultListModel object, and associate it with a
JList, then as items are added to the DefaultListModel object, the JList will
reflect the changes automatically.
Note: The diagram on the slide represents classic MVC. Swing components use a modified
form of MVC to support pluggable look and feel.

Oracle10g: Java Programming 15-28


Importance of Swing Model View Controller Architecture (continued)
Swing Components (View) and Model Classes
The table below shows the Swing components and interfaces that can be implemented by
model classes to provide MVC functionality. Each interface has been implemented by a
class in the Swing API packages; the implementing classes are also shown.

Swing components Model interface Class implementing model


interface
JTextField, JPasswordField, Document (found in PlainDocument, and
JTextArea, JTextPane, javax.swing.text package). DefaultStyledDocument.
JEditorPane
JButton, JCheckBox, ButtonModel DefaultButtonModel.
JCheckBoxMenuItem, JMenu,
JMenuItem, JRadioButton,
JRadioButtonMenuItem,
JToggleButton
JComboBox ComboBoxModel DefaultComboBoxModel.
JProgessBar, JScrollBar, BoundedRangeModel DefaultBoundedRangeModel
JSlider
JList ListModel, ListSelectionModel DefaultListModel,
DefaultListSelectionModel
JTable TableModel (found in DefaultTableModel,
javax.swing.table package) DefaultListSelectionModel
ListSelectionModel
JTree TreeModel TreeSelectionModel DefaultTreeModel,
(both interfaces found in DefaultTreeSelectionModel
javax.swing.table package)

Swing components, by default, implicitly create and store data in a default model that suits
their requirement. You can use all components to explicitly create and use an appropriate
model, usually based on those shown in the table above.

Oracle10g: Java Programming 15-29


Basic Text Component Methods

• Text item (JLabel, JTextField, and JButton)


methods:
void setText(String value)
String getText()
• Additional methods in JTextArea:
void append(String value)
void insert(String value, int pos)

Changes to component contents are usually done
in the event handling thread.
Note: Consult the Java API documentation for details
about each component’s capabilities.

15-30 Copyright © 2004, Oracle. All rights reserved.

Getting and Setting Properties


The various Swing components have different methods to populate them with values, and to
retrieve the values contained in the component. In general, most text items, such as labels,
text fields, and text areas, have a setText(String value) method that sets the
contents to the specified string value, or a String getText() method that returns the
contents as a String object.
Note: You must use the setText() and getText() methods to change or get the label
of a JButton object, respectively. Do not use the setLabel() and getLabel()
methods that are now deprecated.
JTextArea objects are multiline text items, and therefore allow you to append to the
existing contents, insert at a particular position in the text, or replace text. See the Java API
documentation for information about its methods.

Oracle10g: Java Programming 15-30


Basic JList Component Methods

Subset of JList component methods include:


• void setListData(Vector)
– Copies Vector to a ListModel applied with
setModel
• void setModel(ListModel)
– Sets model representing the data and clears
selection. Uses DefaultListModel class for the
model.
• Object getSelectedValue()
– Returns the selected object, or null if nothing is
selected
• int getSelectedIndex()
– Returns the index of the selected item, or –1 if
nothing is selected

15-31 Copyright © 2004, Oracle. All rights reserved.

List Components
The JList and JComboBox are Swing components that handle lists of data. The slide
discusses some of the methods that are provided by the JList class.
Vector vector = new Vector();
Jlist list = new JList(vector);
For example, if you create a JList object with the constructor accepting a vector, then the
vector elements are copied to an internally created DefaultListModel object. Thus, if
you add elements to the vector, with the addElement() method, then the new elements
will not be visible through the Jlist unless you call the
JList.setListData() method passing the updated
vector object as an argument his is
inefficient as the elements are copied
from the vector again and a new
DefaultListModel object is created internally
t is better to create the DefaultListModel
object first and use it like you would a
Vector and create the JList with the
appropriate constructor for example
DefaultListModel model = new DefaultListMode();
Jlist list = new JList(model);
Oracle10g: Java
or call the setModel() Programming s
method 15-31
elements
are added to the DefaultListModel object by
What Events Can
a Component Generate?

Events that a component can


generate

Event handler
methods

15-32 Copyright © 2004, Oracle. All rights reserved.

Each Type of Component Generates Different Events


To find out what events a component is capable of generating, select the component in the
Designer pane and click the Events tab in the Inspector window. This shows a list of all the
events that the component can generate.
For each event, the Inspector also shows whether an event handler method has been installed
yet. On the slide, the Inspector shows all the events for the JButton component,
findButton. You have not installed any event handlers yet, so the Inspector does not
have any event handler methods to advertise in the list.

Oracle10g: Java Programming 15-32


How to Define an Event Handler
in JDeveloper

1: Select the event that you


want to handle.

2: Click the right column to fill in


a method name.

3: Double-click the right column to


create the method.

15-33 Copyright © 2004, Oracle. All rights reserved.

Defining an Event Handler with JDeveloper


JDeveloper makes it easy to define event handler methods in your code:
• In the UI Editor, select the component that you want to provide an event handler for.
• In the Inspector, the Events tab shows a list of all the events that the component can
generate. Click the event that you want to handle.
• Click the right column for that event; the Inspector suggests a name for the event
handler method that it is about to generate. In the example, the event handler method
will be called findButton_actionPerformed.
• Click the ‘…’ button and it will suggest a name for the event handler method in the
dialog box. JDeveloper will then generate the event handler method in your code.
Note that double-clicking the button in the UI Editor creates the listener and handler. It is an
alternative to clicking the Events tab of the Inspector and double-clicking the name of the
listener.
The actionPerformed Event
Many UI components have a special event called actionPerformed. For most
components, actionPerformed is the most commonly used event. For example, a
JButton generates an actionPerformed event when it is clicked, whereas a JList
generates an actionPerformed event when it is double-clicked. Use
actionPerformed when possible, rather than an event such as mouseClicked.
Oracle10g: Java Programming 15-33
Default Event Handling Code Style
Generated by JDeveloper

public void jbInit() throws Exception {


… Find
findButton.addActionListener(
new java.awt.event.ActionListener() {
public void actionPerformed(ActionEvent e) {
findButton_actionPerformed(e);
}
}); …

void findButton_actionPerformed(ActionEvent e) {
// Your code to handle the ActionEvent
}

15-34 Copyright © 2004, Oracle. All rights reserved.

What Happens When the Event Is Fired?


• When the button is clicked, it examines its list of registered listener objects and calls
the actionPerformed() method on each listener object. One of the listener
objects is the new (nameless) ActionListener object, created and registered in the
applet’s jbInit() method.
• The listener object’s implementation of actionPerformed() calls the handler
method.
By default, JDeveloper uses anonymous inner classes in the event handling code that it
generates, but you can configure JDeveloper to create a separate listener class instead, called
a Standard Adapter style.
The procedure for selecting this code style option is as follows:
• Tools > Preferences
• Select the Code Style node and in the Event Handling section,
select either:
- The Anonymous Inner Class option button, or
- The Standard Adapter option button.

Oracle10g: Java Programming 15-34


Completing the Event Handler Method

public class JFrame1 extends JFrame {



void findButton_actionPerformed(ActionEvent e){
// When the user clicks the button, display
// the list of customers in jTextArea1
String findList = (“Supplies-R-Us " + "\n" +
“Consulting Inc. " + "\n" +
“Just-In-Time Training ");
jTextArea1.setText(findList);
}
}

15-35 Copyright © 2004, Oracle. All rights reserved.

Completing the Event Handler Method


When you add an event handler method in JDeveloper, it defines a skeleton method in your
program and also generates the event listener code to make sure that the method is called
when the event occurs.
Using Methods in the Button and Label Classes
The event handler that is shown on the slide will be called when findButton is clicked.
When that happens, the event handler method performs the following tasks:
• Constructs a string that contains a list of customers. In a real application, the string
would be built by a call to a method that returns a string. That method could retrieve
the data from a database, a file, or wherever.
• Calls JTextArea1.setText()to set the text property of the form’s text area to
the string list of customers

Oracle10g: Java Programming 15-35


Summary

In this lesson, you should have learned how to:


• Add a Swing component to a visual container
• Get and modify the contents of the components
• Use the AWT event handling model to:
– Create an event source
– Create an event listener and handler code
– Register an event listener for the event to be
handled
• Create a menu bar with menus and menu items
• Handle events

15-36 Copyright © 2004, Oracle. All rights reserved.

Oracle10g: Java Programming 15-36


Practice 15-2: Overview

This practice covers adding event handling for:


• Order > New menu
• Find Customer button
• Add Product button

15-37 Copyright © 2004, Oracle. All rights reserved.

Practice 15-2: Overview


Note: If you have successfully completed the previous practice, then continue using the
same directory and files. If the compilation from the previous practice was unsuccessful and
you would like to move on to this practice, then change to the les15-1 directory, load up
the OrderEntryLes15-1 workspace, and continue with this practice.
Viewing the model: To view the course application model up to this practice, load the
OrderEntryWorkspaceLes15-1 workspace. In the Applications – Navigator node,
expand the OrderEntryWorkspaceLes15-1 – OrderEntryProjectLes15-1
- Application Sources – oe, and double-click the UML Class Diagram1
entry. This diagram displays all the classes created to this point in the course.
Note: A Remove button has been added to the practice 15 solution workspace to
demonstrate how to include the “remove” functionality. Adding the button and event code is
not part of this practice, and is included only as an opportunity to see how this type of
functionality works. Using this solution application should not impede your ability to
successfully complete the entire application.

Oracle10g: Java Programming 15-37


Practice 15-2: Adding Event Handling
Goal
In this practice, you create the order entry details. You will add event handling code for the
Order > New Menu, Find Customer Button and Add Product and Remove Product Buttons.
To save time, you can cut and paste code from E:\labs\les15.txt.
Note: If you have successfully completed the previous practice, then continue using the
same directory and files. If the compilation from the previous practice was unsuccessful and
you would like to move on to this practice, then change to the les15-1 directory, load up
the OrderEntryLes15-1 workspace, and continue with this practice.
Add Event Handling for Order > New Menu
1. Edit OrderEntryFrame.java in the Code Editor to create an order object and
display its initial state in the appropriate components.
a. Create a new instance variable for
the order object as follows
Order order = null;
b dd the following method to create
a new order object and display its
contents in the appropriate
components in the frame
private void initOrder() {
order = new Order();
orderIdTxt.setText(
Integer.toString(order.getId()));
orderDateLbl.setText(
Util.toDateString(order.getOrderDate()));
orderTotalLbl.setText(
Util.toMoney(order.getOrderTotal()));
}
c all the initOrder() method at end of
the jbInit() method
d o control the x y location of the
top left corner of the frame when
it is displayed declare the
following instance and class
variables

private static int x = 0;


private static int y = 0;
private static final int OFFSET = 20;
private static final int MAX_OFFSET = 200;

and create the following method to


create a cascading effect as new
order
frames are created

Oracle10g: Java Programming 15-38


Practice 15-2: Adding Event Handling (continued)
Add Event Handling for Order > New Menu (continued)
d. private void setBounds() {
this.setResizable(true);
this.setBounds(x, y,
this.getWidth(), this.getHeight());
x = (x + OFFSET) % MAX_OFFSET;
y = (y + OFFSET) % MAX_OFFSET;
}

e dd a call to your setBounds() method at


the end of the jbInit()method after
calling initOrder()
f dd one more method to OrderEntryFrame
to make it the active window as
follows

public void setActive(boolean active) {


try {
this.setSelected(active);
}
catch (Exception e) {}
this.setVisible(active);
if (active) {
this.toFront();
}
}
ote his method will be called from
the Order > New menu event handler
g ompile and save the OrderEntryFrame
class
2 dit OrderEntryMDIFrame.java to create the
event handler code for the new order
menu option
a pen OrderEntryMDIFrame.java in the ditor
and expand the menu either in the
visual editor or the tructure
pane and then select the New menu
item under the Order menu
b Click the Events tab of the Inspector window (second icon from the left), click
in the text area to the right of the first event called actionPerformed
he text area will show a button
with three dots ellipses
Oracle10g: Java Programming 15-39
lick
this button to display the
actionPerformed event generation dialog
Practice 15-2: Adding Event Handling (continued)
c. ove the following lines from the
OrderEntryMDIFrame() constructor to the
body of the newMenuItem_actionPerformed()
method deleting or commenting out
the line making the frame visible
as shown

OrderEntryFrame iFrame = new OrderEntryFrame();


// iFrame.setVisible(true);
desktopPane.add(iFrame);

lso add the following line after


adding the frame to the desktop
pane
iFrame.setActive(true);
d ompile the OrderEntryMDIFrame class and
save the changes un and test the
OrderEntry application by selecting
the Order > New menu
ote hen the application first
starts there should not be any
order window displayed lose the
internal window by clicking its
lose icon X
Add Event Handling for Find Customer Button
In this section of the code, you test if the customer Id text field has a non-zero length string,
and convert it to an integer used in the DataMan.findCustomerById() method to
return a valid customer. If the customer Id field is empty, or is not a number, then the
DataMan.findCustomerById() method throws a NotFoundException.
Then you display an error message using the javax.swing.JOptionPane class. If the
customer is a valid customer, then associate the customer object with the order and display
the customer details in the field that is provided in OrderEntryFrame.
3. Edit the OrderEntryFrame class in the UI Editor.
a. Select the Find button, and click the Events tab in the Inspector, and generate the
skeleton code for the actionPerformed event.
b. In the body of the generated findBtn_actionPerformed() method add
the following code:

int custId = 0;
Customer customer = null;
if (custIdTxt.getText().length() > 0) {
try {
custId = Integer.parseInt(custIdTxt.getText());
customer = DataMan.findCustomerById(custId);
order.setCustomer(customer);
custNameTxt.setText(customer.getName());
Oracle10g: Java Programming 15-40
custAddressTxt.setText(customer.getAddress());
custPhoneTxt.setText(customer.getPhone());
Practice 15-2: Adding Event Handling (continued)
catch (NumberFormatException err) {
JOptionPane.showMessageDialog(this,
"The Customer Id: " + err.getMessage() +
" is not a valid number",
"Error", JOptionPane.ERROR_MESSAGE);
custIdTxt.setText("");
}
catch (NotFoundException err) {
JOptionPane.showMessageDialog(this,
err.getMessage(),
"Error", JOptionPane.ERROR_MESSAGE);
custIdTxt.setText("");
}
}
else {
JOptionPane.showMessageDialog(this,
"Please enter a Customer Id", "Error",
JOptionPane.ERROR_MESSAGE);
}
Note: Remember to import javax.swing.JOptionPane.
c. Compile and save your changes. Run the OrderEntry application to test your
code changes (customer IDs range from 1 to 6).
Optional Extra Credit
Add Event Handling for Add Product Button
Write code to add products to the order. The code reads the product ID that is entered and
supplies it to the order.addOrderItem() method. You also update the Order Total field with
the latest total after each product is added to the order. Handle errors as appropriate. The
Remove button should be disabled if an item is not selected from the list.
4 dit the OrderEntryFrame class in the
ditor
a. Select the Add button to generate its actionPerformed event handler containing
the following code:
void addBtn_actionPerformed(ActionEvent e)
Product p = null;
int prodId = 0;
if (prodIdTxt.getText().length() > 0) {
try {
prodId = Integer.parseInt(prodIdTxt.getText());
p = DataMan.findProductById(prodId);
order.addOrderItem(p.getId());
orderTotalLbl.setText(
Util.toMoney(order.getOrderTotal()));
}

Oracle10g: Java Programming 15-41


Practice 15-2: Adding Event Handling (continued)
catch (Exception err) {
String message = err.getMessage();
if (err instanceof NumberFormatException) {
message = "Product id '" + message +
"' is not a valid number";
}
JOptionPane.showMessageDialog(this, message,
"Error", JOptionPane.ERROR_MESSAGE);
prodIdTxt.setText("");
}
}
else {
JOptionPane.showMessageDialog(this,
"Please enter a Product Id", "Error",
JOptionPane.ERROR_MESSAGE);
}
}
b ompile and save the code un the
OrderEntry application to test the
code
dd products to the order product
s start at 2000 id you see the
products
visually added to the list f not
explain why id the order total get
updated
5 odify the Order class to support the
by replacing the Vector type for items to
be a javax.swing.DefaultListModel rovide a
method in the Order class to return the
reference to the model
a dit the Order.java class and replace
the items declaration as shown
// private Vector items = null; // replace with ...
private DefaultListModel items = null;
ote ou will need to import
javax.swing.DefaultListModel
b n the rder no arg constructor
create the DefaultListModel object to
initiali e the items variable
instead of using a Vector or example
// items = new Vector(10);
items = new DefaultListModel();
c dd a new method with the signature
shown to return the items reference
to the caller
public DefaultListModel getModel() { … }
Oracle10g: Java Programming 15-42
ote his method will be used as the
model for the JList causing it to
Using JDBC to Access the Database

Copyright © 2004, Oracle. All rights reserved.

Schedule: Timing Topic


50 minutes Lecture
30 minutes Practice
80 minutes Total
Objectives

After completing this lesson, you should be able to do


the following:
• Describe how Java applications connect to the
database
• Describe how Java database functionality is
supported by the Oracle database
• Load and register a JDBC driver
• Connect to an Oracle database
• Follow the steps to execute a simple SELECT
statement
• Map simple Oracle database types to Java types

16-2 Copyright © 2004, Oracle. All rights reserved.

Lesson Aim
This lesson introduces you to using Java to access an Oracle database. This lesson
introduces you to the basic use of JDBC to query a database from a Java class. It presents
the different steps required to perform SQL statements.

Oracle10g: Java Programming 16-2


Java, J2EE, and Oracle 10g

Web Application
Client server server Data
Business
Presentation
logic

Oracle
Oracle database
Application Server 10g
J2EE Certified Environment

JDBC

16-3 Copyright © 2004, Oracle. All rights reserved.

Java and Oracle 10g


Oracle provides a complete and integrated platform called Oracle 10g, which supports all of
the server-side requirements for Java applications. Oracle 10g consists of the following:
Oracle Database
In addition to its database management features, the Oracle database (currently Oracle 10g)
provides support for a variety of Java-based structures, including Java components and Java
stored procedures. These Java structures are executed in the database by its built-in Java
Virtual Machine, called the Oracle Java Virtual Machine (Oracle JVM).
Oracle Application Server 10g
Oracle Application Server 10g maintains and executes all your application logic, including
Enterprise JavaBeans, through its own built-in JVM, the Enterprise Java Engine. Oracle
Application Server 10g uses Apache Web server to access the OC4J where servlets and JSPs
are executed.
Using J2EE with Oracle 10g
J2EE is a standard technology which provides a set of APIs and a run-time infrastructure for
hosting and managing applications. It specifies roles and interfaces for applications and the
run time onto which applications can be deployed. And, hence, the application developers
need to focus only on the application logic and related services, while leveraging the run
time for all infrastructure-related services.

Oracle10g: Java Programming 16-3


Connecting to a Database with Java

Client applications, JSPs, and servlets use JDBC.

Client application JDBC Relational DB


or applet

16-4 Copyright © 2004, Oracle. All rights reserved.

How Java Connects to a Database


To query an Oracle database, any Java application must have a way to connect to the
database. This is performed by using JDBC.
Java Database Connectivity (JDBC) is a standard application programming interface (API)
that is used for connecting a Java application to relational databases. The networking
protocol that is used depends on which JDBC driver you are using. For example, the OCI
driver uses Oracle Net, or thin driver uses TCP/IP
Running SQL from a Server-Side Application
Java procedures inside the database use JDBC to execute their SQL queries. This includes
Java stored procedures.
Instructor Note
If you are connecting within the server, you can use the default connection. A Java stored
procedure accesses the database by using the default connection. To connect within the
server, you must first connect to the server from outside, so you already have a database
session. The default connection takes the same user and privileges as your existing database
session. Therefore, you do not need to specify a URL, user ID, or password for the default
connection. You can also use the URL, jdbc:oracle:kprb, as an alternative way to get
the default connection.

Oracle10g: Java Programming 16-4


What Is JDBC?

• JDBC is a standard interface for connecting to


relational databases from Java.
– The JDBC API includes Core API Package in
java.sql.
– JDBC 2.0 API includes Optional Package API in
javax.sql.
– JDBC 3.0 API includes the Core API and Optional
Package API

• Include the Oracle JDBC driver archive file in the


CLASSPATH.
• The JDBC class library is part of the Java 2,
Standard Edition (J2SE).
16-5 Copyright © 2004, Oracle. All rights reserved.

Java Database Connectivity (JDBC)


The java.sql package contains a set of interfaces that specify the JDBC API. This
package is part of Java 2, Standard Edition. Database vendors implement these interfaces in
different ways, but the JDBC API itself is standard.
Using JDBC, you can write code that:
• Connects to one or more data servers
• Executes any SQL statement
• Obtains a result set so that you can navigate through query results
• Obtains metadata from the data server
Each database vendor provides one or more JDBC drivers. A JDBC driver implements the
interfaces in the java.sql package, providing the code to connect to and query a specific
database.
Instructor Note
JDBC 1.22 is part of JDK 1.1; JDBC 2.0 is part of Java 2.

Oracle10g: Java Programming 16-5


Preparing the Environment

• Set the CLASSPATH:


[Oracle Home]\jdbc\lib\classes12.jar

• Import JDBC packages:

// Standard packages
import java.sql.*;
import java.math.*; // optional
// Oracle extension to JDBC packages
import oracle.jdbc.*;
import oracle.sql.*;

16-6 Copyright © 2004, Oracle. All rights reserved.

Requirements for Using Oracle JDBC


This section describes the environment variables that must be set for the JDBC OCI driver
and the JDBC thin driver, focusing on the Sun Microsystems Solaris and Microsoft
Windows NT platforms.
You must set the CLASSPATH for your installed JDBC OCI or thin driver.
Depending on whether you are using the SDK 1.2.x versions or JDK 1.1.x versions, you
must set one of these values for the CLASSPATH:
• [Oracle Home]/jdbc/lib/classes12.jar
(and optionally [Oracle Home]/jdbc/lib/nls_charset12.jar) for full
NLS character support)
or:
• [Oracle Home]/jdbc/lib/classes111.jar
(and optionally [Oracle Home]/jdbc/lib/nls_charset11.jar) for full
NLS character support)
Ensure that there is only one classes*.zip file version and one nls_charset*.zip
file version in your CLASSPATH.

Oracle10g: Java Programming 16-6


Requirements for Using Oracle JDBC (continued)
JDBC OCI Driver
If you are installing the JDBC OCI driver, you must also set the following value for the
library path environment variable: [Oracle Home]/lib
The JDBC Package
Your Java class must import java.sql.* to be able to use the JDBC classes and include
the JDBC driver classes from your database vendor in the CLASSPATH.
For more information about required path and classpath settings for Oracle JDBC, refer to
the Oracle 10g JDBC Developer’s Guide and Reference.

Oracle10g: Java Programming 16-7


Steps for Using JDBC to Execute
SQL Statements

1. Register JDBC driver.

2. Obtain a connection.

3. Create statement object.

4. Execute SQL statement.

4a. Process SELECT 4b. Process DML


statement. or DDL statement.

5. Process query results. 6. Close connections.

16-8 Copyright © 2004, Oracle. All rights reserved.

Steps to Execute an SQL Statement with JDBC


The following are the key steps:
1. Load and register the driver. (Use the java.sql.DriverManager class.)
2. Obtain a connection object. (Use java.sql.DriverManager to do this.)
3. Create a statement object. (Use the Connection object.)
4. Execute a query, DML, or DDL. (Use the Statement object.)
5. If you obtain a ResultSet object while executing a query, then iterate through the
ResultSet to process the data for each row that satisfies the query.
6. Close the ResultSet, Statement, and Connection objects, when finished.
Dealing with Exceptions
When using JDBC, all the methods that access the database throw SQLException if
anything goes wrong. You must always deal with this exception in your JDBC code.
SQLException has a number of methods that you can call to get information about the
exception, including:
• getMessage(): Returns a string that describes the error
• getErrorCode(): Retrieves the vendor-specific exception code
• getSQLState(): Retrieves the SQL state value
• Class.forName(): Throws a ClassNotFoundException if the specified
class cannot be found

Oracle10g: Java Programming 16-8


Step 1: Registering the Driver

• Register the driver in the code:


– DriverManager.registerDriver (new
oracle.jdbc.OracleDriver());
– Class.forName
("oracle.jdbc.OracleDriver");
• Register the driver when launching the class:
– java –D jdbc.drivers =
oracle.jdbc.OracleDriver <ClassName>;

16-9 Copyright © 2004, Oracle. All rights reserved.

Loading the Driver


JDBC drivers must register themselves with the driver manager. There are two ways to
perform this:
• Use the registerDriver() method of DriverManager.
• Use the forName() method of the java.lang.Class class to load the JDBC
drivers directly, as follows:
try {
Class.forName("oracle.jdbc.driver.OracleDriver");
}
catch (ClassNotFoundException e) {}
Using the Class.forName() method calls the static initializer of the driver class. The
driver class does not need to be present at compile time. However, this method is valid only
for JDK-compliant Java Virtual Machines.
You can register the driver at execution time. In this case, the registering statements that
may exist in your Java class are ignored.
Example of using the –D jdbc option in the command line:
C:>java –D jdbc.drivers=oracle.jdbc.OracleDriver MyClass
Instructor Note
oracle.jdbc.OracleDriver class provides new interfaces and classes that can be
used in place of the previous oracle.jdbc.driver.OracleDriver classes.
Oracle10g: Java Programming 16-9
Connecting to the Database

Using the package oracle.jdbc.driver, Oracle


provides different drivers to establish a connection to
the database.

OracleDriver
Database
JDBC calls • Thin client commands
• OCI Database
• Server-based
•…

16-10 Copyright © 2004, Oracle. All rights reserved.

About JDBC Drivers


A JDBC driver implements the interfaces in the java.sql package, providing the code to
connect to and query a specific database. A JDBC driver can also provide a vendor’s own
extensions to the standard; Oracle drivers provide extensions to support special Oracle data
types.
Oracle provides three drivers:
• Thin client driver
• OCI-based driver
• Server-based driver
The Oracle JDBC driver is located in the file classes111.zip for JDBC 1.0 or in the
file classes12.zip for JDBC 2.0. These archive files contain supporting classes for
both the thin and OCI JDBC drivers.
Supported JDK and JDBC versions
Oracle has two versions of the thin driver and the OCI driver—one that is compatible with
SDK 1.2 and one that is compatible with JDK 1.1.x. The J2SE versions support standard
JDBC 2.0. The JDK 1.1.x versions support most JDBC 2.0 features, but must do so through
Oracle extensions because JDBC 2.0 features are not available in JDK 1.1.x versions.

Oracle10g: Java Programming 16-10


Oracle JDBC Drivers: Thin Client Driver

• Is written entirely in Java


• Must be used by applets

Applet

JDBC
Oracle
Thin driver

Client Server

16-11 Copyright © 2004, Oracle. All rights reserved.

Thin Client Driver


This driver can connect to an Oracle 10g database but also to either an Oracle8i database or
an Oracle9i database. You must use this driver if you are developing a client application that
can connect to different versions of an Oracle database, to provide maximum portability.
To communicate with the database, the thin client driver uses a lightweight version of
Oracle*Net over TCP/IP that can be downloaded at run time to the client.
The Oracle JDBC Thin driver is a 100% pure Java, Type IV driver. It is targeted to Oracle
JDBC applets but can be used for applications as well. Because it is written entirely in Java,
this driver is platform-independent. It does not require any additional Oracle software on the
client side. The thin driver communicates with the server by using Two Task Common
(TTC), a protocol developed by Oracle to access the Oracle Relational Database
Management System (RDBMS).
The JDBC Thin driver allows a direct connection to the database by providing an
implementation of TCP/IP that emulates Oracle Net and TTC (the wire protocol used by
OCI) on top of Java sockets. Both of these protocols are lightweight implementation
versions of their counterparts on the server. The Oracle Net protocol runs over TCP/IP only.
Note: When the JDBC Thin driver is used with an applet, the client browser must have the
capability to support Java sockets.

Oracle10g: Java Programming 16-11


Oracle JDBC Drivers: OCI Client Drivers

• Is written in C and Java


• Must be installed on the client

Application

JDBC

OCI driver

Oracle
ocixxx.dll

Client Server

16-12 Copyright © 2004, Oracle. All rights reserved.

OCI Client Drivers


• You must choose an OCI driver if you are developing an application and need
maximum performance.
• The JDBC OCI driver is a Type II driver for use with client-server Java applications.
• This driver requires an Oracle client installation, and therefore is Oracle platform-
specific and not suitable for applets.
• The JDBC OCI driver provides OCI connection pooling functionality, which can either
be part of the JDBC client or a JDBC stored procedure.
• The OCI driver supports Oracle7, Oracle8/8i, Oracle9i and Oracle 10g with the highest
compatibility. It also supports all installed Oracle Net adapters, including IPC, named
pipes, TCP/IP, and IPX/SPX.
• The OCI driver, written in a combination of Java and C, converts JDBC invocations to
calls to the Oracle Call Interface (OCI), using native methods to call C-entry points.
These calls are then sent over Oracle Net to the Oracle database server. The OCI driver
communicates with the server by using the Oracle-developed TTC protocol.
• The OCI driver uses the OCI libraries, C-entry points, Oracle Net, CORE libraries, and
other necessary files on the client machine on which it is installed.
Instructor Note
In Oracle, the OCI driver is a single OCI driver for use with all database versions. It replaces
the distinct OCI8 and OCI7 drivers of previous releases. While the OCI8 and OCI7 drivers
are deprecated for Oracle, they are still supported for backward compatibility.
Oracle10g: Java Programming 16-12
Choosing the Right Driver

Type of Program Driver

Applet Thin

Client application Thin OCI

Thin
EJB, servlet
(on the middle tier)
OCI

Stored procedure Server side

16-13 Copyright © 2004, Oracle. All rights reserved.

Choosing the Appropriate Driver


Consider the following when choosing a JDBC driver to use for your application or applet:
• If you are writing an applet, you must use the JDBC Thin driver. JDBC OCI-based
driver classes will not work inside a Web browser, because they call native (C
language) methods.
• If you want maximum portability and performance under Oracle 10g and earlier, then
use the JDBC Thin driver. You can connect to an Oracle server from either an
application or an applet by using the JDBC Thin driver.
• If you are writing a client application for an Oracle client environment and need
maximum performance, then choose the JDBC OCI driver.
• If performance is critical to your application, you want maximum scalability of the
Oracle server, or you need the enhanced availability features such as Transparent
Application Failover (TAF) or the enhanced proxy features such as middle-tier
authentication, then choose the OCI driver.

Oracle10g: Java Programming 16-13


Step 2: Getting a Database Connection

• In JDBC 1.0, use the DriverManager class, which


provides overloaded getConnection() methods.
– All connection methods require a JDBC URL to
specify the connection details.
• Example:
Connection conn =
DriverManager.getConnection(
"jdbc:oracle:thin:@myhost:1521:ORCL",
"scott","tiger");

• Vendors can provide different types of JDBC


drivers.

16-14 Copyright © 2004, Oracle. All rights reserved.

Getting a Connection to the Database


Use the DriverManager class to create a connection by calling the
getConnection() method.
The getConnection() method is overloaded, for example:
• getConnection(String url)
• getConnection(String url, Properties props), where properties
must include at least a value for the following key names: user and password.
• getConnection(String url, String user, String password)
In each case, you must supply a URL-like string that identifies the registered JDBC driver to
use, and the database connection string and security credentials, if required.
Instructor Note
JDBC 2.0 and later versions provide other ways of obtaining a connection object such as
using JNDI instead of a database URL.

Oracle10g: Java Programming 16-14


About JDBC URLs

• JDBC uses a URL-like string. The URL identifies


– The JDBC driver to use for the connection
– Database connection details, which vary depending
on the driver used

jdbc:<subprotocol>:<subname>

Protocol Database identification

jdbc:oracle:<driver>:@<database>

• Example using Oracle Thin JDBC driver:


– jdbc:oracle:thin:@myhost:1521:ORCL

16-15 Copyright © 2004, Oracle. All rights reserved.

JDBC URLs
JDBC uses a URL to identify the database connection. A JDBC URL looks different from an
HTTP or FTP URL. But, like any URL, it is a locator for a particular resource; in this case, a
database. The structure of a JDBC URL is flexible, allowing the driver writer to specify
what to include in the URL. End users need to learn what structure their vendor uses.
The slide shows the general syntax for a JDBC URL and the syntax that Oracle uses for
connecting with an Oracle driver. The general syntax of a JDBC URL is as follows:
jdbc:<subprotocol>:<subname>
• jdbc is the protocol. All URLs start with their protocol.
• <subprotocol> is the name of a driver or database connectivity mechanism. Driver
developers register their subprotocols with JavaSoft to make sure that no one else uses
the same subprotocol name. For all Oracle JDBC drivers, the subprotocol is oracle.
• <subname> identifies the database. The structure and contents of this string are
determined by the driver developer. For Oracle JDBC drivers, the subname is
<driver>:@<database>, where:
- <driver> is the driver
- <database> provides database connectivity information
The following slides describe the syntax of an Oracle JDBC URL for the different JDBC
drivers for client-side Java application code.

Oracle10g: Java Programming 16-15


JDBC URLs with Oracle Drivers

• Oracle Thin driver


Syntax: jdbc:oracle:thin:@<host>:<port>:<SID>
Example: "jdbc:oracle:thin:@myhost:1521:orcl"

• Oracle OCI driver


Syntax: jdbc:oracle:oci:@<tnsname entry>
Example: "jdbc:oracle:oci:@orcl"

16-16 Copyright © 2004, Oracle. All rights reserved.

JDBC URLs with Oracle Drivers


The basic structure of the JDBC URL for connecting to a database using one of the Oracle
JDBC drivers is jdbc:<subprotocol>:<driver>:<database>.
Oracle Thin driver
<driver> is thin.
<database> is a string of the form <host>:<port>:<sid>. That is, it is the host
name, TCP/IP port, and Oracle SID of the database to which you want to connect. For
example: jdbc:oracle:thin:@eduhost:1521:ORCL
Oracle OCI driver
<driver> is oci, oci8 or oci7, depending on which OCI driver you are using.
<database> is a TNSNAMES entry from the tnsnames.ora file. For example:
jdbc:oracle:oci:@eduhost

Oracle10g: Java Programming 16-16


Step 3: Creating a Statement

JDBC statement objects are created from the


Connection instance:
• Use the createStatement() method, which
provides a context for executing an SQL statement.
• Example:

Connection conn =
DriverManager.getConnection(
"jdbc:oracle:thin:@myhost:1521:ORCL",
"scott","tiger");
Statement stmt = conn.createStatement();

16-17 Copyright © 2004, Oracle. All rights reserved.

Statement Objects in JDBC


The execute() method is useful for dynamically executing an unknown SQL string.
JDBC provides two other statement objects:
• PreparedStatement, for precompiled SQL statements
• CallableStatement, for statements that execute stored procedures
Objects and Interfaces
java.sql.Statement is an interface, not an object. When you declare a Statement
object and initialize it using the createStatement() method, you are creating the
implementation of the Statement interface supplied by the Oracle driver that you are
using.

Oracle10g: Java Programming 16-17


Using the Statement Interface

The Statement interface provides three methods to


execute SQL statements:
• Use executeQuery(String sql)for SELECT
statements.
– Returns a ResultSet object for processing rows
• Use executeUpdate(String sql) for DML or
DDL.
– Returns an int
• Use execute(String) for any SQL statement.
– Returns a boolean value

16-18 Copyright © 2004, Oracle. All rights reserved.

Statement Objects in JDBC (continued)


Use executeQuery(String sql) for SELECT statements.
• Returns a ResultSet object for processing rows
Use executeUpdate(String sql) for DML or DDL.
• Returns an int value indicating number of rows affected by the DML; otherwise, it is
0 for DDL
Use execute(String) for any SQL statement.
• Returns a boolean value of true if the statement returns a ResultSet (such as a
query); otherwise, it returns a value of false

Oracle10g: Java Programming 16-18


Step 4a: Executing a Query

Provide a SQL query string, without semicolon, as an


argument to the executeQuery() method.
• Returns a ResultSet object:

Statement stmt = null;


ResultSet rset = null;
stmt = conn.createStatement();
rset = stmt.executeQuery
("SELECT ename FROM emp");

16-19 Copyright © 2004, Oracle. All rights reserved.

Execute a Query and Return a ResultSet Object


To query the database, use the executeQuery() method of your Statement object.
This method takes a SQL statement as input and returns a JDBC ResultSet object. This
statement follows standard SQL syntax.

Oracle10g: Java Programming 16-19


The ResultSet Object

• The JDBC driver returns the results of a query in a


ResultSet object.
• ResultSet:
– Maintains a cursor pointing to its current row of
data
– Provides methods to retrieve column values

16-20 Copyright © 2004, Oracle. All rights reserved.

The ResultSet Object


The ResultSet object is a table of data representing a database result set, which is
generated by executing a statement that queries the database.
A ResultSet object maintains a cursor pointing to its current row of data. Initially, the
cursor is positioned before the first row.
A default ResultSet object is not updatable and has a cursor that moves forward only.
Thus, it is possible to iterate through it only once, and only from the first row to the last row.
New methods in the JDBC 2.0 API make it possible to produce ResultSet objects that
are scrollable and updatable.

Oracle10g: Java Programming 16-20


Step 4b: Submitting DML Statements

1. Create an empty statement object:


Statement stmt = conn.createStatement();

2. Use executeUpdate to execute the statement:


int count = stmt.executeUpdate(SQLDMLstatement);

Example:
Statement stmt = conn.createStatement();
int rowcount = stmt.executeUpdate
("DELETE FROM order_items
WHERE order_id = 2354");

16-21 Copyright © 2004, Oracle. All rights reserved.

How to Update a Table in the Database


The slide shows the syntax for the methods that execute a database update using a DML
statement. Whereas executeQuery returns a ResultSet object containing the results
of the query sent to the DBMS, the return value for executeUpdate is an int that
indicates how many rows of a table were updated.
When the method executeUpdate is used to execute a DDL statement, such as in
creating a table, it returns the int 0.
When the return value for executeUpdate is 0, it can mean: (1) the statement executed
was an update statement that affected zero rows, or (2) the statement executed was a DDL
statement.
Example: Using the executeUpdate() method, the PICTURES table is populated with
the region_id from the regions table.
System.out.println("Table Insert");
stmt.executeUpdate ("INSERT INTO pictures (id)
SELECT region_id FROM regions");

Oracle10g: Java Programming 16-21


Step 4b: Submitting DDL Statements

1. Create an empty statement object:


Statement stmt = conn.createStatement();

2. Use executeUpdate to execute the statement:


int count = stmt.executeUpdate(SQLDDLstatement);

Example:
Statement stmt = conn.createStatement();
int rowcount = stmt.executeUpdate
("CREATE TABLE temp (col1 NUMBER(5,2),
col2 VARCHAR2(30)");

16-22 Copyright © 2004, Oracle. All rights reserved.

How to Create DDL Statements


The slide shows the syntax for the methods that execute a DDL statement.
executeUpdate() returns an int containing 0, for a statement with no return value,
such as a SQL DDL statement.

Oracle10g: Java Programming 16-22


Step 5: Processing the Query Results

The executeQuery() method returns a ResultSet.


• Use the next() method in loop to iterate through
rows.
• Use getXXX() methods to obtain column values
by column position in query, or column name.
stmt = conn.createStatement();
rset = stmt.executeQuery(
"SELECT ename FROM emp");
while (rset.next()) {
System.out.println
(rset.getString("ename"));
}

16-23 Copyright © 2004, Oracle. All rights reserved.

The getXXX() Methods


The ResultSet class has several methods that retrieve column values for the current row.
Each of these getXXX() methods attempts to convert the column value to the specified
Java type and return a suitable Java value. For example, getInt() gets the column value
as an integer, getString() gets the column value as a string, and getDate() returns
the column value as a date.
• The next() method returns true if a row was found; otherwise, it returns false.
Use it to check whether a row is available, and to step through subsequent rows.
• There are many getXXX() methods to get the column values, where XXX is a Java
data type. For example,
getString(pos) returns column in pos as a String,
getInt(idx) returns column in pos as an int,
and so on.
• There is a potential problem of database null values and trying to use getInt, and so
on, because Java primitives do not support null values. Usually, it is recommended that
you use getBigDecimal if numeric values have nulls.

Oracle10g: Java Programming 16-23


Step 6: Closing Connections

Explicitly close a Connection, Statement, and


ResultSet object to release resources that are no
longer needed.
• Call their respective close() methods:
Connection conn = ...;
Statement stmt = ...;
ResultSet rset = stmt.executeQuery(
"SELECT ename FROM emp");
...
// clean up
rset.close();
stmt.close();
conn.close();
...

16-24 Copyright © 2004, Oracle. All rights reserved.

Closing the ResultSet, Statement, and Connection Objects


You must explicitly close all ResultSet and Statement objects after you finish using
them. The close() methods clean up memory and release database cursors, so if you do
not explicitly close your ResultSet and Statement objects, serious memory leaks may
occur, and you may run out of cursors in the database. You then need to close the
connection.
The server-side driver runs within a default session. You are already connected, and you
cannot close the default connection made by the driver. Calling close() on the connection
does nothing.

Oracle10g: Java Programming 16-24


A Basic Query Example

import java.sql.*;
class TestJdbc {
public static void main (String args [ ]) throws SQLException {
DriverManager.registerDriver (new oracle.jdbc.OracleDriver());
Connection conn = DriverManager.getConnection
("jdbc:oracle:thin:@myHost:1521:ORCL","scott", "tiger");
Statement stmt = conn.createStatement ();
ResultSet rset = stmt.executeQuery
("SELECT ename FROM emp");
while (rset.next ())
System.out.println (rset.getString ("ename"));
rset.close();
stmt.close();
conn.close();
}
}

16-25 Copyright © 2004, Oracle. All rights reserved.

Oracle10g: Java Programming 16-25


Mapping Database Types to Java Types

ResultSet maps database types to Java types:


ResultSet rset = stmt.executeQuery
("SELECT empno, hiredate, job
FROM emp");
while (rset.next()){
int id = rset.getInt(1);
Date hiredate = rset.getDate(2);
String job = rset.getString(3);

Column Name Type Method

empno NUMBER getInt()

hiredate DATE getDate()

job VARCHAR2 getString()

16-26 Copyright © 2004, Oracle. All rights reserved.

Mapping Database Types to Java Types


In many cases, you can get all of the columns in your result set by using the getObject()
or getString() methods of ResultSet. For performance reasons, or because you want
to perform complex calculations, it is sometimes important to have your data in a type that
exactly matches the database column.
The JDBC section of the Java tutorial contains a matrix that maps ResultSet.getXXX
methods to ANSI SQL types. For each SQL type, the matrix shows:
• Which getXXX methods can be used to retrieve the SQL type
• Which getXXX method is recommended to retrieve the SQL type

Oracle10g: Java Programming 16-26


Mapping Database Types to Java Types (continued)
Table of ANSI SQL Types and Java Types
The following table lists the ANSI SQL types, the corresponding data type to use in Java,
and the name of the method to call in ResultSet to obtain that type of column value:

ANSI SQL Type Java Type ResultSet Method


CHAR, VARCHAR2 java.lang.String getString()
LONGVARCHAR java.io.InputStream getAsciiStream()
NUMERIC,DECIMAL java.math.BigDecimal getBigDecimal()
BIT boolean getBoolean()
TINYINT byte getByte()
SMALLINT short getShort()
INTEGER int getInt()
BIGINT long getLong()
REAL float getFloat()
DOUBLE,FLOAT double getDouble()
BINARY,VARBINARY byte[] getBytes()
LONGVARBINARY java.io.InputStream getBinaryStream()
DATE java.sql.Date getDate()
TIME java.sql.Time getTime()
TIMESTAMP java.sql.Timestamp getTimestamp()

Table of Oracle SQL Types

ORACLE SQL Type Oracle Type Type Extension


NUMBER Oracle.Types.NUMBER oracle.sql.NUMBER
CHAR Oracle.Types.CHAR oracle.sql.CHAR
RAW Oracle.Types.RAW oracle.sql.RAW
DATE Oracle.Types.DATE oracle.sql.DATE
ROWID Oracle.Types.ROWID oracle.sql.ROWID
BLOB Oracle.Types.BLOB oracle.sql.BLOB
CLOB Oracle.Types.CLOB oracle.sql.CLOB
BFILE n/a oracle.sql.BFILE
Structured object Oracle.Types.STRUCT oracle.sql.STRUCT
Object reference Oracle.Types.REF oracle.sql.REF
Collection(array) Oracle.Types.ARRAY oracle.sql.ARRAY

Oracle10g: Java Programming 16-27


Handling an Unknown SQL Statement

1. Create an empty statement object:


Statement stmt = conn.createStatement();

2. Use execute to execute the statement:


boolean isQuery = stmt.execute(SQLstatement);
3. Process the statement accordingly:
if (isQuery) { // was a query - process results
ResultSet r = stmt.getResultSet(); ...
}
else { // was an update or DDL - process result
int count = stmt.getUpdateCount(); ...
}

16-28 Copyright © 2004, Oracle. All rights reserved.

Dynamically Executing an Unknown SQL Statement


An application may not know whether a given statement returns a result set until the
statement has been executed. In addition, some stored procedures may return several
different result sets and update counts.
JDBC provides a mechanism so that an application can execute a statement and then process
an arbitrary collection of result sets and update counts. The mechanism is based on the use
of a general execute() method and then calls to three other methods: getResultSet,
getUpdateCount, and getMoreResults. These methods enable an application to
explore the statement results one at a time and determine whether a given result is a result
set or an update count.
execute() returns true if the result of the statement is a result set; it returns false if
the result of the statement is an update count. You can then call either getResultSet()
or getUpdateCount() on the statement.
The following example uses execute() to dynamically execute an unknown statement:

public void executeStmt (String statement) throws SQLException {


Statement stmt = conn.createStatement(); // Execute the statement
boolean isQuery = stmt.execute(statement);
if (isQuery ) { <statement was a query; process the results>
... }
else { <statement was an update or DDL>
int updateCount = stmt.getUpdateCount(); // Process the results
... }
Oracle10g: Java Programming 16-28
Handling Exceptions

• SQL statements can throw a


java.sql.SQLException.
• Use standard Java error handling methods.
try {
rset = stmt.executeQuery("SELECT empno,
ename FROM emp");
}
catch (java.sql.SQLException e)
{ ... /* handle SQL errors */ }
...
finally { // clean up
try { if (rset != null) rset.close(); }
catch (Exception e)
{ ... /* handle closing errors */ }
...

16-29 Copyright © 2004, Oracle. All rights reserved.

Handling Exceptions
You can use the try-catch-finally block structure for closing resources.
Code Example
Connection conn = null; Statement stmt = null;
ResultSet rset = null; // initialize
stmt = conn.createStatement();
try {
rset = stmt.executeQuery("SELECT empno, ename FROM emp");
}
catch (java.sql.SQLException e)
{ ... /* handle errors */ }
...
// Clean up resources
finally {
try { if (rset != null) rset.close(); } catch (Exception e) {}
try { if (stmt != null) stmt.close(); } catch (Exception e) {}
try { if (conn != null) conn.close(); } catch (Exception e) {}
}
Oracle10g: Java Programming 16-29
Managing Transactions

• By default, connections are in autocommit mode.


• Use conn.setAutoCommit(false)to turn
autocommit off.
• To control transactions when you are not in
autocommit mode, use:
– conn.commit(): Commit a transaction
– conn.rollback(): Roll back a transaction
• Closing a connection commits the transaction
even with the autocommit off option.

16-30 Copyright © 2004, Oracle. All rights reserved.

Transactions with JDBC


After you perform an UPDATE or INSERT operation in a result set, you propagate the
changes to the database in a separate step that you can skip if you want to cancel the
changes.
With JDBC, database transactions are managed by the Connection object. When you
create a Connection object, it is in autocommit mode (which means that each statement
is committed after it is executed).
You can change the connection’s autocommit mode at any time by calling
setAutoCommit(). The following is a full description of autocommit mode:
• If a connection is in autocommit mode, all its SQL statements are executed and
committed as individual transactions.
• If a statement returns a result set, the statement finishes when the last row of the result
set has been retrieved or the result set has been closed.
• If autocommit mode has been disabled, its SQL statements are grouped into
transactions, which must be terminated by calling either commit() or
rollback(). The commit() method makes permanent all changes because the
previous commit or rollback releases any database locks held by the connection.
• rollback() drops all changes because the previous commit or rollback releases any
database locks. commit() and rollback() must be called only when you are not
in autocommit mode.
Note: The server-side driver does not support autocommit mode. You must control
transactions explicitly.
Oracle10g: Java Programming 16-30
The PreparedStatement Object

• A PreparedStatement prevents reparsing of SQL


statements.
• Use this object for statements that you want to
execute more than once.
• A PreparedStatement can contain variables that
you supply each time you execute the statement.

16-31 Copyright © 2004, Oracle. All rights reserved.

PreparedStatement
PreparedStatement is inherited from Statement; the difference is that
PreparedStatement holds precompiled SQL statements.
If you execute a Statement object many times, its SQL statement is compiled each time.
PreparedStatement is more efficient because its SQL statement is compiled only once,
when you first prepare PreparedStatement. After that, each time you execute the SQL
statement in PreparedStatement, the SQL statement does not have to be recompiled.
Therefore, if you need to execute the same SQL statement several times in an application, it
is more efficient to use PreparedStatement than Statement.
PreparedStatement Parameters
PreparedStatement does not have to execute exactly the same query each time. You
can specify parameters in the PreparedStatement SQL string and supply the actual
values for these parameters when the statement is executed.
The next slide shows how to supply parameters and execute a prepared statement.

Oracle10g: Java Programming 16-31


How to Create a PreparedStatement

1. Register the driver and create the database


connection.
2. Create the PreparedStatement, identifying
variables with a question mark (?):

PreparedStatement pstmt =
conn.prepareStatement
("UPDATE emp SET ename = ? WHERE empno = ?");

PreparedStatement pstmt =
conn.prepareStatement
("SELECT ename FROM emp WHERE empno = ?");

16-32 Copyright © 2004, Oracle. All rights reserved.

Creating a PreparedStatement
To write changes to the database, such as for INSERT or UPDATE operations, you typically
create a PreparedStatement object. You can use the PreparedStatement object
to execute a statement with varying sets of input parameters. The prepareStatement()
method of your JDBC Connection object allows you to define a statement that takes bind
variable parameters, and returns a JDBC PreparedStatement object with your
statement definition.

Oracle10g: Java Programming 16-32


How to Execute a PreparedStatement

1. Supply values for the variables:


pstmt.setXXX(index, value);
2. Execute the statement:
pstmt.executeQuery();
pstmt.executeUpdate();

int empNo = 3521;


PreparedStatement pstmt =
conn.prepareStatement("UPDATE emp
SET ename = ? WHERE empno = ? ");
pstmt.setString(1, "DURAND");
pstmt.setInt(2, empNo);
pstmt.executeUpdate();

16-33 Copyright © 2004, Oracle. All rights reserved.

Specifying Values for the Bind Variables


You use the PreparedStatement.setXXX() methods to supply values for the
variables in a prepared statement. There is one setXXX() method for each Java type:
setString(), setInt(), and so on.
You must use the setXXX() method that is compatible with the SQL type of the variable.
In the example in the slide, the first variable is updating a VARCHAR column, and so you
must use setString() to supply a value for the variable. You can use setObject()
with any variable type.
Each variable has an index. The index of the first variable in the prepared statement is 1, the
index of the second variable is 2, and so on. If there is only one variable, its index
is 1. The index of a variable is passed to the setXXX() method.
Closing a PreparedStatement
A PreparedStatement is not cached. If you close it, you will have to start again.

Oracle10g: Java Programming 16-33


Maximize Database Access

• Use connection pooling to minimize the operation


costs of creating and closing sessions.
• Use explicit data source declaration for physical
reference to the database.
• Use the getConnection() method to obtain a
logical connection instance.

16-34 Copyright © 2004, Oracle. All rights reserved.

Connection Pooling Presentation


A connection pool is a cache of database connections. It is maintained in memory, which
enables the connections to be reused. This technique is important for increasing
performance, especially when the JDBC API is used in a middle-tier environment.
Connection pooling does not affect application code. The application simply accesses a
JDBC data source and uses it in the standard way. The data source implements connection
pooling transparently to the application by using the PooledConnection and
ConnectionPoolDataSource facilities provided by the JDBC 2.0 driver.

Oracle10g: Java Programming 16-34


Connection Pooling
Middle tier

Java servlet

Data source

Middle-tier server code

ConnectionPoolDataSource
JDBC Database
driver

Database
commands

16-35 Copyright © 2004, Oracle. All rights reserved.

Connection Pooling Presentation (continued)


When using pooled connections, you must perform the following two steps:
• Use a DataSource object rather than the DriverManager class to get a
connection. The DataSource object is implemented and deployed so that it will create
pooled connections.
• Use a finally statement to close a pooled connection. The following finally
statement appears after the try and catch blocks that apply to the code in which the
pooled connection is used:
try { Connection con =
ds.getConnection("Login","Password");
// ... code to use the pooled connection con
}
catch (Exception ex {
// . . . code to handle exceptions
}
finally {
if(con != null) con.close();
}
Note: Connection pooling is supported in both JDK1.1 and JDK 1.2 OCI and thin drivers.
Connection pooling is not supported for the server driver because the server driver can have
only one connection, which is to the logged-in session in which it is running.

Oracle10g: Java Programming 16-35


Connection Pooling Presentation (continued)
A Simple Pooled Connection Sample
import java.sql.*;
import javax.sql.*;
import oracle.jdbc.*;
import oracle.jdbc.pool.*;
class PooledConnection1
{
public static void main (String args [])
throws SQLException
{
// Create a OracleConnectionPoolDataSource instance
OracleConnectionPoolDataSource ocpds =
new
OracleConnectionPoolDataSource();
String url = "jdbc:oracle:oci8:@";
try {
String url1 = System.getProperty("JDBC_URL");
if (url1 != null)
url = url1;
} catch (Exception e) {
// If there is any security exception,
// ignore it and use the default
}

Oracle10g: Java Programming 16-36


Connection Pooling Presentation (continued)
A Simple Pooled Connection Sample (continued)
// Set connection parameters
ocpds.setURL(url);
ocpds.setUser("scott");
ocpds.setPassword("tiger");
// Create a pooled connection
PooledConnection pc = ocpds.getPooledConnection();
// Get a Logical connection
Connection conn = pc.getConnection();
// Create a Statement
Statement stmt = conn.createStatement ();
// Select the ENAME column from the EMP table
ResultSet rset = stmt.executeQuery ("select ENAME from
EMP");
// Iterate through the result and print the employee names
while (rset.next ())
System.out.println (rset.getString (1));
// Close the ResultSet
rset.close();
rset = null;
// Close the Statement, logical connection, and pooled
connection
stmt.close();
stmt = null;
conn.close();
conn = null;
pc.close();
pc = null;
}
}

Oracle10g: Java Programming 16-37


Summary

In this lesson, you should have learned the following:


• JDBC provides database connectivity for various
Java constructs, including servlets and client
applications.
• JDBC is a standard Java interface and part of the
J2SE.
• The steps for using SQL statements in Java are
Register, Connect, Submit, and Close.
• SQL statements can throw exceptions.
• You can control default transactions behavior.

16-38 Copyright © 2004, Oracle. All rights reserved.

Oracle10g: Java Programming 16-38


Practice 16: Overview

This practice covers:


• Setting up the Java environment for JDBC
• Adding JDBC components to query the database
• Populating the OrderEntryFrame with Customers
from the database

16-39 Copyright © 2004, Oracle. All rights reserved.

Practice 16: Overview


Note: If you have successfully completed the previous practice, then continue using the
same directory and files. If the compilation from the previous practice was unsuccessful and
you want to move on to this practice, then change to the les15 directory, load the
OrderEntryWorkspaceLes15 workspace, and continue with this practice.
Viewing the model: To view the course application model up to this practice, load the
OrderEntryWorkspaceLes15 workspace. In the Applications – Navigator node,
expand the OrderEntryWorkspaceLes15 – OrderEntryProjectLes15 -
Application Sources – oe, and double-click the UML Class Diagram1 entry.
This diagram displays all the classes created to this point in the course.
Instructor Note
In the previous practices, the phone number was defined as a String. However, in the
database it is stored as a complex object type. A utility, named JPublisher, can be used to
convert an object type to a string, so that it can be used in your application. This process is
much more detailed than can be covered in this course. So in the JDBC practice, the phone
number item will not be populated with any values. For more information about converting
object types, please attend the Oracle9i: Access the Database with JDBC and Stored
Procedures course.

Oracle10g: Java Programming 16-39


Practice 16: Using JDBC to Access the Database
Goal
The goal of this practice is to use the course application to interact with the Oracle database.
During this practice, you perform query statements to access a database and integrate them
into the application.
Note: If you have successfully completed the previous practice, then continue using the
same directory and files. If the compilation from the previous practice was unsuccessful and
you want to move on to this practice, then change to the les15 directory, load the
OrderEntryWorkspaceLes15 workspace, and continue with this practice.
Your Assignment
In the DataMan class, you specify the code to connect to the database, to query a single
column from a table. Then you modify the OrderEntryFrame class and integrate the
rows returned from the database into the GUI interface.
Set the Environment to Use JDBC
1. Update the project to include necessary JDBC classes.
a. Double-click the OrderEntryProjectLes16, and select the Libraries node.
b. In the Available Libraries pane, find and move the Oracle JDBC
library to the Selected Libraries pane. Click OK.
Add JDBC Components to Query the Database
2. Modify the DataMan class and provide the connection information.
Note: Place the database related code in the try block.
a. Specify the packages to import.
import java.sql.*;
b. Find the code section where the ProductMap class variables are being
declared. Add a static variable to hold the connection information.
private static Connection conn = null;
c. Add the try { in the code block shown here because the exception portion is
shown. Also, finish the syntax for the exception section and add the missing
start brace. So, the corrected code block would look like:
“try{
// Register the Oracle JDBC driver
DriverManager.registerDriver(new
oracle.jdbc.OracleDriver());
// Define the connection url (include db conn)
String url = "jdbc:oracle:thin:@myhost:1521:SID";
// Provide db connection information
conn = DriverManager.getConnection (url,
“ora<n>”,”oracle”);
//Include an Exception in the catch block
}catch (Exception e){
}
d. Save and compile the DataMan.java file. Correct any errors.

Oracle10g: Java Programming 16-40


Practice 16: Using JDBC to Access the Database (continued)
3. Create a method to execute the select statement based on a customer number, and
return the result to a customer object. Remember the method name for later. In this
practice, you populate only three of the items from the database. In the previous
practices, the phone number was defined as a String. However, in the database, it is
stored as a complex object type. A utility, named JPublisher, can be used to convert an
object type to a string, so that it can be used in your application. This process is much
more detailed than can be covered in this course. So in your JDBC practice, the phone
number item will not be populated with any values. For more information about
converting object types, please attend the Oracle9i: Access the Database with JDBC and
Stored Procedures course.
a. Following the code to connect to the database, create the method to issue the
query based on a customer ID.
public static Customer selectCustomerById(int id)
throws Exception
{
Customer customer = null;

Statement stmt = conn.createStatement ();


System.out.println("Table Customers query for customer
with id: " + id);
ResultSet rset = stmt.executeQuery ("SELECT
cust_last_name, nls_territory" + "FROM customers
WHERE customer_id = " + id);
b. If a record is returned, populate the customer object.
if (rset.next ())
{
customer = new Customer();
customer.setId(id);
customer.setName(rset.getString(1));
//holds first column
customer.setAddress(rset.getString(2));
//holds second column
System.out.println("Customer found: " + customer);
// prints all three columns to the command window
}

Oracle10g: Java Programming 16-41


Practice 16: Using JDBC to Access the Database (continued)
c. Otherwise, throw an exception that the customer is not found, close the
statement, and return the customer.
else
{
throw new NotFoundException("Customer with id " +
id + " not found");
}
rset.close();
stmt.close();
return customer;
}
d. Save and compile the DataMan.java file. Correct any errors."
Populate the OrderEntryFrame with Database Customers
4. Modify the OrderEntryFrame to populate the customer with those coming from
the database.
a. Open the OrderEntryFrame.java class in the Code Editor, and search for
the findBtn_actionPerformed() method. In this method, locate the line
of code where the customer object is being set:
customer=DataMan.findCustomerById(custId);
Remove this comment line from this line and add a line to populate the customer
object from the database method you created in DataMan.java (that is,
selectCustomerById()):
customer=DataMan.selectCustomerById(custId);
b. In the following catch block, remove the Notfound part of the exception. You
want to catch the exception from DataMan if no customer is found.
catch (NotFoundException err)
changes to
catch (Exception err)
c. Compile and test the application. Try retrieving records from customer 101, 103,
308, 203, 341, and 999. Did they all return a customer? If not, did you see the
exception raised?

Oracle10g: Java Programming 16-42


Deploying Applications by Using
Java Web Start

Copyright © 2004, Oracle. All rights reserved.

Schedule: Timing Topic


20 minutes Lecture
30 minutes Practice
50 minutes Total
Objectives

After completing this lesson, you should be able to do


the following:
• Define the architecture of Java Web Start
• Describe the benefits of using Java Web Start
• Deploy an application by using Web Start

17-2 Copyright © 2004, Oracle. All rights reserved.

Lesson Aim
This lesson describes how to deploy a Java application by using WebStart. The lesson covers the
sequence of steps necessary to create a deployment profile and an application archive. After the
application archive has been created and deployed, the lesson describes the role of the Java
Network Launching Protocol (JNLP) file and how to create it.

Oracle10g: Java Programming 17-2


What Is Java Web Start?

• It is an application deployment technology based


on the Java 2 platform.
• It launches full-featured applications via any
browser on any platform, from anywhere on the
Web.

17-3 Copyright © 2004, Oracle. All rights reserved.

What Is Java Web Start?


Java Web Start is a new application deployment technology created by Sun Microsystems, Inc.
You can use Java Web Start to launch full-featured applications via any browser on any
platform, from anywhere on the Web. After your application is launched and is running, the
browser can be closed and your application will continue to run. Because Java Web Start
applications are not tied to the Web browser, one benefit is that you can keep your old
applications and not have to trade them for a version based on an HTML interface that runs in a
Web browser.
JDeveloper supports the creation of the XML-based JNLP definition on which the Java Web
Start technology is based. By using Java Web Start and the JClient Java Web Start Wizard in
JDeveloper, you can set up JClient applications to be maintained on the Web server. However,
they are downloaded and run on the client machines.
Instructor Note
Remind the students about JClient from the lesson titled “User Interface Design: Swing Basics
Planning the Application Layout.” You can create Java client applications that relys on standard
Swing components in your application. The Java client application in JDeveloper is known as a
JClient application. When a JClient form has been deployed to a client machine, users can use it
to display and manipulate data in the form. This course is not intended to teach about JClient,
only to show how to develop Java Applications by using JDeveloper.

Oracle10g: Java Programming 17-3


Running a Web Start Application

1. Request the
application.
2. Launch Web Start on
1 HTTP 2
the local machine.
3. Download the
application.
3
4. Launch the
HTTP
application (Draw).
4

17-4 Copyright © 2004, Oracle. All rights reserved.

Java Web Start Architecture: Overview


The Java Web Start software must be installed on your machine before you can launch an
application.
1. When you click a download link, the link instructs the browser to invoke Java Web Start. A
JNLP file runs the application.
2. Java Web Start technology queries the Web to determine whether all the resources that are
needed for the application are already loaded. If they are, and if the most recent version of
the application is present, then the application will be launched.
3. The application is launched.
If the application is not present on your computer, then Java Web Start automatically downloads
all the necessary files from the Web server where the application libraries reside. These files are
cached on the client machine so that the application is always ready to be relaunched any time
either from an icon on your desktop or from the browser link. The most current version of the
application is always presented to you because Java Web Start performs updates as needed.

Oracle10g: Java Programming 17-4


Advantages of Web Start

• Renders a very responsive and rich user interface


• Launches applications from the Start menu on the
desktop
• Does not require browser to be running
• Allows applications to work offline
• Automatically updates applications when invoked

17-5 Copyright © 2004, Oracle. All rights reserved.

Advantages of Web Start


Java Web Start Features
Web Start is as easy to deploy as HTML with the richness of full-featured GUI applications.
Applications can be launched using a browser, on any type of platform, from anywhere on an
intranet or the Internet. A small, one-time download of the application is required on initial
launching. Subsequent access is provided from the local cache and the application launches more
quickly. It works like a browser plug-in, similar to RealAudio.
Java 2 Platform Supports
• Multiple JREs
• Sandboxing
• Secure code-signing
• Incremental versions
• Interaction with the desktop
• Offline operation

Oracle10g: Java Programming 17-5


Examining the JNLP File

The JNLP files defines:


• The location of the application resources
• Information that appears while the application loads
• What the application resources are

17-6 Copyright © 2004, Oracle. All rights reserved.

Using the JNLP File


Java Web Start technology enables Web deployment by using existing Internet protocols:
Applications are launched when a client accesses (typically, by clicking a link in an HTML
page) a special launch file with a .jnlp file name extension.
The Web Start technology is built on the JNLP API. The JNLP API provides services that enable
applications to obtain information not normally available using the Java 2, Standard Edition
(J2SE) platform API. These services include accessing the system clipboard, controlling resource
caching, importing files from a local disk, and so on.
The task of packaging for deployment is where the JNLP comes into play. In addition to a JAR
file for the application classes, JNLP requires that you create a descriptor file on how to start up
the application.
JNLP also requires that you provide the location of the application resources, what information
must be displayed in the window that appears while the application loads, and what the
application resources are.

Oracle10g: Java Programming 17-6


Deploying Applications with JDeveloper

The JDeveloper Deployment Profile Wizard:


• Detects interclass dependencies
• Creates .ear, .war, .jar, or .zip files
• Enables you to have control over other files added
to the deployed archive
• Enables you to save deployment profile settings in
project files:
– To simplify redeployment when code changes
– That can be automatically updated with new classes
as they are added to the project

17-7 Copyright © 2004, Oracle. All rights reserved.

Deploying Applications with JDeveloper


Oracle JDeveloper provides a deployment wizard that helps with most of the tedious tasks
associated with deploying your application.
The wizard detects classes that are used in your application and proposes them to be included in
the archive file it will create for you. It also allows you to specify rules for the inclusion of files
into the archive. These rules provide an easy way to control which file types are automatically
selected for inclusion.
The wizard also provides a dialog box for you to add other files that were not detected by the
wizard. The wizard can detect dependencies only between classes recognized at compile time. It
does not recognize required resource files, such as image and sound files, or dynamically loaded
classes. These files are proposed by the wizard only if they are included in the project.
Any settings you choose or set with the deployment wizard are maintained in profiles and are
accessible any time you run the wizard.
It is a good idea to rebuild the project before deploying your application.

Oracle10g: Java Programming 17-7


Creating the Deployment Profile File

Select File > New

17-8 Copyright © 2004, Oracle. All rights reserved.

Running the Deployment Wizard


You run a deployment wizard by selecting a project, then File > New, and then
selecting the Deployment Profiles category. To create a deployment profile
for your application from the Items list, select either one of the following:
• JAR File: Simple Archive
• WAR File: J2EE Web Module
If JDeveloper generated an existing profile during the creation of the application HTML file,
then the above actions are not required. The deployment profile generated during the application
HTML file is a WAR file profile.
Other Types of Deployment
• JAR File: Deploys applications and JavaBeans.
• Stored Procedures to Oracle: Deploys stored procedures to an Oracle database
• J2EE: Deploys an Enterprise JavaBean to an Oracle database
• J2EE: Client Module: Creates a deployment profile containing Java application in a JAR
file XML descriptor file
• Business Components: Creates an EJB, Common Object Request Broker Architecture
(CORBA), or Archive profile

Oracle10g: Java Programming 17-8


Saving the Deployment Profile

Select a destination and name for the deployment


profile.

17-9 Copyright © 2004, Oracle. All rights reserved.

Deployment Profile Wizard: Staging Area


On the Save Deployment Profile page of the Deployment Profile Wizard, you define the
destination on your local machine for staging the development file and the name of the
deployment profile file. When you invoke a deployment profile, the first window displayed
contains the following:
• Location: For selecting the directory used as the destination for deployment. Enter a path
on your local machine for staging all the files associated with your project.
• File name: For saving the deployment profile settings
Click the Save button to save the settings selected in your project.

Oracle10g: Java Programming 17-9


Selecting Files to Deploy

Select the file types to include. Other settings differ for


other deployment profile types.

17-10 Copyright © 2004, Oracle. All rights reserved.

Project Files to Deploy


You can include any file from your project in the archive, though the .html file you use to run
an application must be deployed in the parent directory of the archive file.
As a default, the deployment wizard selects all files in your current project for deployment. You
can cancel the selection of the files that must not be included by clearing its check box. Select
the type of files you want to deploy:
• Compiled output only
• Source files only
• Both compiled output and source files.
For more control over deployment, click the other pages. The JAR Options page handles
additional parameters for the JAR and manifest file. The Dependency Analyzer displays libraries
included in your project’s current active configuration.
If the Automatically Include Files Added to Project check box is selected, the profile will be
updated automatically to include new files as they are added to the project. If you clear this
setting, you must manually select the files to be included by editing the profile file.
Note: The slide shows the profile settings for creating a JAR File - Simple Archive deployment
profile. The number and choices of settings will be different for other types of deployment
profiles—for example, WAR File - J2EE Archive requires a Web server context root name.

Oracle10g: Java Programming 17-10


Making an Executable .jar File

Set the Main Class field to the class name containing a


main() method, in JAR Options.

17-11 Copyright © 2004, Oracle. All rights reserved.

Creating an Executable .jar File


In settings, click the JAR Options node in the navigation list, and select the Include Manifest File
check box. In the Main Class field, enter the fully qualified name, without the .class
extension, of the class containing the main() method you invoke when using the java –jar
command-line option.
For example
If the generated JAR archive file is called OrderEntry.jar , execute the main application
class as follows:
java -jar OrderEntry.jar
If you do not enter a name in the Main Class field for the JAR archive, you can still execute any
class with a main() method contained in the JAR file from the command line as follows:
1. Set the CLASSPATH to include the Java Archive file name java
package.ClassName
Or use the -classpath command-line option as follows:
java -classpath {archivefilename}.jar package.ClassName

Oracle10g: Java Programming 17-11


Creating and Deploying the Archive File

• Right-click the Deployment Profile file.


• Select the Deploy to menu option.
• The .jar file is created in the directory listed in
the deployment properties.

17-12 Copyright © 2004, Oracle. All rights reserved.

Deploying the .jar File


1. In the System Navigator pane, select Deployment Profile and right-click.
2. Select the Deploy to JAR file menu option to deploy the archive.
3. The Java Archive will be placed in the directory listed in the JAR Options, JAR File
properties of the archive.
Editing the Profile File
To edit the simple archive profile setting, select the archive profile, right-click, and select
Settings, or double-click the Deployment Profile filename in the Navigator.
Deploying an Application or WAR file to Oracle Application Server
If you need to deploy the application to an application server, such as Oracle AS, you must use
the Oracle Connection Manager to form a connection with the application server. The instructor
and practices provide you with the instructions on how to accomplish this task.
To deploy to the target platform, after the connection name has been created, you right-click the
Deployment Profile file and select the menu entry as follows:
Deploy To Java Archive (JAR) File

Oracle10g: Java Programming 17-12


Using JDeveloper to Deploy an Application
to Java Web Start

Step 1: Generate deployment profiles and archive the


application.
Step 2: Start OC4J and create a connection.
Step 3: Use Web Start Wizard to create JNLP file.
Step 4: Archive and deploy your application to OC4J
server.

17-13 Copyright © 2004, Oracle. All rights reserved.

How to Deploy a Java Web Application to Java Web Start


You can use JDeveloper’s simple J2EE Web deployment process to set up the Web server before
downloading and running the application by using Java Web Start. The process of deploying is
similar whether you intend to deploy to the JDeveloper-embedded OC4J server or a production
OC4J Web server.
First, you create a deployment archive of your Java application by using a deployment wizard.
The result is the creation of a .jar file that contains all your application files.
Second, you must install and start the application server that is used to deliver the application. If
you use the OC4J server that comes with JDeveloper, this task is done from the command line.
Third, use the wizard in JDeveloper to create JNLP. You may want to store all the deployment
files (HTML, JNLP, XML) in a different JDeveloper project.
Finally, create a J2EE Web deployment file containing deployment-specific information and the
appropriate deployment descriptor.

Oracle10g: Java Programming 17-13


Step 1: Generate Deployment Profiles and
Archive Application

Package all the Java application files into a simple


.jar archive.

17-14 Copyright © 2004, Oracle. All rights reserved.

Step 1: Generate Deployment Profiles and Archive Application


JDeveloper has various deployment modes for different applications. However, you may want to
quickly and simply deploy your application as a JAR or ZIP file to your file system.
A J2EE Client module is packaged as a client JAR file, which contains one or more Java
application components and a client deployment descriptor file named application-
client.xml. You can make your simple archive or J2EE Client module into an executable
JAR file that you can launch with the java -jar OrderEntry.jar command.
After you have created the deployment profile containing the Java application components and
the deployment descriptor file, and have packaged them into a standard J2EE archive, you can
proceed to deploy the client JAR to the application server.

Oracle10g: Java Programming 17-14


Step 2a: Start OC4J

Use the command line to start the server.

17-15 Copyright © 2004, Oracle. All rights reserved.

Step 2a: Start OC4J


Oracle JDeveloper is packaged with OC4J Release 9.0.5.1 and is the default application server
when running, debugging, profiling, and Code Coaching application code directly in
JDeveloper’s embedded OC4J server.
You can also use the OC4J server outside of JDeveloper, as a stand-alone application server for
delivering your Java application.
Before you can use OC4J, it must be installed. Installation and running the stand-alone OC4J
server is accomplished outside of JDeveloper, from the command-line interface.

Oracle10g: Java Programming 17-15


Step 2b: Creating a Connection

Use the Connection Wizard to create a connection to


the application server. You must specify:
• The type of connection (OC4J)
• The username and password for authentication
• Local URL, target Web site, and local directory for
OC4J

17-16 Copyright © 2004, Oracle. All rights reserved.

Using the Connection Wizard


The Connection Wizard guides you through the process of specifying all the appropriate
information to create and test a connection. Select a connection type. The type you select
determines the fields displayed on the subsequent Connection Wizard pages. Select Standalone
OC4J to create a connection to a stand-alone OC4J instance (Oracle AS Containers for J2EE)
that is not running within an Oracle AS machine.
Use this Connection page to configure the stand-alone Oracle AS Containers for Java 2
Enterprise Edition (OC4J) connection. You will be prompted to enter the URL for the OC4J
transport protocol, also known as Orion Remote Method Invocation (ORMI). ORMI is a custom
wire protocol for Java Remote Method Invocation (RMI) and is used transparently by RMI.
Remote Method Invocation (RMI) enables a programmer to create distributed Java to Java
applications, in which the methods of remote Java objects can be invoked from other Java
Virtual Machines, even on different hosts. A client can call a remote object in a server, and that
server can also be a client of other remote objects. RMI uses object serialization to monitor and
control parameters and supports true object-oriented polymorphism.

Oracle10g: Java Programming 17-16


Step 3: Use Web Start Wizard to Create
a JNLP File

• Specify the Web Start name, application archive


(.jar), and main application class.

• Include information to be displayed to the user


while downloading (for example, application title,
vendor, and brief description)

17-17 Copyright © 2004, Oracle. All rights reserved.

Step 3: Use Web Start Wizard to Create a JNLP file


You use the Java Web Start Wizard to create an XML-based JNLP definition, which the Java
Web Start software uses to download and run the application on the client machine.
This wizard creates the complete JNLP file and an optional HTML file to launch your Web Start
application.

Oracle10g: Java Programming 17-17


Step 4: Archive and Deploy the Application
to the OC4J Server

• Specify properties of the Web components and


deployment description.

• Deploy to the OC4J connection created in step 2.


• Run the generated HTML file.
17-18 Copyright © 2004, Oracle. All rights reserved.

Step 4: Archive and Deploy the Application to the OC4J Server


A J2EE Web module is packaged as a Web Archive (WAR) file which contains one or more
Web components (servlets, JSPs) as well as the standard J2EE Web deployment descriptor,
web.xml, and the OC4J-specific deployment descriptor, webapp.xml.
After you have created the deployment profile containing the Web components and the
appropriate deployment descriptor files, you can deploy it as a WAR or a standard J2EE
Enterprise Archive (EAR) file. JDeveloper takes the resulting EAR and deploys it to the target
application server.

Oracle10g: Java Programming 17-18


Summary

In this module, you should have learned how to:


• Describe how a Java Web Start application runs
• Describe the benefits of using Java Web Start
• Use JDeveloper to deploy an application by using
Web Start

17-19 Copyright © 2004, Oracle. All rights reserved.

Oracle10g: Java Programming 17-19


Practice 17: Overview

This practice covers the following topics:


• Archiving your Java application
• Creating a new project to hold the Web Start files
and setting the OC4J server preference
• Installing and starting the stand-alone OC4J
application server
• Creating an application server connection in
JDeveloper
• Archiving and deploying the application files to
OC4J, and testing the application

17-20 Copyright © 2004, Oracle. All rights reserved.

Practice 17: Overview


Note: To complete this practice, you must navigate to the OrderEntryWS directory and load
the OrderEntryWorkspaceWS workspace. Do not continue with the workspace you were
using for the previous practice.
Viewing the model: To view the course application model up to this practice, load the
OrderEntryWorkspaceLes16 workspace. In the Applications – Navigator node, expand
the OrderEntryWorkspaceLes16 – OrderEntryProjectLes16 -
Application Sources – oe, and double-click the UML Class Diagram1 entry. This
diagram displays all the classes created to this point in the course.
Instructor Note
This practice uses the Java application solution from the lesson titled “Adding User Interface
Components and Event Handling.” Make sure the students switch over the OrderEntryWS
workspace. The reason for using this workspace is that this application does not include JDBC
and is much simpler and more likely to deploy successfully. There are a few extra required steps
to deploy an application that uses JDBC, which require more detail than needed in this course.

Oracle10g: Java Programming 17-20


Practice 17: Deploying an Application to Java Web Start
Goal
In this practice, you learn to deploy your Java application to OC4J server, using Java Web Start.
Note: To complete this practice, you must navigate to the OrderEntryWS directory and load
up the E:\labs\OrderEntryWS\OrderEntryWorkspaceWS.jws workspace. Do not
continue with the workspace you were using for the practice for lesson 16 on JDBC.
Your Assignment
The company has standardized to deploy Java applications so that they may be run from a
browser or as a stand-alone application from the desktop. In this practice, you will:
• Archive your Java application and create a new project to hold the Web Start files
• Install and start the stand-alone OC4J application server and create an application server
connection in JDeveloper
• Create the JNLP Web Start file
• Archive and deploy the Web Start and application files to OC4J
• Run the application from a browser and the desktop
Archive Your Java Application
1. Use the JDeveloper deployment wizard to create a simple JAR archive for
deployment. With the OrderEntryProjectWS project selected, invoke the gallery
and navigate to the General - Deployment Profiles node.
a. Select JAR file and click OK. Accept the default filename (archive1) and click OK.
b. In the Jar Deployment Profile Properties pane, expand the File Groups, Projects
Output, Filters node and ensure all the files are selected, press OK.
c. In the Navigator pane a new deployment profile object will be listed within your
project, named archive1.deploy. Select the file, right-click and select Deploy to
JAR File. Make sure there are no errors and the deployment is successful.
Create a New Project to Hold the Web Start Files and Set the OC4J Server Preference
2. To keep deployment files separate from application files, create a second project in
the workspace to hold your Web Start deployment files.
a. With the OrderEntryProjectWS workspace selected, invoke the gallery and
navigate to the General node. Select Empty Project and click OK. Accept the default
values and click OK. Double-click the project, and ensure J2EE is available in the
Selected Libraries.
b. In the Tools menu select the Embedded OC4J Server
Preferences option nder the lobal
tartup node in the middle of the
window select the pecific ost Name radio button
and enter localhost in the field
c lick

Oracle10g: Java Programming 17-21


Practice 17: Deploying an Application to Java Web Start (continued)
Install and Start the Stand-Alone OC4J Application Server
3. To run the application outside JDeveloper, you must install and start the external
OC4J server.
a. Open a DOS window and change the directory to the OC4J home. This is
in the E:\jdev9051\j2ee\home subdirectory relative to the JDeveloper home
(ask your instructor for the specific details).
b. Start the stand-alone OC4J application server by entering the following command in
the DOS window:

java –jar oc4j.jar

(The command depends on the DOS Path environment variable being set to use the
Java JDK and run-time environment. The Path environment must include something
like D:\jdev\jdk\jre\bin).
Note: If this command prompts you for an administrator password as follows:
Enter an admin password to use:
Click Enter to accept and use the default. The default password is welcome.
Remember the password; you will need it while creating a Connection.
Important: When OC4J starts, text similar to the following should be displayed:
Oracle Application Server Containers for J2EE 10g
(9.0.4.0.0) initialized.
Do not close the DOS window. Later, you start another DOS window and
enter a command to gracefully shut down the OC4J server.
Create an Application Server Connection in JDeveloper
4. To deploy the application to the OC4J server, you must create a connection in
JDeveloper.
a. In the Navigator, select the Connections tab, then right-click the Application Server
node, and select the New Application Server Connection option.
b. Click Next in the Welcome page of the Connection Wizard. In Step 1 of 4: Type
page, enter the connection name OC4J, leaving the Connection Type at its default
(Standalone OC4J). Click Next.
c. In the Step 2 of 4: Authentication page, enter welcome in the Password field,
leaving the Username at its default (admin). Do not select the Deploy Password
check box. Click Next.
d. In the Step 3 of 4: Connection page, accept the default values and click Next.
e. In the Step 4 of 4: Test page, click the Test Connection button, and verify whether
you can successfully connect to the running OC4J application server. Correct any
problems, asking the instructor for help, if necessary.
Note: If you were successful in making a connection, the area below the Test
Connection button should display the text: Success!
f. Click Finish, to complete this step.

Oracle10g: Java Programming 17-22


Practice 17: Deploying an Application to Java Web Start (continued)
Create the JNLP Web Start File
5. To run an application using Web Start, you need a JNLP file.
a. First, be sure that your new project (Project1.jpr) is currently selected in
Applications Navigator.
b. Then, invoke the New gallery (Select File > New). Expand the Client Tier node and
select Swing/AWT. In the Items list, select the Java Web Start (JNLP) File and click
OK.
c. In the first page of the wizard, set the properties to the following values and then click
Next.
Name: The name of the JNLP file (OrderEntryWS)
JAR File: Click the Browse button to locate the .jar file that you created in
Step 1 of this practice (..\deploy\archive1.jar).
Main Class: The Java class used to start the application (oe.OrderEntry)
Create Homepage: Selected
Allow Offline Usage: Selected
Allow All Permissions: Not selected
d. In the second page of the wizard, populate the properties with appropriate values of
your choosing. These are displayed while the application is being downloaded by
Web Start. After these properties are populated, click Finish.
e. Three files are created using this wizard: A .html file to launch the application, a
.jnlp file containing all the Web Start information, and a web.xml file.
f. Double-click the the newly created JNLP file and change the URL in the second line
to http://localhost:8888. This is the location where the OC4J server is running and the
JNLP must be modified appropriately.
g. Ensure that the J2SE version is set to 1.4:
<j2se version="1.4+"/>.
h. Save all the files.
Deploy the Application to the OC4J Connection
6. Create the deployment profile for your WebStart project and deploy it.
a. First, be sure that your new project (Project1.jpr) is currently selected in
JDeveloper.
b. Then, invoke the New gallery (Select File > New). Expand the General node and
select the Deployment Profiles node.
c. Select the WAR File item and click OK. Accept the file location and name
(webapp1), and click OK.
d. The WAR Deployment Profile Settings pane appears. The default settings are
appropriate for the purposes of this practice. Click OK to continue.
e. In the Navigator, select the newly created deployment file (that is,
webapp1.deploy) and right-click. Select the “Deploy to” option and choose the
connection you created earlier (OC4J).

Oracle10g: Java Programming 17-23


Practice 17: Deploying an Application to Java Web Start (continued)
Test the application
7. Run the application in the browser and from the desktop.
a. In the Deployment window, copy the test URL that is displayed. Open an instance of
Internet Explorer and paste the URL in the address field. Following the last character
in the URL, add the name of the HTML page and run it. It should look like the
following (ensure that the Workspace – Project and HTML file names match yours):
http://machine-name:8888/OrderEntryWorkspaceLesWS-Project1-context-
root/OrderEntryWS.html
b. In the browser, click the “Click here to start your Web Start Application” link.
c. A message pane with your application title asks you if you want an icon placed on
your desktop. Select Yes, and test the application.
d. Find Customer where Customer Id is equal to 2 and then 4.
e. Close the application and run the application from the desktop.

Oracle10g: Java Programming 17-24

You might also like