Mod 5b Notes
Mod 5b Notes
P a g e 1 | 57
Anupriya A G
Dept pf CSE(AIML), RLJIT
OBJECT ORIENTED PROGRAMMING WITH JAVA BCS306A
Java's runtime system heavily relies on threads to enable asynchronous behavior, which helps in
utilizing CPU cycles more efficiently.
Unlike single-threaded systems that use event loops with polling, Java's multithreading eliminates the
need for such mechanisms. In single-threaded environments, blocking one thread can halt the entire
program, leading to inefficiencies and potential domination of one part over others.
With Java's multithreading, one thread can pause without affecting other parts of the program,
allowing idle time to be utilized elsewhere.
This is particularly beneficial for tasks like animation loops, where pauses between frames don't halt
the entire system. Multithreading in Java works seamlessly on both single-core and multicore
systems, with threads sharing CPU time on single-core systems and potentially executing
simultaneously on multicore systems.
Threads in Java can exist in various states, including running, ready to run, suspended, blocked, or
terminated. Each state represents a different stage of thread execution, with the ability to suspend,
resume, or terminate threads as needed.
P a g e 2 | 57
Anupriya A G
Dept pf CSE(AIML), RLJIT
OBJECT ORIENTED PROGRAMMING WITH JAVA BCS306A
Thread Priorities
Thread Priorities : Java assigns each thread a priority to determine its relative importance. Higher-priority
threads are given preference during conte xt switches, but priority doesn't affect the speed of execution.
Thread States: Threads can be in various states like running, ready to run, suspended, blocked, or terminated.
These states govern the behavior of threads in the system.
Synchronization: Java provides mechanisms like monitors to enforce synchronicity between threads, ensuring
that shared resources are accessed safely. Synchronization is achieved through the use of synchronized
methods and blocks.
Messaging: Java facilitates communicatio n between threads through predefined methods that all objects have.
This messaging system allows threads to wait until they are explicitly notified by another thread.
Thread Class and Runnable Interface : Java's multithreading system is built around the Thread class and
the Runnable interface. Threads can be created either by extending the class or implementing the
Runnable interface.
Main Thread : Every Java program starts with a main thread, which is automatically created. The main thread
is crucial for spawn ing other threads and often performs shutdown actions at the end of the program.
Thread Methods : Java's Thread class provides various methods for managing threads, including getName(),
getPriority() isAlive(), join() run(), sleep(), and start()
Creating a Thread
Implementing Runnable Interface: To create a thread, you implement the Runnable interface in a class. This
P a g e 3 | 57
Anupriya A G
Dept pf CSE(AIML), RLJIT
OBJECT ORIENTED PROGRAMMING WITH JAVA BCS306A
interface abstracts a unit of executable code and requires implementing a single method called run().
Runnable's run() Method: Inside the run() method, you define the code that constitutes the new thread. This
method can call other methods, use other classes, and declare variables just like the main thread can.
P a g e 4 | 57
Anupriya A G
Dept pf CSE(AIML), RLJIT
OBJECT ORIENTED PROGRAMMING WITH JAVA BCS306A
Instantiating Thread Object: After implementing Runnable, you instantiate an object of type Thread within that
class. The Thread constructor requires an instance of a class that implements Runnable and a name for the
thread.
Starting the Thread: The new thread doesn't start running until you call its start() method. This method initiates
a call to run(), effectively starting the execution of the new thread.
P a g e 5 | 57
Anupriya A G
Dept pf CSE(AIML), RLJIT
OBJECT ORIENTED PROGRAMMING WITH JAVA BCS306A
Example: An example code snippet demonstrates creating and starting a new thread:
NewThread() {
// Create a new, second thread
t = new Thread(this, "Demo Thread");
System.out.println("Child thread: " + t);
}
class ThreadDemo {
public static void main(String[] args) {
NewThread nt = new NewThread(); // create a new thread
nt.t.start(); // Start the thread
// Main thread continues its execution
// ...
}
}
Extending Thread
Extending Thread Class: To create a thread, you create a new class that extends the Thread class. The
extending class must override the run() method, which serves as the entry point for the new thread.
Constructor Invocation: Inside the constructor of the extending class, you can invoke the constructor of the
Thread class using super() to specify the name of the thread.
Starting the Thread: After creating an instance of the extending class, you call the start() method to begin
execution of the new thread.
Example:
P a g e 6 | 57
Anupriya A G
Dept pf CSE(AIML), RLJIT
OBJECT ORIENTED PROGRAMMING WITH JAVA BCS306A
P a g e 7 | 57
Anupriya A G
Dept pf CSE(AIML), RLJIT
OBJECT ORIENTED PROGRAMMING WITH JAVA BCS306A
class ExtendThread {
public static void main(String[] args) {
NewThread nt = new NewThread(); // create a new thread
nt.start(); // start the thread
// Main thread continues its execution
// ...
}
}
Creating Multiple Threads
NewThread(String
threadname) { name =
threadname;
t = new Thread(this, name);
System.out.println("New thread: " + t);
}
}
System.out.println(name + " exiting.");
}
}
P a g e 9 | 57
Anupriya A G
Dept pf CSE(AIML), RLJIT
OBJECT ORIENTED PROGRAMMING WITH JAVA BCS306A
class MultiThreadDemo {
public static void main(String[] args) { NewThread
nt1 = new NewThread("One"); NewThread nt2 =
new NewThread("Two"); NewThread nt3 = new
NewThread("Three");
try {
// wait for other threads to end
Thread.sleep(10000);
} catch (InterruptedException e) { System.out.println("Main
thread Interrupted");
}
Sample output from this program is shown here. (Your output may vary based upon
the specific execution environment.)
P a g e 10 | 57
Anupriya A G
Dept pf CSE(AIML), RLJIT
OBJECT ORIENTED PROGRAMMING WITH JAVA BCS306A
exiting.
Two
exiting.
Three
exiting.
P a g e 11 | 57
Anupriya A G
Dept pf CSE(AIML), RLJIT
OBJECT ORIENTED PROGRAMMING WITH JAVA BCS306A
isAlive() Method:
Defined by the Thread class.
Returns true if the thread upon which it is called is still running.
Returns false otherwise.
Occasionally useful for checking the status of a thread.
join() Method:
Also defined by the Thread class.
Waits until the thread on which it is called terminates.
The calling thread waits until the specified thread joins it.
Additional forms of join() allow specifying a maximum amount of time to wait for the specified thread to
terminate.
Usage:
join() is commonly used to ensure that one thread waits for another thread to finish its execution.
This is particularly useful when you want the main thread to finish last or when you need to synchronize the
execution of multiple threads.
Example:
An improved version of the example code can use join() to ensure that the main thread is the last to stop.
Additionally, isAlive() can be used to check if a thread is still running.
NewThread(String threadname) {
name = threadname;
t = new Thread(this, name); System.out.println("New
thread: " + t);
}
P a g e 12 | 57
Anupriya A G
Dept pf CSE(AIML), RLJIT
OBJECT ORIENTED PROGRAMMING WITH JAVA BCS306A
P a g e 13 | 57
Anupriya A G
Dept pf CSE(AIML), RLJIT
OBJECT ORIENTED PROGRAMMING WITH JAVA BCS306A
class DemoJoin {
public static void main(String[] args) { NewThread
nt1 = new NewThread("One"); NewThread nt2 =
new NewThread("Two"); NewThread nt3 = new
NewThread("Three");
Thread Priorities
Thread Priorities:
P a g e 14 | 57
Anupriya A G
Dept pf CSE(AIML), RLJIT
OBJECT ORIENTED PROGRAMMING WITH JAVA BCS306A
Thread priorities are used by the thread scheduler to decide when each thread should be allowed to run.
In theory, higher-priority threads get more CPU time than lower-priority threads over a given period of time.
Higher-priority threads can preempt lower-priority ones, meaning they can interrupt the execution of lower-
priority threads.
P a g e 15 | 57
Anupriya A G
Dept pf CSE(AIML), RLJIT
OBJECT ORIENTED PROGRAMMING WITH JAVA BCS306A
Synchronization
When two or more threads need access to a shared resource, they need some way to
ensure that the resource will be used by only one thread at a time. The process by which
this is achieved is called synchronization.
Key to synchronization is the concept of the monitor. A monitor is an object that is
used as a mutually exclusive lock.
Only one thread can own a monitor at a given time. When a thread acquires a lock, it
is said to have entered the monitor. All other threads attempting to enter the locked
monitor will be suspended until the first thread exits the monitor. These other threads
are said to be waiting for the monitor. A thread that owns a monitor can reenter the
same monitor if it so desires.
You can synchronize your code in either of two ways. Both involve the use of the
synchronized keyword, and both are examined here.
OBJECT ORIENTED PROGRAMMING WITH JAVA BCS306A
class Synch {
public static void main(String[] args) { Callme
target = new Callme();
Caller ob1 = new Caller(target, "Hello");
Caller ob2 = new Caller(target, "Synchronized"); Caller
P a g e 15 | 57
Prof. Anupriya A G
Dept pf CSE(AIML), RLJIT
OBJECT ORIENTED PROGRAMMING WITH JAVA BCS306A
P a g e 16 | 57
Anupriya A G
Dept pf CSE(AIML), RLJIT
OBJECT ORIENTED PROGRAMMING WITH JAVA BCS306A
ob1.t.join();
ob2.t.join();
ob3.t.join();
} catch(InterruptedException e) {
System.out.println("Interrupted");
}
}
}
[Hello[Synchronized[World]
]
]
Interthread Communication
Interprocess communication using wait(), notify(), and notifyAll() methods in Java:
Purpose:
These methods provide a means for threads to communicate and coordinate their activities without using
polling, which can waste CPU cycles.
Method Definitions:
wait(): Tells the calling thread to give up the monitor and go to sleep until some other thread enters the same
monitor and calls notify() or notifyAll().
notify(): Wakes up a single thread that previously called wait() on the same object.
notifyAll(): Wakes up all threads that previously called wait() on the same object. One of the threads will be
granted access.
Object
All three methods are declared within the class and can only be called from within a synchronized
context.
Additional Forms of wait():
Additional forms of the wait() method exist that allow you to specify a period of time to wait.
Spurious Wakeups:
In rare cases, a waiting thread could be awakened due to a spurious wakeup, where wait() resumes without
notify() or notifyAll() being called. To handle this, calls to wait() are often placed within a loop that checks
the condition on which the thread is waiting.
Best Practices:
The Java API documentation recommends using a loop to check conditions when waiting, especially due to
P a g e 17 | 57
Anupriya A G
Dept pf CSE(AIML), RLJIT
OBJECT ORIENTED PROGRAMMING WITH JAVA BCS306A
P a g e 18 | 57
Anupriya A G
Dept pf CSE(AIML), RLJIT
OBJECT ORIENTED PROGRAMMING WITH JAVA BCS306A
class Q {
int n;
Producer(Q q)
{ this.q = q;
t = new Thread(this, "Producer");
}
while(true) {
q.put(i++);
}
}
}
Consumer(Q q) {
P a g e 19 | 57
Anupriya A G
Dept pf CSE(AIML), RLJIT
OBJECT ORIENTED PROGRAMMING WITH JAVA BCS306A
this.q = q;
t = new Thread(this, "Consumer");
}
P a g e 20 | 57
Anupriya A G
Dept pf CSE(AIML), RLJIT
OBJECT ORIENTED PROGRAMMING WITH JAVA BCS306A
while(true) {
q.get();
}
}
}
class PC {
public static void main(String[] args) { Q q =
new Q();
Producer p = new Producer(q);
Consumer c = new
Consumer(q);
Put: 1
Got: 1
Got: 1
Got: 1
Got: 1
Got: 1
Put: 2
Put: 3
Put: 4
Put: 5
Put: 6
Put: 7
Got: 7
P a g e 21 | 57
Anupriya A G
Dept pf CSE(AIML), RLJIT
OBJECT ORIENTED PROGRAMMING WITH JAVA BCS306A
} catch(InterruptedException e) { System.out.println("InterruptedException
caught");
}
this.n = n;
valueSet = true;
System.out.println("Put: " + n);
notify();
}
}
Producer(Q q)
{ this.q = q;
t = new Thread(this, "Producer");
P a g e 22 | 57
Anupriya A G
Dept pf CSE(AIML), RLJIT
OBJECT ORIENTED PROGRAMMING WITH JAVA BCS306A
P a g e 23 | 57
Anupriya A G
Dept pf CSE(AIML), RLJIT
OBJECT ORIENTED PROGRAMMING WITH JAVA BCS306A
while(true) {
q.put(i++);
}
}
}
Consumer(Q q) {
this.q = q;
t = new Thread(this, "Consumer");
}
class PCFixed {
public static void main(String[] args) { Q q =
new Q();
Producer p = new Producer(q);
Consumer c = new
Consumer(q);
P a g e 24 | 57
Anupriya A G
Dept pf CSE(AIML), RLJIT
OBJECT ORIENTED PROGRAMMING WITH JAVA BCS306A
Here is some output from this program, which shows the clean synchronous behavior:
Put: 1
Got: 1
Put: 2
Got: 2
P a g e 25 | 57
Anupriya A G
Dept pf CSE(AIML), RLJIT
OBJECT ORIENTED PROGRAMMING WITH JAVA BCS306A
Put: 3
Got: 3
Put: 4
Got: 4
Put: 5
Got: 5
P a g e 26 | 57
Anupriya A G
Dept pf CSE(AIML), RLJIT
OBJECT ORIENTED PROGRAMMING WITH JAVA BCS306A
However, these methods were deprecated due to potential issues and risks they posed, such as causing
system failures and leaving critical data structures in corrupted states.
Reasons for Deprecation:
suspend(): Can cause serious system failures, as it doesn't release locks on critical data structures,
potentially leading to deadlock.
resume(): Deprecated as it requires suspend() to work properly.
stop(): Can cause system failures by leaving critical data structures in corrupted states.
Alternative Approach:
Instead of using deprecated methods, threads should be designed to periodically check a flag variable to
determine whether to suspend, resume, or stop their own execution.
Typically, a boolean flag variable is used to indicate the execution state of the thread.
If the flag is set to "running," the thread continues to execute. If it's set to "suspend," the thread pauses. If it's
set to "stop," the thread terminates.
Example Using wait() and notify():
The wait() and notify() methods inherited from Object can be used to control the execution of a thread.
An example provided demonstrates how to use these methods to control thread execution.
It involves a boolean flag ( suspendFlag ) to control the execution of the thread.
The run() method periodically checks suspendFlag, and if it's true, the thread waits. Methods mysuspend()
and myresume() are used to set and unset the flag and notify the thread to wake up.
boolean suspendFlag;
NewThread(String threadname) {
name = threadname;
t = new Thread(this, name);
System.out.println("New thread: " + t);
suspendFlag = false;
}
P a g e 27 | 57
Anupriya A G
Dept pf CSE(AIML), RLJIT
OBJECT ORIENTED PROGRAMMING WITH JAVA BCS306A
class SuspendResume {
public static void main(String[] args) { NewThread
ob1 = new NewThread("One"); NewThread ob2
= new NewThread("Two");
try {
Thread.sleep(1000);
ob1.mysuspend();
System.out.println("Suspending thread One"); Thread.sleep(1000);
ob1.myresume();
System.out.println("Resuming thread One");
ob2.mysuspend();
P a g e 28 | 57
Anupriya A G
Dept pf CSE(AIML), RLJIT
OBJECT ORIENTED PROGRAMMING WITH JAVA BCS306A
P a g e 29 | 57
Anupriya A G
Dept pf CSE(AIML), RLJIT
OBJECT ORIENTED PROGRAMMING WITH JAVA BCS306A
ob2.myresume();
System.out.println("Resuming thread Two");
} catch (InterruptedException e) {
System.out.println("Main thread Interrupted");
}
Value State
BLOCKED A thread that has suspended execution because it is waiting to acquire a
lock.
NEW A thread that has not begun execution.
RUNNABLE A thread that either is currently executing or will execute when it
gains access to the CPU.
TERMINATED A thread that has completed execution.
TIMED_WAITI A thread that has suspended execution for a specified period of time,
NG such as when it has called sleep( ). This state is also entered when a
timeout version of wait( ) or join( ) is called.
P a g e 30 | 57
Anupriya A G
Dept pf CSE(AIML), RLJIT
OBJECT ORIENTED PROGRAMMING WITH JAVA BCS306A
P a g e 31 | 57
Anupriya A G
Dept pf CSE(AIML), RLJIT
OBJECT ORIENTED PROGRAMMING WITH JAVA BCS306A
Part I
Figure 11-1 Thread states
Thread.State.RUNNABLE) // ...
It is important to understand that a thread’s state may change after the call to getState( ).
Thus, depending on the circumstances, the state obtained by calling getState( ) may not reflect the actual
state of the thread only a moment later. For this (and other) reasons, getState( ) is not intended to provide a
means of synchronizing threads. It’s primarily used for debugging or for profiling a thread’s run-time
characteristics.
P a g e 32 | 57
Anupriya A G
Dept pf CSE(AIML), RLJIT
OBJECT ORIENTED PROGRAMMING WITH JAVA BCS306A
Module -5
Enumerations
Enumerations in Java provide a structured way to define a new data type with named constants
They are extensively used throughout the Java API library due to their power and versatility.
Enumeration Fundamentals
P a g e 33 | 57
Anupriya A G
Dept pf CSE(AIML), RLJIT
OBJECT ORIENTED PROGRAMMING WITH JAVA BCS306A
1. Definition :
2. Constants Declaration :
3. Instantiation:
P a g e 34 | 57
Anupriya A G
Dept pf CSE(AIML), RLJIT
OBJECT ORIENTED PROGRAMMING WITH JAVA BCS306A
new
Enumerations define a class type, but they are not instantiated using the
keyword.
Enumeration variables are declared and used similarly to primitive types.
(EnumType.Constant).
Constants can be compared for equality using the == relational operator.
5. Switch Statements:
All case statements within the switch must use constants from the same enum as
(EnumType.Constant)
P a g e 35 | 57
Anupriya A G
Dept pf CSE(AIML), RLJIT
OBJECT ORIENTED PROGRAMMING WITH JAVA BCS306A
The following program puts together all of the pieces and demonstrates the
Apple enumeration:
class EnumDemo {
public static void main(String[] args)
{
Apple ap;
ap = Apple.RedDel;
ap = Apple.GoldenDel;
Delicious is yellow.
P a g e 36 | 57
Anupriya A G
Dept pf CSE(AIML), RLJIT
OBJECT ORIENTED PROGRAMMING WITH JAVA BCS306A
class EnumDemo2 {
public static void main(String[] args)
{
Apple ap;
// use values()
Apple[] allapples = Apple.values();
for(Apple a : allapples)
System.out.println(a);
System.out.println();
P a g e 37 | 57
Anupriya A G
Dept pf CSE(AIML), RLJIT
OBJECT ORIENTED PROGRAMMING WITH JAVA BCS306A
// use valueOf()
ap = Apple.valueOf("Winesap"); System.out.println("ap
contains " + ap);
P a g e 38 | 57
Anupriya A G
Dept pf CSE(AIML), RLJIT
OBJECT ORIENTED PROGRAMMING WITH JAVA BCS306A
}
}
ap contains Winesap
Notice that this program uses a for-each style for loop to cycle through the array of constants obtained by
calling values( ). For the sake of illustration, the variable allapples was created and assigned a reference to
the enumeration array. However, this step is not necessary because the for could have been written as shown
here, eliminating the need for the allapples variable:
for(Apple a : Apple.values())
System.out.println(a);
Now, notice how the value corresponding to the name Winesap was obtained by calling valueOf( ).
ap = Apple.valueOf("Winesap");
P a g e 39 | 57
Anupriya A G
Dept pf CSE(AIML), RLJIT
OBJECT ORIENTED PROGRAMMING WITH JAVA BCS306A
2. Enumeration Constants :
P a g e 40 | 57
Anupriya A G
Dept pf CSE(AIML), RLJIT
OBJECT ORIENTED PROGRAMMING WITH JAVA BCS306A
Constructors can be defined for enums, and they are called when each
enumeration constant is created.
Instance variables defined within the enum are associated with each enumeration
constant separately.
apples.
4. Usage Example:
In the main() method, the prices of different apple varieties are displayed.
The constructor is called for each enumeration constant to initialize the prices.
data.
5. Overloaded Constructors:
Enumerations can have two or more overloaded constructors, just like other
classes.
apple
// Constructor
Apple(int p) { price = p; }
1. Inheritance:
All Java enumerations automatically inherit from the java.lang.Enum class.
While you can't inherit a superclass when declaring an enum, java.lang.Enum is
implicitly inherited by all enums.
2. java.lang.Enum Methods:
ordinal() Method:
P a g e 42 | 57
Anupriya A G
Dept pf CSE(AIML), RLJIT
OBJECT ORIENTED PROGRAMMING WITH JAVA BCS306A
P a g e 43 | 57
Anupriya A G
Dept pf CSE(AIML), RLJIT
OBJECT ORIENTED PROGRAMMING WITH JAVA BCS306A
3. Comparing Enumeration Constants :
Enumeration constants can be compared for equality using the operator.
The equals() method can also be used to compare constants fo=r=equality, ensuring
they belong to the same enumeration.
4. Example Program :
Demonstrates the usage of ordinal(), compareTo(), and equals() methods with
enumeration constants.
class EnumDemo4 {
public static void main(String[] args)
{
Apple ap, ap2, ap3;
// Obtain all ordinal values using ordinal(). System.out.println("Here are all apple constants" +
" and their ordinal values: "); for(Apple a : Apple.values())
System.out.println(a + " " + a.ordinal());
ap = Apple.RedDel; ap2 =
Apple.GoldenDel; ap3 =
Apple.RedDel;
System.out.println();
if(ap.compareTo(ap2) > 0)
System.out.println(ap2 + " comes before " + ap);
System.out.println(); if(ap.equals(ap2))
System.out.println("Error!");
if(ap.equals(ap3))
System.out.println(ap + " equals " + ap3);
P a g e 44 | 57
Anupriya A G
Dept pf CSE(AIML), RLJIT
OBJECT ORIENTED PROGRAMMING WITH JAVA BCS306A
if(ap == ap3)
System.out.println(ap + " == " + ap3);
}
}
An automated “decision maker” program was created. In that version, variables called NO, YES,
MAYBE, LATER, SOON, and NEVER were declared within an interface and used to represent the
possible answers. While there is nothing technically wrong with that approach,
the enumeration is a better choice. Here is an improved version of that program that uses an enum called
Answers to define the answers.
java.util.Random;
class Question {
Random rand = new Random(); Answers ask() {
int prob = (int) (100 * rand.nextDouble());
P a g e 45 | 57
Anupriya A G
Dept pf CSE(AIML), RLJIT
OBJECT ORIENTED PROGRAMMING WITH JAVA BCS306A
P a g e 46 | 57
Anupriya A G
Dept pf CSE(AIML), RLJIT
OBJECT ORIENTED PROGRAMMING WITH JAVA BCS306A
class AskMe {
static void answer(Answers result) { switch(result) {
case NO: System.out.println("No"); break;
case YES: System.out.println("Yes"); break;
case MAYBE: System.out.println("Maybe");
break;
case LATER: System.out.println("Later"); break;
case SOON: System.out.println("Soon"); break;
case NEVER: System.out.println("Never"); break;
}
}
Type Wrappers
Java provides type wrapper classes that encapsulate primitive types within objects.
Type wrapper classes include Double, Float, Long, Integer, Short, Byte,
Character, and Boolean.
These classes offer methods that allow integration of primitive types into Java's object
hierarchy.
Java's autoboxing feature automatically converts primitive types to their corresponding
wrapper classes when necessary, and vice versa.
This simplifies the process of working with both primitive types and objects, as
conversions are handled implicitly by the compiler.
Overall, type wrappers in Java allow primitive types to be used in situations where objects are
required, providing a bridge between the world of primitive types.
Autoboxing further simplifies the interaction between primitive types and conversions
automatically.
OBJECT ORIENTED PROGRAMMING WITH JAVA BCS306A
Character
Character is a wrapper around a char. The constructor for Character is Character(char ch)
Here, ch specifies the character that will be wrapped by the Character object being created.
However, beginning with JDK 9, the Character constructor was deprecated, and beginning with JDK 16, it
has been deprecated for removal. Today, it is strongly recommended that you use the static method
valueOf( ) to obtain a Character object.
It is shown here:
Boolean
Boolean is a wrapper around boolean values. It defines these constructors:
Boolean(boolean boolValue)
Boolean(String boolString)
In the first version, boolValue must be either true or false. In the second version, if boolString contains
the string "true" (in uppercase or lowercase), then the new Boolean object will be true. Otherwise, it will
be false.
However, beginning with JDK 9, the Boolean constructors were deprecated, and beginning with JDK 16,
they have been deprecated for removal. Today, it is strongly recommended that you use the static method
valueOf( ) to obtain a Boolean object. It has the two versions shown here:
P a g e 48 | 57
Anupriya A G
Dept pf CSE(AIML), RLJIT
OBJECT ORIENTED PROGRAMMING WITH JAVA BCS306A
booleanValue( )
It returns the boolean equivalent of the invoking object.
P a g e 49 | 57
Anupriya A G
Dept pf CSE(AIML), RLJIT
OBJECT ORIENTED PROGRAMMING WITH JAVA BCS306A
The most commonly used type wrappers are those that represent numeric values. These are Byte,
Short, Integer, Long, Float, and Double.
All of the numeric type wrappers inherit the abstract class Number. Number declares methods
that return the value of an object in each of the different number formats.
These methods are shown here:
byte byteValue( )
double doubleValue( )
float floatValue( )
int intValue( )
long longValue( )
short shortValue( )
For example, doubleValue( ) returns the value of an object as a double, floatValue( ) returns
the value as a float, and so on.
These methods are implemented by each of the numeric type wrappers.
All of the numeric type wrappers define constructors that allow an object to be constructed
from a given value, or a string representation of that value.
For example, here are the constructors defined for Integer:
Integer(int num)
Integer(String str)
If str does not contain a valid numeric value, then a NumberFormatException is thrown.
Here are two of the forms supported by Integer:
static Integer valueOf(int val)
static Integer valueOf(String valStr) throws NumberFormatException
Here, val specifies an integer value and valStr specifies a string that represents a properly formatted
numeric value in string form. Each returns an Integer object that wraps the specified value. Here is an
example:
After this statement executes, the value 100 is represented by an Integer instance. Thus, iOb wraps the
value 100 within an object. In addition to the forms valueOf( ) just shown, the integer wrappers, Byte,
Short, Integer, and Long, also supply a form that lets you specify a radix.
All of the type wrappers override toString( ). It returns the human-readable form of the value contained
within the wrapper. This allows you to output the value by passing a type wrapper object to println( ), for
example, without having to convert it into its primitive type.
P a g e 50 | 57
Anupriya A G
Dept pf CSE(AIML), RLJIT
OBJECT ORIENTED PROGRAMMING WITH JAVA BCS306A
The following program demonstrates how to use a numeric type wrapper to encapsulate a value and then extract
that value.
// Demonstrate a type wrapper.
class Wrap {
public static void main(String[] args) { Integer iOb =
This program wraps the integer value 100 inside an Integer object called iOb. The program then obtains this value by calling
intValue( ) and stores the result in i.
The process of encapsulating a value within an object is called boxing. Thus, in the program, this line boxes the
value 100 into an Integer:
Integer iOb = Integer.valueOf(100);
The process of extracting a value from a type wrapper is called unboxing. For example, the program unboxes
the value in iOb with this statement:
int i = iOb.intValue();
The same general procedure used by the preceding program to box and unbox values has been available for use
since the original version of Java. However, today, Java provides a more streamlined approach, which is described
next.
Autoboxing
Modern versions of Java have included two important features: autoboxing and auto-unboxing.
Autoboxing is the process by which a primitive type is automatically encapsulated (boxed) into its
equivalent type wrapper whenever an object of that type is needed.
There is no need to explicitly construct an object. Auto-unboxing is the process by which the value of a
boxed object is automatically extracted (unboxed) from a type wrapper when its value is needed.
There is no need to call a method such as intValue( ) or doubleValue( ).
Autoboxing and auto-unboxing greatly streamline the coding of several algorithms, removing the tedium
of manually boxing and unboxing values.
They also help prevent errors. Moreover, they are very important to generics, which operate only on
objects. Finally, autoboxing makes working with the Collections Framework
With autoboxing, it is not necessary to manually construct an object in order to wrap a primitive type. You
need only assign that value to a type-wrapper reference. Java automatically constructs the object for you.
For example, here is the modern way to construct an Integer object that has the value 100:
P a g e 51 | 57
Anupriya A G
Dept pf CSE(AIML), RLJIT
OBJECT ORIENTED PROGRAMMING WITH JAVA BCS306A
Notice that the object is not explicitly boxed. Java handles this for you, automatically.
P a g e 52 | 57
Anupriya A G
Dept pf CSE(AIML), RLJIT
OBJECT ORIENTED PROGRAMMING WITH JAVA BCS306A
class AutoBox2 {
// Take an Integer parameter and return
// an int value;
static int m(Integer v) {
return v ; // auto-unbox to int
}
System.out.println(iOb);
}
}
P a g e 53 | 57
Anupriya A G
Dept pf CSE(AIML), RLJIT
OBJECT ORIENTED PROGRAMMING WITH JAVA BCS306A
100
P a g e 54 | 57
Anupriya A G
Dept pf CSE(AIML), RLJIT
OBJECT ORIENTED PROGRAMMING WITH JAVA BCS306A
In general, autoboxing and unboxing take place whenever a conversion into an object or from an object is
required. This applies to expressions. Within an expression, a numeric object is automatically unboxed. The
outcome of the expression is reboxed, if necessary. For example, consider the following program:
// Autoboxing/unboxing occurs inside expressions.
class AutoBox3 {
public static void main(String[] args) {
iOb = 100;
System.out.println("Original value of iOb: " + iOb);
}
}
P a g e 55 | 57
Anupriya A G
Dept pf CSE(AIML), RLJIT
OBJECT ORIENTED PROGRAMMING WITH JAVA BCS306A
This causes the value in iOb to be incremented. It works like this: iOb is unboxed, the value is
incremented, and the result is reboxed.
Auto-unboxing also allows you to mix different types of numeric objects in an expression.
Once the values are unboxed, the standard type promotions and conversions are applied. For
example, the following program is perfectly valid:
class AutoBox4 {
public static void main(String[] args) {
As you can see, both the Double object dOb and the Integer object iOb participated in the addition,
and the result was reboxed and stored in dOb.
Because of auto-unboxing, you can use Integer numeric objects to control a switch
statement. For example, consider this fragment:
When the switch expression is evaluated, iOb is unboxed and its int value is obtained.
As the examples in the programs show, because of autoboxing/unboxing, using numeric
objects in an expression is both intuitive and easy. In the early days of Java, such code would have
involved casts and calls to methods such as intValue( ).
P a g e 56 | 57
Anupriya A G
Dept pf CSE(AIML), RLJIT
OBJECT ORIENTED PROGRAMMING WITH JAVA BCS306A
class AutoBox5 {
public static void main(String[] args) {
b is true ch2 is
x
P a g e 57 | 57
Anupriya A G
Dept pf CSE(AIML), RLJIT