Keyword assert, chained exceptions and
channel based I/O System was introduced.
Overview of Java
Java is one of the world's most important
and widely used computer languages, and it
has held this distinction for many years.
Unlike some other computer languages
whose influence has weared with passage of
time, while java's has grown.
Java 1.5 was called J2SE 5, it added
following major new features :
Generics
Annotations
Autoboxing and autounboxing
Enumerations
For-each Loop
Creation of Java
Varargs
Java was developed by James Ghosling,
Patrick Naughton, Mike Sheridan at Sun
Microsystems Inc. in 1991. It took 18
months to develop the first working version.
Static Import
Formatted I/O
Concurrency utilities
Till today it is the first and best choice for
developing console/web-based applications.
The initial name was Oak but was renamed
to Java in 1995.
Evolution of Java
Java was initially launched as Java 1.0 but
soon after its initial release, Java 1.1 was
launched. Java 1.1 redefined event handling,
new library elements were added.
In Java 1.2 Swing and Collection
framework was added and suspend(),
resume() and stop() methods were
deprecated from Thread class.
No major changes were made into Java 1.3
but the next release that was Java 1.4
contained several important changes.
Next major release was Java SE 7 which
included many new changes like :
Now String can be used to control
Swith statement.
Multi Catch Exception
try-with-resource statement
Binary Integer Literals
Underscore in numeric literals.
Application of Java
Java is widely used in every corner of world
and of human life. Java is not only used in
softwares but is also widely used in
designing hardware controlling software
components. There are more than 930
million JRE downloads each year and 3
billion mobile phones run java.
launched. Java 1.1 redefined event handling,
new library elements were added.
Following are some other usage of Java :
No major changes were made into Java 1.3
but the next release that was Java 1.4
contained several important changes.
Keyword assert, chained exceptions and
channel based I/O System was introduced.
1. Developing Desktop Application
2. Web Applications like Linkedin
3. Mobile OS like Android
4. Embedded System
In Java 1.2 Swing and Collection
framework was added and suspend(),
resume() and stop() methods were
deprecated from Thread class.
Java 1.5 was called J2SE 5, it added
following major new features :
Generics
Annotations
Autoboxing and autounboxing
Enumerations
For-each Loop
Varargs
Creation of Java
Static Import
Java was developed by James Ghosling,
Patrick Naughton, Mike Sheridan at Sun
Microsystems Inc. in 1991. It took 18
months to develop the first working version.
Formatted I/O
Concurrency utilities
5. Robotics and games etc.
Download JDK
For running Java programs in your system
you will have to download and install JDK
kit from here (current version is jdk 1.7).
The initial name was Oak but was renamed
to Java in 1995.
Next major release was Java SE 7 which
included many new changes like :
Now String can be used to control
Swith statement.
Evolution of Java
Multi Catch Exception
Java was initially launched as Java 1.0 but
soon after its initial release, Java 1.1 was
try-with-resource statement
Binary Integer Literals
Underscore in numeric literals.
would need to set environment variable to
point to correct installation directory.
Setting up path for windows
Application of Java
Java is widely used in every corner of world
and of human life. Java is not only used in
softwares but is also widely used in
designing hardware controlling software
components. There are more than 930
million JRE downloads each year and 3
billion mobile phones run java.
( 2000/XP/vista/Window 7,8 )
Assuming that you have installed Java in C:\
Program files/ Java / JDK directory
Step 1: Right click on my computer and
select properties.
Following are some other usage of Java :
1. Developing Desktop Application
2. Web Applications like Linkedin
3. Mobile OS like Android
4. Embedded System
5. Robotics and games etc.
Download JDK
For running Java programs in your system
you will have to download and install JDK
kit from here (current version is jdk 1.7).
Step 2: Go to the Advance System Settings
tab.
Setting Classpath for Java
Java is freely available on Oracle's Website.
Download the latest version of JDK (Java
Development Kit) on your operating system.
Install JDK on your machine. Once you
have installed Java on your machine you
Step 3: Click on Environment Variables
button.
Step 4: Now alter the path variable so that it
also contains the path to JDK installed
directory.
For Example: If you use bash as your shell,
then you would add following line to the end
bash mc: export PATH=/ Path/to/java
What is JVM?
Java virtual Machine(JVM) is a virtual
Machine that provides runtime environment
to execute java byte code. JVM are most
often implemented to run on existing
operating system.
For e.g:- Change C:\windows/ system 32.
to C:\windows/system 32; C:\program
files / Java/ JDK.
JVM control execution of every Java
program. It enables features such as
automated exception handling, Garbagecollected heap.
JVM is distributed with Java class library, a
set of standard class library in byte
code.That implements the Java Application
Programming Interface (API).
Setting up path for window 95/98/ME
Assuming that you have installed Java in
C:\program files\ java\ JDK directory, do the
following:
Step 1: Edit the C:\autoexec.bat file and
add the following line at the end.
SET PATH =% PATH% C:\ PROGRAM
FILE/JAVA/JDK/bin
Setting up path for Linux , Unix , Solaris,
free BSD
Assuming that you have installed Java in
C:\program files\ java\ JDK directory, do the
following:
Step 1: Environment variable path should be
set to point where java binaries have been
installed. Refer to your shell if you have
trouble doing this.
JVM Architecture
Native method stack : It contains all native
used in application.
Executive Engine : Execution engine
controls the execute of instructions
contained in the methods of the classes.
Native Method Interface : Native method
interface gives an interface between java
code and native code during execution.
Native Method Libraries : Native Libraries
consist of files required for the execution of
native code.
First Java Program
Let us look at a simple java program.
class Hello
{
public static void main (String[]
args)
{
System.out.println ("Hello World
program");
}
}
Class Loader : Class loader loads the Class
for execution.
Method area : Stores pre-class structure as
constant pool.
Heap : Heap is in which objects are
allocated.
Stack : Local variables and partial results
are store here. Each thread has a private
JVM stack created when the thread is
created.
Program register : Program register holds
the address of JVM instruction currently
being executed.
Step to compile and run your first java
program
Step 1: Open a text editor and write the
code as above.
Step 2: Save the file as Hello.java
Step 3: Open command prompt and go to
the directory where you saved your first java
program assuming it is same in C:\
Step 4: Type javac Hello.java and press
Return to compile your code. If there is no
error in the code the command prompt will
take you to the next line.
Step 5: Now type java Hello on command
prompt to run your program.
Step 6: You will be able to see Hello world
program printed on your command prompt.
Now let us see what happen at runtime
After writing your Java program, when you
will try to compile it. Compiler will perform
some compilation operation on your
program.
Once it is compiled successfully byte
code(.class file) is generated by the
compiler.
After compiling when you will try to run the
byte code(.class file), the following steps are
performed at runtime:1. Class loader loads the java class.It is
subsystem of JVM Java Virtual
machine
2. Byte Code verifier checks the code
fragments for illegal code that can
violate access right to object.
3. Interpreter read the byte code stream
and then executes the instructions
Data-type
Java language has a rich implementation of
data type. Data type specify size and the
type of values that can be stored in an
identifier.
short : It is 16 bit integer data type. Value
range from -32768 to 32767. Default value
zero. example: short s=11;
int : It is 32 bit integer data type. Value
range from -2147483648 to 2147483647.
Default value zero. example: int i=10;
long : It is 64 bit integer data type. Value
range from -9,223,372,036,854,775,808 to
9,223,372,036,854,775,807. Default value
zero. example: long l=100012;
In java, data types are classified into two
catagory
1. Primitive Data type
Floating-Point Number
2. Non-Primitive Data type
This group includes float,double
1) Primitive Data type
A primitive data type can be of eight types :
float : It is 32 bit float data type. Default
value 0.0f. example: float ff=10.3f;
double : It is 64 bit float data type. Default
value 0.0d. example: double db=11.123;
Primitive Data types
cha boolea byt shor in lon floa doubl
r
n
e
t
t g
t
e
Once a primitive data type has been declared
its type can never change, although in most
cases its value can change. These eight
primitive type can be put into four groups
Characters
This group represent char, which represent
symbols in a character set, like letters and
numbers.
char : It is 16 bit unsigned unicode
character. Range 0 to 65,535. example: char
Integer
c='a';
This group includes byte,short,int,long
byte : It is 8 bit integer data type. Value
range from -128 to 127. Default value zero.
example: byte b=10;
Boolean
This group represent boolean, which is a
special type for representing true/false
values. They are defined constant of the
language. example: boolean b=true;
2) Non-Primitive(Reference) Data type
A reference data type is used to refer to an
object. A reference variable is declare to be
of specific and that type can never be
change. We will talk a lot more about
reference data type later in Classes and
Object lesson.
Identifier
All Java components require name. Name
used for classes, methods, interfaces and
variables are called Identifier. Identifier
must follow some rule. Here are the rules:
All identifier must start with either a
letter( a to z or A to Z ) or currency
character($) or an underscore.
After the first character,an identifier
can have any combination of
character
A keyword cannot be used as an
identifier.
Identifiers in Java are case sensitive,
foo and Foo are two different
identifier.
In Java, type casting is classified into two
types,
Widening Casting(Implicit)
Narrowing Casting(Explicitly done)
Widening or Automatic type converion
Automatic Type casting take place when,
the two types are compatible
the target type is larger than the
source type
Example :
Type Casting
Assigning a value of one type to a variable
of another type is known as Type Casting.
Example :
int x = 10;
byte y = (byte)x;
public class Test
{
public static void main(String[]
args)
{
int i = 100;
long l = i;
//no explicit
type casting required
float f = l;
//no explicit
type casting required
"+i);
"+l);
System.out.println("Int value
System.out.println("Long value
System.out.println("Float
value "+f);
}
}
Output :
Int value 100
Long value 100
Float value 100.0
Variable
Java Programming language defines mainly
three kind of variables.
1.
Instance
variables
2.
Static
Variables
Narrowing or Explicit type conversion
When you are assigning a larger type value
to a variable of smaller type, then you need
to perform explicit type casting.
Example :
public class Test
{
public static void main(String[]
args)
{
double d = 100.04;
long l = (long)d; //explicit
type casting required
int i = (int)l; //explicit
type casting required
System.out.println("Double
value "+d);
System.out.println("Long value
"+l);
System.out.println("Int value
"+i);
}
}
Output :
Double value 100.04
Long value 100
Int value 100
3.
Local
Variables
1) Instance variables
Instance variables are variables that are
declare inside a class but outside any
method,constructor or block. Instance
variable are also variable of object
commonly known as field or property.
class Student
{
String name;
int age;
}
Here name and age are instance variable of
Student class.
2) Static variables
Static are class variables declared with static
keyword. Static variables are initialized only
once. Static variables are also used in
declaring constant along with final keyword.
class Student
{
String name;
int age;
static int instituteCode=1101;
}
Here instituteCode is a static variable. Each
object of Student class will share
instituteCode property.
datatype[]
identifier;
or
datatype
identifier[];
Both are valid syntax for array declaration.
But the former is more readable.
3) Local variables
Example :
Local variables are declared in method
constructor or blocks. Local variables are
initialized when method or constructor block
start and will be destroyed once its end.
Local variable reside in stack. Access
modifiers are not used for local variable.
int[] arr;
char[] arr;
short[] arr;
long[] arr;
int[][] arr; //two
dimensional array.
float getDiscount(int price)
{
float discount;
discount=price*(20/100);
return discount;
}
Initialization
Here discount is a local variable.
Array
An array is a collection of similar data types.
Array is a container object that hold values
of homogenous type. It is also known as
static data structure because size of an array
must be specified at the time of its
declaration.
An array can be either primitive or reference
type. It gets memory in heap area. Index of
array starts from zero to size-1.
new operator is used to
initialized an array.
Example :
int[] arr=new
int[10]; //10 is
size of array.
or
int[]
arr={10,20,30,40
,50};
Array Declaration
Accessing array element
Syntax :
the
As mention ealier array index starts from 0.
To access nth element of an array. Syntax
uu[0][0] = 5;
for(int[] u: uu)
{
System.out.println(u[0]);
}
}
arrayname[n-1];
Example : To access 4th element of a given
array
int[] arr={10,20,30,40};
System.out.println("Element at index
3"+arr[2]);
The above code will print the 4th element of
array arr on console.
Two Dimensional Array
//using foreach with 2D
class arrimp1
{
public static void main(String s[])
{
int[][] arr2D={{1, 2, 3},{4, 5, 6},{7,
8, 9}};
for (int[] arr1D : arr2D)
{
for (int i : arr1D)
{
System.out.print(i + " ");
}
System.out.println("\n");
}
}
}
Ex:2
//foreach with 2D
class arrimp2
{
public static void main(String s[])
{
int[][] uu = new int[1][1];
}
Ex:3
class Test
{
public static void main(String[] args)
{
int[][] array1 = {{1, 2, 3, 4}, {5, 6, 7,
8}};
for(int[] val: array1)
{
System.out.print(val);
}
}
}
foreach or enhanced for
loop
J2SE 5 introduces special
type of for loop called
foreach loop to access
elements of array. Using foreach
loop you can access complete array
sequentially without using index of array.
Let us see an exapmle of foreach loop.
class Test
{
public static void main(String[]
args)
{
int[] arr={10,20,30,40};
for(int x:arr)
{
System.out.println(x);
}
output: 10
20
30
40
Java Operators
Java provides a rich set of operators
enviroment. Java operators can be devided
into following categories
Arithmetic operators
Relation operators
Logical operators
Bitwise operators
Assignment operators
Conditional operators
Misc operators
Arithmetic operators
Arithmetic operators are used in
mathematical expression in the same way
that are used in algebra.
operator
description
+
adds two operands
subtract second operands from
first
*
multiply two operand
/
divide numerator by denumerator
%
remainder of division
Increment operator increases
++
integer value by one
--
Decrement operator decreases
integer value by one
Relation operators
The following table shows all relation
operators supported by Java.
operator
description
==
Check if two operand are equal
Check if two operand are not
!=
equal.
Check if operand on the left is
>
greater than operand on the right
Check operand on the left is
<
smaller than right operand
check left operand is greater than
>=
or equal to right operand
Check if operand on left is smaller
<=
than or equal to right operand
Logical operators
Java supports following 3 logical operator.
Suppose a=1 and b=0;
operator description
example
&&
Logical AND (a && b) is false
||
Logical OR (a || b) is true
!
Logical NOT (!a) is false
Bitwise operators
Java defines several bitwise operators that
can be applied to the integer types long, int,
short, char and byte
operator
&
|
^
<<
description
Bitwise AND
Bitwise OR
Bitwise exclusive OR
left shift
>>
right shift
Now lets see truth table for bitwise &, | and
^
a
0
0
1
1
%=
B
0
1
0
1
a&b
0
0
0
1
a|b
0
1
1
1
a^b
0
1
1
0
The bitwise shift operators shifts the bit
value. The left operand specifies the value to
be shifted and the right operand specifies the
number of positions that the bits in the value
are to be shifted. Both operands have the
same precedence.Example
a = 0001000
b= 2
a << b= 0100000
a >> b= 0000010
Assignment Operators
Assignment operator supported by Java are
as follows
operator
=
+=
-=
*=
/=
description
example
assigns values from
right side operands to a=b
left side operand
adds right operand to a+=b is
the left operand and same as
assign the result to left a=a+b
subtracts right operand
a-=b is
from the left operand
same as
and assign the result to
a=a-b
left operand
mutiply left operand
a*=b is
with the right operand
same as
and assign the result to
a=a*b
left operand
divides left operand a/=b is
with the right operand same as
and assign the result to
a=a/b
left operand
calculate modulus
a%=b is
using two operands
same as
and assign the result to
a=a%b
left operand
Misc operator
There are few other operator supported by
java language.
Conditional operator
It is also known as ternary operator and used
to evaluate Boolean expression
epr1 ? expr2 : expr3
If epr1Condition is true? Then value expr2 :
Otherwise value expr3
instanceOf operator
This operator is used
for object reference
variables. The operator
checks whether the
object is of particular
type (class type or
interface type)
Object and Classes
Since Java is an object oriented language,
complete java language is build on classes
and object. Java is also known as a strong
Object oriented programming
language(oops).
OOPS is a programming
approach which provides
solution to problems with
the help of algorithms
based on real world. It
uses real world approach
to solve a problem. So object
oriented technique offers better and easy
way to write program then procedural
programming model such as C, ALGOL,
PASCAL.
Main Features of OOPS
Inheritence
Polymorphism
Encapsulation
Class is the core of Java language. Class
can be defined as a template/
blueprint that describe the
behaviors /states of a
particular entity. A class
defines new data type. Once
defined this new type can be used to create
object of that type. Object
is an
instance of class. You may
also call it as physical
existence of a logical
template class.
A class is declared using class keyword. A
class contain both data and code that operate
on that data. The data or variables defined
within a class are called instance variables
and the code that operates on this data is
known as methods.
Rules for Java Class
Abstraction
A class can have only public or
default(no modifier) access specifier.
Datahiding
It can be either abstract, final or
concrete (normal class).
It must have the class keyword, and
class must be followed by a legal
identifier.
It may optionally extend one parent
class. By default, it will extend
java.lang.Object.
As an object oriented language Java
supports all the features given above. We
will discuss all these features in detail later.
Class
In Java everything is
encapsulated under classes.
It may optionally implement any
number of comma-separated
interfaces.
The class's variables and methods are
declared within a set of curly braces
{}.
Each .java source file may contain
only one public class. A source file
may contain any number of default
visible classes.
Finally, the source file name must
match the public class name and it
must have a .java suffix.
A simple class example
Suppose, Student is a class and student's
name, roll number, age will be its property.
Lets see this in Java syntax
class Student.
{
String name;
int rollno;
int age;
}
When a reference is made to a particular
student with its property then it becomes an
object, physical existence of Student class.
Student std=new Student();
After the above statement std is
instance/object of Student class. Here the
new keyword creates an actual physical
copy of the object and assign it to the std
variable. It will have physical existence and
get memory in heap area. The new operator
dynamically allocates memory for an
object
A class can contain any of the following
variable types.
Local variables .
variables defined
inside methods,
constructors or blocks
are called local
variables. The variable will be
declared and initialized within the
method and the variable will be
destroyed when the method has
completed.
Instance variables .
Instance variables
are variables within
a class but outside
any method. These
variables are instantiated when the
class is loaded. Instance variables
can be accessed from inside any
method, constructor or blocks of that
particular class.
Class variables .
Class variables are
variables declared
with in a class,
outside any method,
with the static
keyword.
Q. How a class is initialized in java?
A Class is initialized in Java when an
instance of class is created using either new
operator or using reflection using
class.forName(). A class is also said to be
initialized when a static method of Class is
invoked or a static field of Class is assigned.
Q. How would you make a copy of an
entire Java object with its state?
Make that class implement Cloneable
interface and call clone() method on its
object. clone() method is defined in Object
class which is parent of all java class by
default.
Methods in Java
Method describe behavior of an object. A
method is a collection of statements that are
group together to perform an operation.
Syntax :
return-type
methodName(parameter
-list)
{
//body of method
}
Example of a Method
public String getName(String st)
{
String name="hello";
name=name+st;
return name;
}
Modifier : Modifier are access type of
method. We will discuss it in detail later.
Return Type : A method may return value.
Data type of value return by a method is
declare in method heading.
Method name : Actual name of the method.
Parameter : Value passed to a method.
Method body : collection of statement that
defines what method does.
Parameter Vs. Argument
While talking about method, it is important
to know the difference between two terms
parameter and argument.
Parameter is variable
defined by a method
that receives value
when the method is
called. Parameter are always local to
the method they dont have scope outside the
While
argument is a value
that is passed to a
method when it is
called.
method.
call-by-value and
call-by-reference
There are two ways to pass an argument to a
method
1. call-by-value : In this approach copy
of an argument value is pass to a
method. Changes made to the
argument value inside the method
will have no effect on the arguments.
2. call-by-reference : In this reference
of an argument is pass to a method.
Any changes made inside the method
will affect the argument value.
NOTE : In Java, when
you pass a primitive type
to a method it is passed by
value whereas when you
pass an object of any type
to a method it is passed as
reference.
System.out.println("After
"+ts.x+" "+ts.y);
}
}
Output :
Example of call-by-value
public class Test
{
public void callByValue(int x)
{
x=100;
}
public static void main(String[]
args)
{
int x=50;
Test t = new Test();
t.callByValue(x);
//function call
System.out.println(x);
}
}
Output : 50
Example of call-by-reference
public class Test
{
int x=10;
int y=20;
public void callByReference(Test
t)
{
t.x=100;
t.y=50;
}
public static void main(String[]
args)
{
Test ts = new Test();
System.out.println("Before
"+ts.x+" "+ts.y);
b.callByReference(ts);
Before 10 20
After 100 50
Method overloading
If two or more methods
in a class have same
name but different
parameters, it is known
as method overloading.
Method overloading is
one of the ways through
which java supports
polymorphism. Method
overloading can be done
by changing number of
arguments or by
changing the data type of
arguments. If two or more method
have same name and same parameter list
but differs in return type are not said to be
overloaded method
Different ways of Method overloading
There are two different ways of method
overloading
Method overloading by changing data
type of Arguments
Example :
class Calculate
{
void sum (int a, int b)
{
System.out.println("sum is"+(a+b))
;
}
void sum (float a, float b)
{
System.out.println("sum is"+
(a+b));
}
Public static void main (String[]
args)
{
Calculate cal = new Calculate();
cal.sum (8,5);
//sum(int a,
int b) is method is called.
cal.sum (4.6, 3.8); //sum(float a,
float b) is called.
}
}
Output:
Sum is 13
Sum is 8.4
You can see that sum() method is overloaded
two times. The first takes two integer
arguments, the second takes two float
arguments.
System.out.println("Area is"+
(l*b)) ;
}
void find(int l, int b,int h)
{
System.out.println("Area is"+
(l*b*h));
}
public static void main (String[]
args)
{
Area ar = new Area();
ar.find(8,5);
//find(int l,
int b) is method is called.
ar.find(4,6,2);
//find(int l,
int b,int h) is called.
}
}
Output:
Area is 40
Area is 48
In this example the find() method is
overloaded twice. The first takes two
arguments to calculate area, and the second
takes three arguments to calculate area.
When an overloaded method is called java
look for match between the arguments to
call the method and the method's
parameters. This match need not always be
exact, sometime when exact match is not
found, Java automatic type conversion plays
a vital role.
Example of Method overloading with type
promotion.
Method overloading by changing no. of
argument.
Example :
class Area
{
void find(int l, int b)
class Area
{
void find(long l,long b)
{
System.out.println("Area is"+
(l*b)) ;
}
void find(int l, int b,int h)
{
System.out.println("Area is"+
(l*b*h));
}
public static void main (String[]
args)
{
Area ar = new Area();
ar.find(8,5);
//automatic type
conversion from find(int,int) to
find(long,long) .
ar.find(2,4,6)
//find(int l,
int b,int h) is called.
}
}
synchronized. These modifiers are
not allowed for constructor.
class Car
{
String name ;
String model;
Car( )
//Constructor
{
name ="";
model="";
}
}
Output:
Area is 40
Area is 48
There are two types of
Constructor
Constructors in Java
Default Constructor
A constructor is a special
method that is used to
initialize an object.Every
class has a constructor,if we
don't explicitly declare a
constructor for any java
class the compiler builds a
default constructor for that
class. A constructor does
not have any return type.
Parameterized
constructor
A constructor has same
name as the class in which
it resides. Constructor in
Java can not be abstract,
static, final or
Each time a new object is created at least
one constructor will be invoked.
Car c = new Car()
//Default
constructor invoked
Car c = new Car(name);
//Parameterized constructor invoked
Constructor Overloading
Like methods, a constructor can also be
overloaded. Overloaded constructors are
differentiated on the basis of their type of
parameters or number of parameters.
Constructor overloading is not much
different than method overloading. In case
of method overloading you have multiple
methods with same name but different
signature, whereas in Constructor
overloading you have multiple constructor
with different signature but only difference
is that Constructor doesn't have return type
in Java.
Q. Why do we Overload constructors ?
Constuctor overloading is done to construct
object in different ways.
Example of constructor overloading
class Cricketer
{
String name;
String team;
int age;
Cricketer ()
//default
constructor.
{
name ="";
team ="";
age = 0;
}
Cricketer(String n, String t, int
a)
//constructor overloaded
{
name = n;
team = t;
age = a;
}
Cricketer (Cricketer ckt)
//constructor similar to copy
constructor of c++
{
name = ckt.name;
team = ckt.team;
age = ckt.age;
}
public String toString()
{
return "this is " + name + " of
"+team;
}
}
Class test:
{
public static void main (String[]
args)
{
Cricketer c1 = new Cricketer();
Cricketer c2 = new
Cricketer("sachin", "India", 32);
Cricketer c3 = new Cricketer(c2 );
System.out.println(c2);
System.out.println(c3);
c1.name = "Virat";
c1.team= "India";
c1.age = 32;
System .out. print in (c1);
}
}
output:
this is sachin of india
this is sachin of india
this is virat of india
Q What's the difference between
constructors and normal methods?
Constructors must have the same name as
the class and can not return a value. They
are only called once while regular methods
could be called many times and it can return
a value or can be void.
Q. What is constructor chaining in Java?
Constructor chaining is a
phenomena of calling one
constructor from another
constructor of same class.
Since constructor can only be called from
another constructor in Java, constructor
chaining is used for this purpose.
class Test
{
Test()
{
this(10);
}
Test(int x)
{
System.out.println("x=
"+x);
}
}
Q. Does constructors return any value?
Yes, constructors return current instant of a
class. But yet constructor signature cannot
have any return type.
this keyword
this keyword is used to
refer to current object.
this is always a
reference to the object
on which method was
invoked.
this can be used to
invoke current class
constructor.
this can be passed as an
argument to another
method.
Example :
class Box
{
Double w, weight,
dept;
Box (double w,
double h, double
d)
{
this.w = w;
this.height =
h;
this.depth =
d;
}
}
Here the this is used to initialize member of
current object.
The this is used to call overloaded
constructor in java
class Car
{
private String name;
public Car()
{
this("BMW");
//oveloaded
constructor is called.
}
public Car(Stting n)
{
this.name=n;
//member is
initialized using this.
}
}
The this is also used to call Method of that
class.
public void getName()
{
System.out.println("Studytonight");
}
public void display()
{
this.getName();
System.out.println();
}
needed and the memory
occupied by the object are
released. This technique is
called Garbage Collection.
This is accomplished by the JVM.
Unlike C++ there is no explicit need to
destroy object.
this is used to
return
current
Object
public Car
getCar()
{
return this;
}
Garbage Collection
In Java destruction of object
from memory is done
automatically by the JVM.
When there is no reference to
an object, then that object is
assumed to be no longer
Can the Garbage Collection be forced
explicitly ?
No, the Garbage Collection can not be
forced explicitly. We may request JVM for
garbage collection by calling
System.gc() method. But
This does not guarantee that JVM will
perform the garbage collection.
Advantages of Garbage Collection
1. Programmer doesn't
need to worry about
dereferencing an object.
Signature of
finalize() method
2. It is done automatically
by JVM.
protected void
finalize()
{
//finalize-code
}
3. Increases memory
efficiency and decreases
the chances for memory
leak.
finalize() method
Sometime an object will
need to perform some
specific task before it is
destroyed such as closing
an open connection or
releasing any resources
held. To handle such
situation finalize() method
is used. finalize() method is called by
garbage collection thread before collecting
object. Its
the last chance for
any object to perform cleanup
utility.
Some Important Points to Remember
in
java.lang.Object
1. finalize() method is defined
class, therefore it is available to all
the classes.
2. finalize() method is declare as
proctected inside Object class.
3. finalize() method gets called only
once by GC threads.
gc() Method
gc() method is used to call garbage collector
explicitly. However gc() method does not
guarantee that JVM will perform the
garbage collection. It only request the JVM
for garbage collection. This method is
present in System and Runtime class.
Example for gc() method
public class Test
{
public static void main(String[]
args)
{
Test t = new Test();
t=null;
System.gc();
}
public void finalize()
{
System.out.println("Garbage
Collected");
}
}
Public : Public scope is
visible everywhere
Protected : Protected has
scope within the package
and all sub classes
Private : Private has scope
only within the classes
Output :
Garbage Collected
Modifiers in Java
Modifiers are keywords that
are added to change meaning
of a definition. In Java,
modifiers are catagorized into
two types,
1. Access control modifier
2. Non Access Modifier
1) Access control modifier
Java language has four access modifier to
control access levels for classes, variable
methods and constructor.
[Default] : Default has
scope only inside the same
package
2) Non-access Modifier
Non-access modifiers do
not change the
accessibility of variables
and methods, but they do
provide them special
properties. Non-access modifiers are
of 5 types,
1. Final
2. Static
3. Transient
4. Synchronized
5. Volatile
Final
Final modifier is used to
declare a field as final i.e. it
prevents its content from
being modified. Final field must be
initialized when it is declared.
Example :
class Cloth
{
final int MAX_PRICE = 999;
//final variable
final int MIN_PRICE = 699;
final void display()
//final
method
{
System.out.println("Maxprice is" +
MAX_PRICE );
System.out.println("Minprice is" +
MIN_PRICE);
}
}
A class can also be declared as final. A class
declared as final cannot be inherited. String
class in java.lang package is a example of
final class. Method declared as final can be
inherited but you cannot override(redefine)
it.
Static Modifier
Static Modifiers are
used to create class
variable and class
methods which can be
accessed without
instance of a class. Lets study
how it works with variables and member
functions.
Static with Variables
Static variables are defined as a class
member that can be accessed without any
object of that class. Static variable has only
one single storage. All the object of the class
having static variable will have the same
instance of static variable. Static variables
are initialized only once.
Static variable are used to represent common
property of a class. It saves memory.
Suppose there are 100 employee in a
company. All employee have its unique
name and employee id but company name
will be same all 100 employee. Here
company name is the common property. So
if you create a class to store employee detail,
company_name field will be mark as static.
Example
class Employee
{
int e_id;
String name;
static String company_name =
"StudyTonight";
}
Example of static variable
class ST_Employee
{
int eid;
String name;
static String company_name
="StudyTonight";
public void show()
{
System.out.println(eid+"
"+name+" "+company_name);
}
public static void
main( String[] args )
{
ST_Employee se1 = new
ST_Employee();
se1.eid = 104;
se1.name = "Abhijit";
se1.show();
ST_Employee se2 = new
ST_Employee();
se2.eid = 108;
se2.name = "ankit";
se2.show();
}
}
Output
104 Abhijit StudyTonight
108 ankit StudyTonight
Static variable vs Instance Variable
Static variable
Instance Variable
Represent
common
Represent unique property
property
Accessed using
Accessed using object
class name
get new memory each
get memory only
time a new object is
once
created
Example
public class Test
{
static int x = 100;
int y = 100;
public void increment()
{
x++; y++;
}
public static void main( String[]
args )
{
Test t1 = new Test();
Test t2 = new Test();
t1.increment();
t2.increment();
System.out.println(t2.y);
System.out.println(Test.x);
//accessed without any instance of
class.
}
}
Output
101
102
See the difference in value of two variable.
Static variable y shows the changes made to
it by increment() method on the different
object. While instance variable x show only
the change made to it by increment() method
on that particular instance.
Static Method
A method can also be declared as static.
Static methods do not need instance of its
class for being accessed. main() method is
the most common example of static method.
main() method is declared as static because
it is called before any object of the class is
created.
Example :
{
square(8)
//static method square
() is called without any instance of
class.
}
}
Output: 64
Static block
Static block is used to initialize static data
member. Static block executes before
main() method.
Example
class ST_Employee
{
int eid;
String name;
static String company_name;
static {
company_name ="StudyTonight";
//static block invoked before main()
method
}
public void show()
{
System.out.println(eid+"
"+name+" "+company_name);
}
public static void
main( String[] args )
{
ST_Employee se1 = new
ST_Employee();
se1.eid = 104;
se1.name = "Abhijit";
se1.show();
class Test
{
}
}
public static void square(int x)
{
System.out.println(x*x);
}
public static void main (String[]
arg)
Output
104 Abhijit StudyTonight
Q. Why a non-static variable cannot be
referenced from a static context ?
When you try to access a non-static variable
from a static context like main method, java
compiler throws a message like "a nonstatic variable cannot be referenced from a
static context". This is because non-static
variables are related with instance of
class(object) and they get created when
instance of a class is created by using new
operator. So if you try to access a non-static
variable without any instance compiler will
complain because those variables are not yet
created and they don't have any existence
until an instance is created and associated
with it.
Example of accessing non-static variable
from a static context
class Test
{
int x;
public static void main(String[]
args)
{
x=10;
}
}
Output
compiler error: non-static variable
count cannot be referenced from a
static context
Same example using instance of class
class Test
{
int x;
public static void main(String[]
args)
{
Test tt=new Test();
tt.x=10; //works fine with
instance of class
}
}
Q. Why main() method is static in java ?
Because static methods can be called
without any instance of a class and main() is
called before any instance of a class is
created.
Transient modifier
When an instance
variable is declared as
transient, then its value
doesn't persist when an
object is serialized
Synchronized modifier
When a method is
synchronized it can be
accessed by only one
thread at a time. We will
discuss it in detail in
Thread.
Volatile modifier
Volatile modifier tells
the compiler that the
volatile variable can be
changed unexpectedly
by other parts of your
program. Volatile
variables are used in
case of multithreading
program.
Inheritance (IS-A)
Inheritance is one of the key features of
Object Oriented Programming. Inheritance
provided mechanism that allowed a class to
inherit property of another class. When a
Class extends another class it inherits all
non-private members including fields and
methods. Inheritance in Java can be best
understood in terms of Parent and Child
relationship, also known as Super
class(Parent) and Sub class(child) in Java
language.
Inheritance defines is-a
relationship between a
Super class and its Sub
class. extends and
extends keyword is
Let us see how
used to achieve Inheritance.
class Vehicle.
{
......
}
class Car extends Vehicle
{
.......
//extends the property of
vehicle class.
}
Now based on above example. In OOPs
term we can say that,
Vehicle is super class of Car.
Car is sub class of Vehicle.
Car IS-A Vehicle.
implements keywords are
used to describe inheritance in Java.
Purpose of
Inheritance
1. To promote
code reuse.
2. To use
Polymorphism.
Simple example of Inheritance
class Parent
{
public void p1()
{
System.out.println("Parent
method");
}
}
public class Child extends Parent {
public void c1()
{
System.out.println("Child
method");
}
public static void main(String[]
args)
{
Child cobj = new Child();
cobj.c1();
//method of
Child class
cobj.p1();
//method of
Parent class
}
}
Output
Child method
Parent method
Another example of Inheritance
class Vehicle
{
String vehicleType;
}
public class Car extends Vehicle {
String modelType;
public void showDetail()
{
vehicleType = "Car";
//accessing Vehicle class member
modelType = "sports";
System.out.println(modelType+"
"+vehicleType);
}
public static void main(String[]
args)
{
Car car =new Car();
car.showDetail();
}
}
Output
sports Car
Types of Inheritance
1. Single
Inheritance
2. Multilevel
Inheritance
3. Heirarchical
Inheritance
Multiple
inheritance is not
supported in java
NOTE :
Why multiple
inheritance is not
supported in Java
To remove
ambiguity.
To provide more
maintainable and
clear design.
super keyword
In Java, super keyword is used to refer to
immediate parent class of a class. In other
super keyword is
used by a subclass
whenever it needs to
refer to its immediate
super class.
words
Parent and Child
Example of Child class refering Parent
class methods using super keyword
Example of Child class refering Parent
class property using super keyword
class Parent
{
String name;
}
public class Child extends Parent {
String name;
public void details()
{
super.name = "Parent";
//refers to parent class member
name = "Child";
System.out.println(super.name+" and
"+name);
}
public static void main(String[]
args)
{
Child cobj = new Child();
cobj.details();
}
}
Output
class Parent
{
String name;
public void details()
{
name = "Parent";
System.out.println(name);
}
}
public class Child extends Parent {
String name;
public void details()
{
super.details();
//calling Parent class
details() method
name = "Child";
System.out.println(name);
}
public static void main(String[]
args)
{
Child cobj = new Child();
cobj.details();
}
}
Output
Parent
Child
Example of Child class calling Parent
class constructor using super keyword
class Parent
{
String name;
public Parent(String n)
{
name = n;
}
}
public class Child extends Parent {
String name;
public Child(String n1, String
n2)
super(n1);
//passing
argument to parent class constructor
this.name = n2;
}
public void details()
{
System.out.println(super.name+" and
"+name);
}
public static void
main(String[] args)
{
Child cobj = new
Child("Parent","Child");
cobj.details();
}
}
Output
Parent and Child
Super class reference pointing to Sub
class object.
HAS-A relationship is based
on usage, rather than
inheritance. In other words,
class A has-a relationship
with class B, if code in class
A has a reference to an
instance of class B.
Example
class Student
{
String name;
Address ad;
}
Here you can say that Student has-a
Address.
In context to above example where Class B
extends class A.
A a=new B();
is legal syntax because of IS-A relationship
is there between class A and Class B.
Q. Can you use both this() and super() in
a Constructor?
NO, because both super() and this() must be
first statement inside a constructor. Hence
we cannot use them together.
Aggregation (HAS-A)
Student class has an instance variable of
type Address. Student code can use Address
reference to invoke methods on the
Address, and get Address behavior.
Aggregation allow you to design classes that
follow good Object Oriented practices. It
also provide code reusability.
Example of Aggregation
class Author
{
String authorName;
int age;
String place;
Author(String name,int age,String
place)
{
this.authorName=name;
this.age=age;
this.place=place;
}
public String getAuthorName()
{
return authorName;
}
public int getAge()
{
return age;
}
public String getPlace()
{
return place;
}
}
class Book
{
String name;
int price;
Author auth;
Book(String n,int p,Author at)
{
this.name=n;
this.price=p;
this.auth=at;
}
public void showDetail()
{
System.out.println("Book
is"+name);
System.out.println("price
"+price);
System.out.println("Author is
"+auth.getAuthorName());
}
}
class Test
{
public static void main(String
args[])
{
Author ath=new
Author("Me",22,"India");
Book b=new Book("Java",550,ath);
b.showDetail();
}
}
Output:
Book is Java.
price is 550.
Author is me.
Q. What is Composition in java?
Composition is
restricted form of
Aggregation. For
example a class Car
cannot exist without
Engine.
class Car
{
private Engine engine;
Car(Engine en)
{
engine = en;
}
}
Q. When to use Inheritance and
Aggregation?
When you need to use property and
behaviour of a class without modifying it
inside your class. In such case Aggregation
is a better option. Whereas when you need
to use and modify property and behaviour of
a class inside your class, its best to use
Inheritance.
other objects. For example: Maruti has
Engine, or House has Bathroom.
Lets understand these concepts with
example of Car class.
Description
One of the advantages of Object-Oriented
programming language is code reuse. There
are two ways we can do code reuse either by
implementation of inheritance (IS-A
relationship), or object composition (HAS-A
relationship). Although the compiler and
Java virtual machine (JVM) will do a lot of
work for you when you use inheritance, you
can also get at the functionality of
inheritance when you use composition.
IS-A Relationship:
In object oriented programming, the concept
of IS-A is a totally based on Inheritance,
which can be of two types Class Inheritance
or Interface Inheritance. It is just like saying
"A is a B type of thing". For example, Apple
is a Fruit, Car is a Vehicle etc. Inheritance is
uni-directional. For example House is a
Building. But Building is not a House.
It is key point to note that you can easily
identify the IS-A relationship. Wherever you
see an extends keyword or implements
keyword in a class declaration, then this
class is said to have IS-A relationship.
view plainprint?
1. package relationships;
2.
3. class Car {
4.
// Methods implementation an
d class/Instance members
5.
private String color;
6.
private int maxSpeed;
7.
8.
9.
10.
HAS-A Relationship:
11.
Composition(HAS-A) simply mean use of
instance variables that are references to
12.
public void carInfo(){
System.out.println("Car Col
or= "+color + " Max Speed= "
+ maxSpeed);
}
public void setColor(String col
or) {
13.
this.color = color;
14.
15.
16.
Maruti class uses Engine objects start()
method via composition. We can say that
Maruti class HAS-A Engine.
view plainprint?
public void setMaxSpeed(int
maxSpeed) {
17.
this.maxSpeed = maxSpee
d;
18.
1. package relationships;
2.
3. public class Engine {
4.
19.
5.
20.}
6.
As shown above Car class has couple of
instance variable and few methods. Maruti is
specific type of Car which extends Car class
means Maruti IS-A Car.
7.
view plainprint?
9.
1. class Maruti extends Car{
2.
//Maruti extends Car and thus
inherits all methods from Car (e
xcept final and static)
3.
//Maruti can also define all its
specific functionality
4.
public void MarutiStartDemo(
){
5.
Engine MarutiEngine = ne
w Engine();
6.
MarutiEngine.start();
7.
8.
public void start(){
System.out.println("Engine
Started:");
}
8.
10.
public void stop(){
System.out.println("Engine
Stopped:");
11.
12.}
RelationsDemo class is making object of
Maruti class and initialized it. Though
Maruti class does not have setColor(),
setMaxSpeed() and carInfo() methods still
we can use it due to IS-A relationship of
Maruti class with Car class.
view plainprint?
1. package relationships;
2.
3. public class RelationsDemo {
4.
5.
public static void main(String
[] args) {
6.
Maruti myMaruti = new Ma
ruti();
7.
myMaruti.setColor("RED");
8.
myMaruti.setMaxSpeed(18
You can't add to a subclass a
method with the same signature
but a different return type as a
method inherited from a
superclass. Composition, on the
other hand, allows you to
change the interface of a frontend class without affecting
back-end classes.
Composition is dynamic binding
(run time binding) while
Inheritance is static binding
(compile time binding)
It is easier to add new
subclasses (inheritance) than it
is to add new front-end classes
(composition), because
inheritance comes with
polymorphism. If you have a bit
of code that relies only on a
superclass interface, that code
can work with a new subclass
without change. This is not true
of composition, unless you use
composition with interfaces.
Used together, composition and
interfaces make a very powerful
design tool.
With both composition and
inheritance, changing the
implementation (not the
interface) of any class is easy.
The ripple effect of
implementation changes remain
inside the same class.
0);
9.
myMaruti.carInfo();
10.
11.
myMaruti.MarutiStartDemo
();
12.
13.
14.}
If we run RelationsDemo class we can see
output like below.
Comparing Composition and
Inheritance
It is easier to change the class
implementing composition than
inheritance. The change of a
superclass impacts the
inheritance hierarchy to
subclasses.
Don't use inheritance
just to get code
reuse If all you really
want is to reuse code and
there is no is-a
relationship in sight, use
composition.
Don't use inheritance
just to get at
polymorphism If all you
really want is
polymorphism, but there
is no natural is-a
relationship, use
composition with
interfaces.
Summary
IS-A relationship based on
Inheritance, which can be of two
types Class Inheritance or
Interface Inheritance.
Has-a relationship is
composition relationship which
is productive way of code reuse.
These terms signify the relationships
between classes. These are the building
blocks of object oriented programming and
very basic stuff. But still for some, these
terms look like Latin and Greek. Just wanted
to refresh these terms and explain in simpler
terms.
Association
Association is a relationship between two
objects. In other words, association defines
the multiplicity between objects. You may
be aware of one-to-one, one-to-many, manyto-one, many-to-many all these words define
an association between objects. Aggregation
is a special form of association.
Composition is a special form of
aggregation.
Example: A Student and a Faculty are
having an association.
Aggregation
Aggregation is a special case of association.
A directional association between objects.
When an object has-a another object, then
you have got an aggregation between them.
Direction between them specified which
object contains the other object. Aggregation
is also called a Has-a relationship.
Composition
Composition is a special case of
aggregation. In a more specific manner, a
restricted aggregation is called composition.
When an object contains the other object, if
the contained object cannot exist without the
existence of container object, then it is
called composition.
Example: A class contains students. A
student cannot exist without a class. There
exists composition between class and
students.
Difference between aggregation and
composition
Composition is more restrictive. When there
is a composition between two objects, the
composed object cannot exist without the
other object. This restriction is not there in
aggregation. Though one object can contain
the other object, there is no condition that
the composed object must exist. The
existence of the composed object is entirely
optional. In both aggregation and
composition, direction is must. The direction
specifies, which object contains the other
object.
Example: A Library contains students and
books. Relationship between library and
student is aggregation. Relationship between
library and book is composition. A student
can exist without a library and therefore it is
aggregation. A book cannot exist without a
library and therefore its a composition. For
easy understanding I am picking this
example. Dont go deeper into example and
justify relationships!
faculty is a person. Therefore here the
relationship between student and person,
similarly faculty and person is
generalization.
Realization
Realization is a relationship between the
blueprint class and the object containing its
respective implementation level details. This
object is said to realize the blueprint class.
In other words, you can understand this as
the relationship between the interface and
the implementing class.
Abstraction
Abstraction is specifying the framework and
hiding the implementation level information.
Concreteness will be built on top of the
abstraction. It gives you a blueprint to
follow to while implementing the details.
Abstraction reduces the complexity by
hiding low level details.
Example: A wire frame model of a car.
Generalization
Generalization uses a is-a relationship
from a specialization to the generalization
class. Common structure and behaviour are
used from the specializtion to the
generalized class. At a very broader level
you can understand this as inheritance. Why
I take the term inheritance is, you can relate
this term very well. Generalization is also
called a Is-a relationship.
Example: Consider there exists a class
named Person. A student is a person. A
Example: A particular model of a car GTB
Fiorano that implements the blueprint of a
car realizes the abstraction.
Dependency
Change in structure or behaviour of a class
affects the other related class, then there is a
dependency between those two classes. It
need not be the same vice-versa. When one
class contains the other class it this happens.
Example: Relationship between shape and
circle is dependency
Method Overriding
When a method in a sub
class has same name and
type signature as a method
in its super class, then the
method is known as
overridden method. Method
overriding is also referred to as runtime
polymorphism. The key benefit of
overriding is the abitility to define method
that's specific to a particular subclass
type.
Example of Method Overriding
class Animal
{
public void eat()
{
System.out.println("Generic Animal
eating");
}
}
class Dog extends Animal
{
public void eat()
//eat() method
overriden by Dog class.
{
System.out.println("Dog eat
meat");
}
}
As you can see here Dog class gives it own
implementation of eat() method. Method
must have same name and same type
signature.
NOTE : Static methods cannot be
overridden because, a static method is
bounded with class where as instance
method is bounded with object.
Covariant return type
Since Java 5, it is possible to override a
method by changing its return type.
If
subclass overrides any
method by changing the
return type of super class
method, then the return
type of overriden method
must be subtype of return
type declared in original
method inside the super
class. This is the only way by which
method can be overriden by changing its
return type.
Example :
class Animal
{
Animal myType()
{
return new Animal();
}
}
class Dog extends Animal
{
Dog myType()
//Legal
override after Java5
onward
{
return new Dog();
}
}
Difference between Overloading and
Overriding
Method
Method Overriding
Overloading
Parameter must be Both name and
different and name parameter must be
must be same.
same.
Compile time
Runtime polymorphism.
polymorphism.
Increase readability Increase reusability of
of code.
code.
Access specifier most
not be more restrictive
Access specifier
than original
can be changed.
method(can be less
restrictive).
No, we cannot override static method.
Because static method is bound to class
whereas method overriding is associated
with object i.e at runtime.
Runtime Polymorphism or
Dynamic method dispatch
Dynamic method
dispatch is a
mechanism by which
a call to an
overridden method
is resolved at
runtime. This is how java
implements runtime polymorphism. When
an overridden method is called by a
reference, java determines which version of
that method to execute based on the type of
object it refer to. In simple words the type of
object which it referred determines which
version of overridden method will be called.
Q. Can we Override static method ?
Explain with reasons ?
ck.type();
gm=ck;
//gm refers to
Cricket object
gm.type(); //calls Cricket's
version of type
}
}
Output:
Indoor & outdoor
Outdoor game
Outdoor game
Notice the last output. This is because of gm
= ck; Now gm.type() will call Cricket
version of type method. Because here gm
refers to cricket object.
Upcasting
When Parent class reference variable refers
to Child class object, it is known as
Upcasting
Example
class Game
{
public void type()
{ System.out.println("Indoor &
outdoor"); }
}
Class Cricket extends Game
{
public void type()
{ System.out.println("outdoor
game"); }
public static void main(String[]
args)
{
Game gm = new Game();
Cricket ck = new Cricket();
gm.type();
Q. Difference between Static binding and
Dynamic binding in java ?
Static binding in Java occurs
during compile time while
dynamic binding occurs
during runtime. Static binding uses
type(Class) information for binding while
dynamic binding uses instance of
class(Object) to resolve calling of method at
run-time. Overloaded methods are bonded
using static binding while overridden
methods are bonded using dynamic binding
at runtime.
instanceof operator
In Java, instanceof
operator is used to
check the type of an
object at runtime. It is
the means by which your program can
obtain run-time type information about an
object. instanceof operator is also
important in case of casting object at
runtime. instanceof operator return
boolean value, if an object reference is of
specified type then it return true otherwise
false.
Example of instanceOf
public class Test
{
public static void main(String[]
args)
{
Test t= new Test();
System.out.println(t
instanceof Test);
}
}
output true
Downcasting
Example of downcasting with instanceof
operator
class Parent{ }
public class Child extends Parent
{
public void check()
{
System.out.println("Sucessfull
Casting");
}
public static void show(Parent
p)
if(p instanceof Child)
{
Child b1=(Child)p;
b1.check();
}
public static void main(String[]
args)
{
Parent p=new Child();
Child.show(p);
Output
Output
Sucessfull Casting
true
true
false
false
true
false
false
true
More example of instanceof operator
class Parent{}
class Child1 extends Parent{}
class Child2 extends Parent{}
class Test
{
public static void main(String[]
args)
{
Parent p =new Parent();
Child1 c1 = new Child1();
Child2 c2 = new Child2();
System.out.println(c1
instanceof Parent);
//true
System.out.println(c2
instanceof Parent);
//true
System.out.println(p
instanceof Child1);
//false
System.out.println(p
instanceof Child2);
//false
p = c1;
System.out.println(p
instanceof Child1);
//true
System.out.println(p
instanceof Child2);
//false
p = c2;
System.out.println(p
instanceof Child1);
//false
System.out.println(p
instanceof Child2);
//true
}
Command line argument in Java
The command line
argument is the
argument passed to a
program at the time
when you run it. To access the
command-line argument inside a java
program is quite easy, they are stored as
string in String array passed to the args
parameter of main() method.
Example
class cmd
{
public static void main(String[]
args)
{
for(int i=0;i< args.length;i++)
{
System.out.println(args[i]);
}
}
}
Execute this program as java cmd 10 20
30
Output
10
20
30
Package are categorized into two
forms
Built-in Package:Existing Java
package for
example java.lang,
java.util etc.
Java Package
Package are used in Java,
in-order to avoid name
conflicts and to control
access of class, interface
and enumeration etc. A
package can be defined as
a group of similar types of
classes, interface,
enumeration and subpackage. Using package it
becomes easier to locate
the related classes.
User-definedpackage:- Java
package created by
user to categorized
classes and
interface
Creating a package
Creating a package in java is quite easy.
Simply include a package command
followed by name of the package as the first
statement in java source file.
package
package_name[.subpackage
_name[..]];
package mypack;
public class employee
{
...statement;
}
The above statement create a
package called mypack.
Java uses file system
directory to store package. For
example the .class for any classes you to
define to be part of mypack package must
be stored in a directory called mypack
class test
{
public static void main(String[]
args)
{
Book bk = new
Book("java","Herbert");
bk.show();
}
}
To run this program :
create a directory under your
current working development
directory(i.e. JDK directory),
name it as mypack.
compile the source file
Put the class file into the
directory you have created.
Execute the program from
development directory.
NOTE : Development directory is the
directory where your JDK is install.
Uses of java package
Example of package creation
package mypack
class Book
{
String bookname;
String author;
Book(String b, String c)
{
this.bookname = b;
this.author = c;
}
public void show()
{
System.out.println(bookname+" "+
author);
Package is a way to organize files in java, it
is used when a project consists of multiple
modules. It also helps resolve naming
conflicts. Package's access level also allows
you to protect data from being used by the
non-authorized classes.
import keyword
import keyword is used to import built-in
and user-defined packages into your java
source file. So that your class can refer to a
class that is in another package by directly
using its name.
There are 3 different ways
to refer to class that is
present in different
package
1.Using fully
qualified name
(But this is not a
good practice.)
Example :
class MyDate
extends
java.util.Date
{
//statement;
}
2.
import the
only class you
want to use.
import
java.util.Dat
e;
class MyDate extends Date
{
//statement.
}
3.
import all
the classes
from the
particular
package
Example :
import
java.util.*;
class MyDate extends Date
{
//statement;
}
import statement is kept after the
package statement.
Example :
package mypack;
import java.util.*;
But if you are not creating any package then
import statement will be the first statement
of your java source file.
Example :
Jar cfv hello.jar mypack(folder)
static method sqrt
of Math class
Set classpath=.;d:\java7\hello.jar
The second form
of static import
statement,import
s all the static
member of a
class
Static import
static import is a feature that expands the
capabilities of import keyword. It is used to
import static member of a class. We all
know that static member are referred in
association with its class name outside the
class. Using static import, it is possible to
refer to the static member directly without
its class name. There are two general form
of static import statement.
Syntax
import static
package.classtype-name.*;
The first form
of static import
statement,
import only a
single static
member of a
class
Example
import static
java.lang.Math.*;
//importing all
static member of
Math class
Syntax
Example without using static import
import static
package.classname.staticmember-name;
Example
import static
java.lang.Math.sqr
t;
//importing
public class Test
{
public static void main(String[]
args)
{
System.out.println(Math.sqrt(144));
}
}
Output
12
Example using static import
import static java.lang.Math.*;
public class Test
{
public static void main(String[]
args)
{
System.out.println(sqrt(144));
}
}
Output
12
Abstract class
If a class contain any
abstract method then the
class is declared as
abstract class. An
abstract class is never
instantiated. It is used to
provide abstraction.
Although it does not provide 100%
abstraction because it can also have concrete
method.
Syntax :
abstract class
class_name { }
Abstract method
Method that are
declared without any
body within an abstract
class is known as
abstract method. The
method body will be
defined by its subclass.
Abstract method can never
be final and static. Any class
that extends an abstract class must
implement all the abstract methods declared
by the super class.
Syntax :
abstract return_type
method_name(para_lis
t);
// No
definition
Example of Abstract class
abstract class A
{
abstract void callme();
}
class B extends A
{
void callme()
{
System.out.println("this is
callme.");
}
public static void main(String[]
args)
{
B b=new B();
b.callme();
}
}
output: this is callme.
4. Abstract classes are never
instantiated.
Abstract class with concrete(normal)
method.
5. When you extend Abstract class with
abstract method, you must define the
abstract method in the child class, or
make the child class abstract.
Abstract classes can also have normal
methods with definitions, along with
abstract methods.
abstract class A
{
abstract void callme();
public void normal()
{
System.out.println("this is
concrete method");
}
}
class B extends A
{
void callme()
{
System.out.println("this is
callme.");
}
public static void main(String[]
args)
{
B b=new B();
b.callme();
b.normal();
}
}
output:
this is callme.
this is concrete method.
Points to Remember
1. Abstract classes are not Interfaces.
They are different, we will study this
when we will study Interfaces.
2. An abstract class must have an
abstract method.
3. Abstract classes can have
Constructors, Member variables and
Normal methods.
Abstraction using abstract class
Abstraction is an important feature of
OOPS. It means hiding complexity. Abstract
class is used to provide abstraction.
Although it does not provide 100%
abstraction because it can also have concrete
method. Lets see how abstract class is used
to provide abstraction.
abstract class Vehicle
{
public abstract void engine();
}
public class Car extends Vehicle {
public void engine()
{
System.out.println("Car
engine");
//car engine implementation
}
public static void main(String[]
args)
{
Vehicle v = new Car();
v.engine();
}
Output
Car engine
Here by casting instance of Car type to
Vehicle reference, we are hiding the
complexity of Car type under Vechicle.
Now the Vehicle reference can be used to
provide the implementation but it will hide
the actual implementation process.
do without saying anything about how the
class will do it.
Syntax :
When to use Abstract Methods &
Abstract Class?
Abstract methods are usually declared where
two or more subclasses are expected to do a
similar thing in different ways through
different implementations. These subclasses
extend the same Abstract class and provide
different implementations for the abstract
methods.
Abstract classes are used to define generic
types of behaviors at the top of an objectoriented programming class hierarchy, and
use its subclasses to provide implementation
details of the abstract class.
interface
interface_name { }
Example of Interface
interface Moveable
{
int AVERAGE-SPEED=40;
void move();
}
Interface
Interface is a pure abstract
class.They are
syntactically similar to
classes, but you cannot
create instance of an
Interface and their
methods are declared
without any body.
Interface is used to
achieve complete
abstraction in Java. When you
create an interface it defines what a class can
Compiler
automatically
converts methods of
Interface as public
NOTE :
and abstract, and the
data members as
public, static and final
by default.
Rules for using Interface
Methods inside Interface must not be
static, final, native or strictfp.
All variables declared inside
interface are implicitly public static
final variables(constants).
All methods declared inside Java
Interfaces are implicitly public and
abstract, even if you don't use public
or abstract keyword.
Interface can extend one or more
other interface.
Interface cannot implement a class.
Interface can be nested inside
another interface.
Example of Interface implementation
interface Moveable
{
int AVG-SPEED = 40;
void move();
}
class Vehicle implements Moveable
{
public void move()
{
System .out. print in ("Average
speed is"+AVG-SPEED");
}
public static void main (String[]
arg)
{
Vehicle vc = new Vehicle();
vc.move();
}
}
Output:
Average speed is 40.
Interfaces supports Multiple Inheritance
Though classes in java doesn't suppost
multiple inheritance, but a class can
implement more than one interface.
interface Moveable
{
boolean isMoveable();
}
interface Rollable
{
boolean isRollable
}
class Tyre implements Moveable,
Rollable
{
int width;
boolean isMoveable()
{
return true;
}
boolean isRollable()
{
return true;
}
public static void main(String
args[])
{
Tyre tr=new Tyre();
System.out.println(tr.isMoveable());
System.out.println(tr.isRollable());
}
}
Output:
true
true
Interface extends other Interface
Classes implements interfaces, but an
interface extends other interface.
interface NewsPaper
{
news();
}
interface Magazine extends NewsPaper
{
colorful();
}
Difference between an
interface and an abstract
class?
Abstract class
Interface
methods should be
implemented and
specialization
implemented.
behavior should be
implemented by
child classes.
Introduction to String Handling
String is probably the most commonly used
class in java library. String class is
encapsulated under java.lang package. In
java, every string that you create is actually
an object of type String. One important
thing to notice about string object is that
string objects are immutable that means
once a string object is created it cannot be
altered.
What is an Immutable object?
Abstract class
Interface
Interface is a Java
Object containing
Abstract class is a
method declaration but
class which contain
no implementation.
one or more abstract
The classes which
methods, which has
implement the
to be implemented
Interfaces must provide
by its sub classes.
the method definition
for all the methods.
Abstract class is a
Interface is a pure
Class prefix with an
abstract class which
abstract keyword
starts with interface
followed by Class
keyword.
definition.
Whereas, Interface
Abstract class can
contains all abstract
also contain
methods and final
concrete methods.
variable declarations.
Abstract classes are Interfaces are useful in
useful in a situation a situation that all
that Some general properties should be
An object whose state
cannot be changed after it
is created is known as an
Immutable object. String,
Integer, Byte, Short, Float,
Double and all other
wrapper class's objects are
immutable.
Creating an Immutable class
public final class MyString
{
final String str;
MyString(String s)
{
this.str = s;
}
public String get()
{
return str;
}
or,
String str5 =
"hello"+"Java";
In this example MyString is an immutable
class. MyString's state cannot be changed
once it is created.
Creating a String object
String can be created in number of ways,
here are a few ways of creating string object.
1) Using a String literal
String literal is a simple string enclosed in
double quotes " ". A string literal is treated
as a Sting object.
Each time you create a String literal, the
JVM checks the string pool first. If the
string literal already exists in the pool, a
reference to the pool instance is returned. If
string does not exist in the pool, a new string
object is created, and is placed in the pool.
String objects are stored in a special
memory area known as string constant pool
inside the heap memory.
String object and How they are stored
String str1 =
"Hello";
When we create a new string object using
string literal, that string literal is added to
the string pool, if it is not present there
already.
2) Using another String object
String str=
"Hello";
String str2 = new
String(str1);
3) Using new Keyword
String str3 = new
String("Java");
4) Using + operator (Concatenation)
String str4 = str1 +
str2;
And, when we create another object with
same string, then a reference of the string
literal already present in string pool is
returned.
String
str2=str;
Concatenating String
There are 2 methods to concatenate two or
more string.
1.
Using
concat() method
But if we change the new string, its
reference gets modified.
str2=str2.concat
("world");
2.
Using +
operator
1) Using concat() method
string s = "Hello";
string str = "Java";
string str2 =
s.concat(str);
String str1 =
"Hello".concat("Java
");
//works with string
3.
By
CompareTo()
method
literals too.
Using equals() method
2) Using + operator
string str =
"Rahul";
string str1 =
"Dravid";
string str2 =
str + str1;
string st =
"Rahul"+"Dravid"
;
equals() method compares two strings for
equality. Its general syntax is,
boolean equals
(Object str)
It compares the content of the strings. It will
return true if string matches, else returns
false.
String s = "Hell";
String s1 = "Hello";
String s2 = "Hello";
s1.equals(s2);
//true
s.equals(s1) ;
//false
Using == operator
String Comparison
String comparison can be done in 3 ways.
1.
Using
equals() method
2.
Using ==
operator
operator compares two object references
to check whether they refer to same
instance. This also, will return true on
successful match.
==
String s1 =
"Java";
String s2 =
"Java";
String s3 = new
string ("Java");
test(Sl == s2)
//true
test(s1 == s3)
By
//false
compareTo() method
compareTo() method compares values and
returns an int which tells if the string
compared is less than, equal to or greater
than th other string. Its general syntax is,
int compareTo(String str)
To use this function you must implement the
Comparable Interface. compareTo() is the
only function in Comparable Interface.
String s1 = "Abhi";
String s2 = "Viraaj";
String s3 = "Abhi";
s1.compareTo(S2);
//return -1
because s1 < s2
s1.compareTo(S3);
//return 0
because s1 == s3
s2.compareTo(s1);
//return 1
because s2 > s1
equalsIgnoreCase()
equalsIgnoreCase() determines the equality
of two Strings, ignoring thier case (upper or
lower case doesn't matters with this
fuction ).
String str = "java";
System.out.println(s
tr.equalsIgnoreCase(
"JAVA"));
Output : true
length()
length() function returns the number of
characters in a String.
String str = "Count me";
System.out.println(str.length());
String class function
Output : 8
The following methods are some of the most
commonly used methods of String class.
charAt()
charAt() function returns the character
located at the specified index.
String str = "cmtes
limited";
System.out.println(s
tr.charAt(2));
Output : t
replace()
replace() method replaces
occurances of character with
a specified new character.
String str = "Change me";
System.out.println(str.re
place('m','M'));
Output : Change Me
substring()
substring() method returns a part of the
string. substring() method has two forms,
public String
substring(int begin);
public String
substring(int begin,
int end);
The first argument represents the starting
point of the subtring. If the substring()
method is called with only one argument,
the subtring returned, will contain characters
from specified starting point to the end of
original string.
But, if the call to substring() method has two
arguments, the second argument specify the
end point of substring.
String str = "0123456789";
System.out.println(str.substring(4))
;
Output : 456789
System.out.println(str.substring(4,7
));
Output : 456
toLowerCase()
toLowerCase() method returns string with
all uppercase characters converted to
lowercase.
String str = "ABCDEF";
System.out.println(str.toLowerCase()
);
Output : abcdef
valueOf()
Overloaded version of valueOf() method is
present in String class for all primitive data
types and for type Object.
NOTE : valueOf() function is used to
convert primitive data types into Strings.
valueOf()
method calls toString()
But for objects,
function.
toString()
toString() method
returns the string
representation of the
object used to invoke
this method. toString() is used to
represent any Java Object into a meaningful
string representation. It is declared in the
Object class, hence can be overrided by any
java class. (Object class is super class of all
java classes.)
public class
Car {
public static
void
main(String
args[])
{
Car c=new
Car();
System.out.prin
tln(str.toStrin
g());
System.out.prin
tln(c);
}
public String
toString()
{
return "This
is my car
object";
}
}
toString() with Concatenation
Output : This is my car object
Whenever we will try to print any object of
class Car, its toString() function will be
called. toString() can also be used with
normal string objects.
String str =
"Hello World";
Output : Hello World
Whenever we concatenate any other
primitive data type, or object of other classes
with a String object, toString() function or
valueOf() function is called automatically to
change the other object or primitive type
into string, for successful concatenation.
int age = 10;
String str = "He is"
+ age + "years
old.";
In above case 10 will be automatically
converted into string for concatenation using
valueOf() function.
toUpperCase()
This method returns string with all
lowercase character changed to uppercase.
String str = "abcdef";
System.out.println(str.toLowerCase()
);
Output : ABCDEF
trim()
This method returns a string from which any
leading and trailing whitespaces has been
removed.
StringBuffer()
String str = "
hello ";
System.out.println
(str.trim());
stringBuffer(int size)
Output : hello
StringBuffer class
StringBuffer class is used to create a
mutable string object. It represents
growable and writable character sequence.
As we know that String objects are
immutable, so if we do a lot of changes with
String objects, we will end up with a lot of
memory leak.
So StringBuffer class is used when we have
to make lot of modifications to our string. It
is also thread safe i.e multiple threads cannot
access it simultaneously. StringBuffer
defines 4 constructors. They are,
1. StringBuffer ( )
2. StringBuffer ( int size )
3. StringBuffer ( String
str )
creates an empty
string buffer and reserves room for
16 characters.
creates
an empty string and takes an integer
argument to set capacity of the
buffer.
Example showing difference between
String and StringBuffer
class Test {
public static void main(String
args[])
{
String str = "study";
str.concat("cmtes");
System.out.println(str);
//
Output: study
strB = new
StringBuffer("study");
StringBuffer
strB.append("cm
tes");
System.out.println(strB);
Output: studycmtes
}
}
//
Important methods of StringBuffer class
The following methods are some most
commonly used methods of StringBuffer
class.
append()
4. StringBuffer (
charSequence [ ]ch )
This method will concatenate the string
representation of any type of data to the end
of the invoking StringBuffer object.
append() method has several overloaded
forms.
StringBuffer
append(String str)
StringBuffer
append(int n)
StringBuffer
append(Object obj)
The string representation of each parameter
is appended to StringBuffer object.
StringBuffer str = new
StringBuffer("test");
str.append(123);
System.out.println(str);
Output : test123
insert()
This method inserts one string into another.
Here are few forms of insert() method.
StringBuffer
insert(int index,
String str)
StringBuffer
insert(int index, int
num)
Here the first parameter gives the index at
which position the string will be inserted
and string representation of second
parameter is inserted into StringBuffer
object.
StringBuffer str =
new
StringBuffer("test")
;
str.insert(4, 123);
System.out.println(s
tr);
Output : test123
reverse()
This method reverses the characters within a
StringBuffer object.
StringBuffer str = new
StringBuffer("Hello");
str.reverse();
System.out.println(str);
Output : olleH
replace()
This method replaces the string from
specified start index to the end index.
StringBuffer str = new
StringBuffer
insert(int index,
Object obj)
Hello
StringBuffer("
World");
str.replace( 6,
11, "java");
System.out.println(str);
Output : Hello java
capacity()
exception means
exceptional condition, it
is a problem that may
arise during the
execution of program. A
This method returns the current capacity of
StringBuffer object.
bunch of things can lead to exceptions,
including programmer error, hardware
failures, files that need to be opened cannot
be found, resource exhaustion etc.
StringBuffer str = new
StringBuffer();
System.out.println( str.capacity() )
;
Exception
Output : 16
ensureCapacity()
This method is used to ensure minimum
capacity of StringBuffer object.
StringBuffer str = new
StringBuffer("hello");
str.ensureCapacity(10);
Exception Handling
Exception Handling is the
mechanism to handle
runtime malfunctions. We
need to handle such
exceptions to prevent
abrupt termination of
program. The term
A Java Exception is
an object that
describes the
exception that occurs
in a program. When an
exceptional events occurs in java, an
exception is said to be thrown. The code
that's responsible for doing something about
the exception is called an exception
handler.
Exception class Hierarchy
All exception types are subclasses of class
Throwable, which is at the top of exception
class hierarchy.
Unchecked exceptions are the class
that extends RuntimeException.
Unchecked exception are ignored at
compile time. Example :
ArithmeticException,
NullPointerException, Array Index
out of Bounds exception. Unchecked
exceptions are checked at runtime.
Error
Errors are typically ignored in code
because you can rarely do anything
about an error. Example : if stack
overflow occurs, an error will arise.
This type of error is not possible
handle in code.
Exception class is for exceptional
conditions that program should
catch. This class is extended to
create user specific exception
classes.
RuntimeException is a subclass of
Exception. Exceptions under this
class are automatically defined for
programs.
Exception are categorized into 3 category.
When we don't handle the excetions, they
lead to unexpected program termination.
Lets take an example for better
understanding.
class UncaughtException
{
public static void main(String
args[])
{
int a = 0;
int b = 7/a;
// Divide by
zero, will lead to exception
}
}
Checked Exception
The exception that can be predicted
by the programmer.Example : File
that need to be opened is not found.
These type of exceptions must be
checked at compile time.
Uncaught Exceptions
Unchecked Exception
This will lead to an exception at runtime,
hence the Java run-time system will
construct an exception and then throw it. As
we don't have any mechanism for handling
exception in the above program, hence the
default handler will handle the exception
and will print the details of the exception on
the terminal.
statement involves
declaring the type of
exception you are
trying to catch. If an
Exception Handling Mechanism
In java, exception handling is done using
five keywords,
1. try
2. catch
3. throw
4. throws
5. finally
Exception handling is done by transferring
the execution of a program to an appropriate
exception handler when exception occurs.
Using try and catch
Try is used to guard a block
of code in which exception
may occur. This block of
code is called guarded
region. A catch
exception occurs in guarded code, the catch
block that follows the try is checked, if the
type of exception that occured is listed in the
catch block then the exception is handed
over to the catch block which then handles
it.
Example using Try and catch
class Excp
{
public static void main(String
args[])
{
int a,b,c;
try
{
a=0;
b=10;
c=b/a;
System.out.println("This line
will not be executed");
}
catch(ArithmeticException e)
{
System.out.println("Divided by
zero");
}
System.out.println("After
exception is handled");
}
}
output:
Divided by zero
After exception is handled
An exception will thrown by this program as
we are trying to divide a number by zero
inside try block. The program control is
transfered outside try block. Thus the line
"This line will not be executed" is never
parsed by the compiler. The exception
thrown is handle in catch block. Once the
exception is handled the program controls
continue with the next line in the program.
Thus the line "After exception is handled" is
printed.
Multiple catch blocks:
A try block can be followed by multiple
catch blocks. You can have any number of
catch blocks after a single try block.If an
exception occurs in the guarded code the
exception is passed to the first catch block in
the list. If the exception type of exception,
matches with the first catch block it gets
caught, if not the exception is passed down
to the next catch block. This continue until
the exception is caught or falls through all
catches.
Example for Multiple Catch blocks
class Excep
{
public static void main(String[]
args)
{
try
{
int arr[]={1,2};
arr[2]=3/0;
}
catch(ArithmeticException ae)
{
System.out.println("divide by
zero");
}
catch(ArrayIndexOutOfBoundsException
e)
{
System.out.println("array index
out of bound exception");
}
}
}
Output:
divide by zero
Example for Unreachable Catch block
While using multiple catch statements, it is
important to remember that exception sub
classes inside catch must come before any
of their super classes otherwise it will lead
to compile time error.
class Excep
{
public static void main(String[]
args)
{
try
{
int arr[]={1,2};
arr[2]=3/0;
}
catch(Exception e)
//This block
handles all Exception
{
System.out.println("Generic
exception");
}
catch(ArrayIndexOutOfBoundsException
e)
//This block is unreachable
{
System.out.println("array index
out of bound exception");
}
}
}
Nested try statement
try statement can be nested inside another
block of try. Nested try block is used when
a part of a block may cause one error while
entire block may cause another error. In case
if inner try block does not have a catch
handler for a particular exception then the
outer try is checked for match.
class Excep
{
public static void main(String[]
args)
{
try
{
int arr[]={5,0,1,2};
try
{
int x=arr[3]/arr[1];
}
catch(ArithmeticException ae)
{
System.out.println("divide by
zero");
}
arr[4]=3;
}
catch(ArrayIndexOutOfBoundsException
e)
{
System.out.println("array index
out of bound exception");
}
}
}
Important points to Remember
1. If you do not explicitly use the try
catch blocks in your program, java
will provide a default exception
handler, which will print the
exception details on the terminal,
whenever exception occurs.
2. Super class Throwable overrides
toString() function, to display error
message in form of string.
3. While using multiple catch block,
always make sure that exception
subclasses comes before any of their
super classes. Else you will get
compile time error.
4. In nested try catch, the inner try
block, uses its own catch block as
well as catch block of the outer try, if
required.
5. Only the object of Throwable class
or its subclasses can be thrown.
Try with Resource Statement
JDK 7 introduces a new version of try
statement known as try-with-resources
statement. This feature add another way to
exception handling with resources
management,it is also referred to as
automatic resource management.
Syntax
try(resource-specification)
{
//use the resource
}catch()
{...}
This try statement contains a paranthesis in
which one or more resources is declare. Any
object that implements
java.lang.AutoCloseable or
java.io.Closeable, can be passed as a
parameter to try statement. A resource is an
object that is used in program and must be
closed after the program is finished. The
try-with-resources statement ensures that
each resource is closed at the end of the
statement, you do not have to explicitly
close the resources.
Example without using try with Resource
Statement
import java.io.*;
class Test
{
public static void main(String[]
args)
{
try{
String str;
//opening file in read mode using
BufferedReader stream
BufferedReader br=new
BufferedReader(new
FileReader("d:\\myfile.txt"));
while((str=br.readLine())!=null)
{
System.out.println(str);
}
br.close();
//closing
BufferedReader stream
}catch(IOException ie)
{ System.out.println("exception");
}
}
}
Example using try with Resource
Statement
Program execution stops on encountering
throw statement, and the closest catch
statement is checked for matching type of
exception.
Syntax :
throw
ThrowableInstanc
e
Creating Instance of Throwable class
import java.io.*;
class Test
{
public static void main(String[]
args)
{
try(BufferedReader br=new
BufferedReader(new
FileReader("d:\\myfile.txt")))
{
String str;
while((str=br.readLine())!=null)
{
System.out.println(str);
}
}catch(IOException ie)
{ System.out.println("exception");
}
}
}
There are two possible ways to get an
instance of class Throwable,
NOTE: In the above example, we do not
need to explicitly call close() method to
close BufferedReader stream.
class Test
{
static void avg()
{
try
{
throw new
ArithmeticException("demo");
}
catch(ArithmeticException e)
{
System.out.println("Exception
caught");
}
}
throw Keyword
throw keyword is used
to throw an exception
explicitly. Only object of Throwable
class or its sub classes can be thrown.
1. Using a parameter in catch block.
2. Creating instance with new operator.
3. new
NullPointerException("test");
This constructs an instance of
NullPointerException with name
test.
Example demonstrating throw Keyword
public static void main(String
args[])
{
avg();
}
}
In the above example the avg() method
throw an instance of ArithmeticException,
which is successfully handled using the
catch statement.
public static void main(String
args[])
{
try
{
check();
}
catch(ArithmeticException e)
{
System.out.println("caught" + e);
}
}
}
throws Keyword
Any method capable of causing exceptions
must list all the exceptions possible during
its execution, so that anyone calling that
method gets a prior knowledge about which
exceptions to handle. A method can do so by
using the throws keyword.
Syntax :
type method_name(parameter_list)
throws exception_list
{
//definition of method
}
NOTE : It is necessary for all exceptions,
except the exceptions of type Error and
RuntimeException, or any of their
subclass.
Example demonstrating throws Keyword
class Test
{
static void check() throws
ArithmeticException
{
System.out.println("Inside check
function");
throw new
ArithmeticException("demo");
}
finally clause
A finally keyword is used to create a block
of code that follows a try block. A finally
block of code always executes whether or
not exception has occurred. Using a finally
block, lets you run any cleanup type
statements that you want to execute, no
matter what happens in the protected code.
A finally block appears at the end of catch
block.
finally is always executed.
Exception in thread main java. Lang.
exception array Index out of bound
exception.
You can see in above example even if
exception is thrown by the program, which
is not handled by catch block, still finally
block will get executed.
User defined Exception subclass
You can also create your own exception sub
class simply by extending java Exception
class. You can define a constructor for your
Exception sub class (not compulsory) and
you can override the toString() function to
display your customized message on catch.
Points to Remember
1. Extend the Exception class to create
your own ecxeption class.
Example demonstrating finally Clause
Class ExceptionTest
{
public static void main(String[]
args)
{
int a[]= new int[2];
System.out.println("out of try");
try
{
System.out.println("Access
invalid element"+ a[3]);
/* the above statement will throw
ArrayIndexOutOfBoundException */
}
finally
{
System.out.println("finally is
always executed.");
}
}
}
Output:
Out of try
2. You don't have to implement
anything inside it, no methods are
required.
3. You can have a Constructor if you
want.
4. You can override the toString()
function, to display customized
message.
Method Overriding with Exception
Handling
There are few things to remember when
overriding a method with exception
handling. If super class method does not
declare any exception, then sub class
overriden method cannot declare checked
exception but it can declare unchecked
exceptions.
Example of Subclass overriden Method
declaring Checked Exception
import java.io.*;
class Super
{
void show()
{ System.out.println("parent
class"); }
}
public class Sub extends Super
{
void show() throws IOException
//Compile time error
{ System.out.println("parent
class"); }
public static void main( String[]
args )
{
Super s=new Sub();
s.show();
}
}
As the method show() doesn't throws any
exception while in Super class, hence its
overriden version can also not throw any
checked exception.
void show() throws
ArrayIndexOutOfBoundsException
//Correct
{ System.out.println("child
class"); }
public static void main(String[]
args)
{
Super s=new Sub();
s.show();
}
}
Output : child class
Because ArrayIndexOutOfBoundsException
is an unchecked exception hence, overrided
show() method can throw it.
More about Overriden Methods and
Exceptions
If Super class method throws an exception,
then Subclass overriden method can throw
the same exception or no exception, but
must not throw parent exception of the
exception thrown by Super class method.
It means, if Super class method throws
object of NullPointerException class, then
Subclass method can either throw same
exception, or can throw no exception, but it
can never throw object of Exception class
(parent of NullPointerException class).
Example of Subclass overriden Method
declaring Unchecked Exception
import java.io.*;
class Super
{
void show()
{ System.out.println("parent
class"); }
}
public class Sub extends Super
{
Example of Subclass overriden method
with same Exception
import java.io.*;
class Super
{
void show() throws Exception
{ System.out.println("parent
class"); }
}
public class Sub extends Super {
void show() throws Exception
//Correct
{ System.out.println("child
class"); }
public static void main(String[]
args)
{
try {
Super s=new Sub();
s.show();
}
catch(Exception e){}
}
}
Output : child class
Example of Subclass overriden method
with no Exception
import java.io.*;
class Super
{
void show() throws Exception
{ System.out.println("parent
class"); }
}
public class Sub extends Super {
void show()
//Correct
{ System.out.println("child
class"); }
public static void main(String[]
args)
{
try {
Super s=new Sub();
s.show();
}
catch(Exception e){}
}
}
Output : child class
Example of Subclass overriden method
with parent Exception
import java.io.*;
class Super
{
void show() throws
ArithmeticException
{ System.out.println("parent
class"); }
}
public class Sub extends Super {
void show() throws Exception
//Cmpile time Error
{ System.out.println("child
class"); }
public static void main(String[]
args)
{
try {
Super s=new Sub();
s.show();
}
catch(Exception e){}
}
}
" Google's Andriod Operating System is
developed on Java platform. "
Chained Exception
Chained Exception was added to Java in
JDK 1.4. This feature allow you to relate
one exception with another exception, i.e
one exception describes cause of another
exception. For example, consider a situation
in which a method throws an
ArithmeticException because of an attempt
to divide by zero but the actual cause of
exception was an I/O error which caused the
divisor to be zero. The method will throw
only ArithmeticException to the caller. So
the caller would not come to know about the
actual cause of exception. Chained
Exception is used in such type of situations.
Two new constructors and two methods
were added to Throwable class to support
chained exception.
1. Throwable( Throwable cause )
2. Throwable( String str, Throwable
cause )
In the first form, the paramter cause
specifies the actual cause of exception. In
the second form, it allows us to add an
exception description in string form with the
actual cause of exception.
getCause() and initCause() are the two
methods added to Throwable class.
getCause() method returns the actual
cause associated with current
exception.
initCause() set an underlying
cause(exception) with invoking
exception.
Example
import java.io.IOException;
public class ChainedException
{
public static void divide(int a,
int b)
{
if(b==0)
{
ArithmeticException ae = new
ArithmeticException("top layer");
ae.initCause( new
IOException("cause") );
throw ae;
}
else
{
System.out.println(a/b);
}
}
public static void main(String[]
args)
{
try {
divide(5, 0);
}
catch(ArithmeticException ae) {
System.out.println( "caught : "
+ae);
System.out.println("actual cause:
"+ae.getCause());
}
}
}
output
caught:java.lang.ArithmeticException
: top layer
actual cause: java.io.IOException:
cause
Introduction to Multithreading
A program can be divided
into a number of small
processes. Each small
process can be addressed
as a single thread (a
lightweight process).
Multithreaded programs
contain two or more
threads that can run
concurrently. This means
that a single program can
perform two or more tasks
simultaneously. For example, one
thread is writing content on a file at the
same time another thread is performing
spelling check.
In Java, the word thread means two
different things.
An instance of Thread class.
or, A thread of execution.
An instance of Thread class is just an
object, like any other object in java. But a
thread of execution means an individual
"lightweight" process that has its own call
stack. In java each thread has its own call
stack.
main thread must be always the last
thread to finish execution.
class MainThread
{
public static void main(String[]
args)
{
Thread t=Thread.currentThread();
t.setName("MainThread");
System.out.println("Name of thread
is "+t);
}
}
Output : Name of thread is
Thread[MainThread,5,main]
Life cycle of a Thread
The main thread
Even if you don't create any thread in your
program, a thread called main thread is still
created. Although the main thread is
automatically created, you can control it by
obtaining a reference to it by calling
currentThread() method.
Two important things to know about main
thread are,
It is the thread from which other
threads will be produced.
1. New : A thread begins its life cycle
in the new state. It remains in this
state until the start() method is called
on it.
2. Runable : After invocation of start()
method on new thread, the thread
becomes runable.
3. Running : A method is in running
thread if the thread scheduler has
selected it.
4. Waiting : A thread is waiting for
another thread to perform a task. In
this stage the thread is still alive.
5. Terminated : A thread enter the
terminated state when it complete its
task.
Thread Class
Thread class is the main class on which
Java's Multithreading system is based.
Thread class, along with its companion
interface Runnable will be used to create
and run threads for utilizing Multithreading
feature of Java.
Constructors of Thread class
1. Thread ( )
2. Thread ( String str )
Thread Priorities
Every thread has a priority that helps the
operating system determine the order in
which threads are scheduled for execution.
In java thread priority ranges between,
MIN-PRIORITY (a
constant of 1)
MAX-PRIORITY (a
constant of 10)
By default every thread is
given a NORMPRIORITY(5). The main thread
always have NORM-PRIORITY.
3. Thread ( Runnable r )
4. Thread ( Runnable r, String str)
You can create new thread, either by
extending Thread class or by implementing
Runnable interface. Thread class also
defines many methods for managing threads.
Some of them are,
Method
Description
setName() to give thread a name
getName() return thread's name
getPriority() return thread's priority
checks if thread is still running
isAlive()
or not
join()
Wait for a thread to end
run()
Entry point for a thread
suspend thread for a specified
sleep()
time
start a thread by calling run()
start()
method
Some Important points to Remember
1. When we extend Thread class, we
cannot override setName() and
getName() functions, because they
are declared final in Thread class.
2. While using sleep(), always handle
the exception it throws.
static void sleep(long
milliseconds) throws
InterruptedException
Creating a thread
Java defines two ways by which a thread can
be created.
By implementing the Runnable
interface.
By extending the Thread class.
Implementing the Runnable Interface
The easiest way to create a thread is to
create a class that implements the runnable
interface. After implementing runnable
interface , the class needs to implement the
run() method, which is of form,
public void run()
run() method introduces a concurrent
thread into your program. This
thread will end when run() returns.
You must specify the code for your
thread inside run() method.
run () method can call other
methods, can use other classes and
declare variables just like any other
normal method.
class MyThread implements Runnable
{
public void run()
{
System.out.println("concurrent
thread started running..");
}
}
class MyThreadDemo
{
public static void main( String
args[] )
{
MyThread mt = new MyThread();
Thread t = new Thread(mt);
t.start();
}
}
Output : concurrent thread started
running..
To call the run() method, start() method is
used. On calling start(), a new stack is
provided to the thread and run() method is
called to introduce the new thread into the
program.
Extending Thread class
This is another way to create a thread by a
new class that extends Thread class and
create an instance of that class. The
extending class must override run() method
which is the entry point of new thread.
class MyThread extends Thread
{
public void run()
{
System.out.println("Concurrent
thread started running..");
}
}
classMyThreadDemo
{
public static void main( String
args[] )
{
MyThread mt = new MyThread();
mt.start();
}
}
Output : concurrent thread started
running..
In this case also, as we must override the
run() and then use the start() method to
start and run the thread. Also, when you
create MyThread class object, Thread class
constructor will also be invoked, as it is the
super class, hence MyThread class object
acts as Thread class object.
Can we Start a thread twice ?
What if we call run() method directly
without using start() method ?
In above program if we directly call run()
method, without using start() method,
public static void main( String
args[] )
{
MyThread mt = new MyThread();
mt.run();
}
Doing so, the thread won't be allocated a
new call stack, and it will start running in
the current call stack, that is the call stack of
the main thread. Hence Multithreading
won't be there.
No, a thread cannot be started twice. If you
try to do so, IllegalThreadStateException
will be thrown.
public static void main( String
args[] )
{
MyThread mt = new MyThread();
mt.start();
mt.start();
//Exception thrown
}
When a thread is in running state, and you
try to start it again, or any method try to
invoke that thread again using start()
method, exception is thrown.
Joining threads
Sometimes one thread
needs to know when
another thread is ending.
In java, isAlive() and
join() are two different
methods to check whether
a thread has finished its
execution.
The isAlive() methods return true if the
thread upon which it is called is still running
otherwise it return false.
final boolean
isAlive()
But, join() method is used more commonly
than isAlive(). This method waits until the
thread on which it is called terminates.
final void join()
throws
InterruptedException
Using join() method, we tell our thread to
wait until the specifid thread completes its
execution. There are overloaded versions of
join() method, which allows us to specify
time for which you want to wait for the
specified thread to terminate.
final void join(long milliseconds)
throws InterruptedException
Example of isAlive method
public class MyThread extends Thread
{
public void run()
{
System.out.println("r1 ");
try{
Thread.sleep(500);
}catch(InterruptedException ie)
{}
System.out.println("r2 ");
}
public static void main(String[]
args)
{
MyThread t1=new MyThread();
MyThread t2=new MyThread();
t1.start();
t2.start();
System.out.println(t1.isAlive());
System.out.println(t2.isAlive());
}
}
Output
r1
true
true
r1
r2
r2
Example of thread without join()
method
public class MyThread extends Thread
{
public void run()
{
System.out.println("r1 ");
try{
Thread.sleep(500);
}catch(InterruptedException ie)
{}
System.out.println("r2 ");
}
public static void main(String[]
args)
{
MyThread t1=new MyThread();
MyThread t2=new MyThread();
t1.start();
t2.start();
}
}
Output
r1
r1
r2
r2
In this above program two thread t1 and t2
are created. t1 starts first and after printing
"r1" on console thread t1 goes to sleep for
500 mls.At the same time Thread t2 will
start its process and print "r1" on console
and then goes into sleep for 500 mls. Thread
t1 will wake up from sleep and print "r2" on
console similarly thread t2 will wake up
from sleep and print "r2" on console. So you
will get output like r1 r1 r2 r2
In this above program join() method on
thread t1 ensure that t1 finishes it process
before thread t2 starts.
Example of thread with join() method
m1.join(1500);
public class MyThread extends Thread
{
public void run()
{
System.out.println("r1 ");
try{
Thread.sleep(500);
}catch(InterruptedException ie)
{}
System.out.println("r2 ");
}
public static void main(String[]
args)
{
MyThread t1=new MyThread();
MyThread t2=new MyThread();
t1.start();
try{
t1.join();
//Waiting for
t1 to finish
}catch(InterruptedException ie){}
t2.start();
}
}
Output
r1
r2
r1
r2
Specifying time with join()
If in the above program, we specify time
while using join() with m1, then m1 will
execute for that time, and then m2 and m3
will join it.
Doing so, initially m1 will execute for 1.5
seconds, after which m2 and m3 will join it.
Synchronization
At times when more than one
thread try to access a shared
resource, we need to ensure
that resource will be used by
only one thread at a time. The
process by which this is
achieved is called
synchronization. The
synchronization keyword in java creates a
block of code referred to as critical section.
Every Java object with a critical section of
code gets a lock associated with the object.
To enter critical section a thread need to
obtain the corresponding object's lock.
General Syntax :
synchronized
(object)
{
//statement to be
synchronized
}
public void display(String msg)
{
System.out.print ("["+msg);
try
{
Thread.sleep(1000);
}
catch(InterruptedException e)
{
e.printStackTrace();
}
System.out.println ("]");
}
Why we use Syncronization ?
If we do not use syncronization, and let two
or more threads access a shared resource at
the same time, it will lead to distorted
results.
Consider an example, Suppose we have two
different threads T1 and T2, T1 starts
execution and save certain values in a file
temporary.txt which will be used to calculate
some result when T1 returns. Meanwhile, T2
starts and before T1 returns, T2 change the
values saved by T1 in the file temporary.txt
(temporary.txt is the shared resource). Now
obviously T1 will return wrong result.
To prevent such problems, synchronization
was introduced. With synchronization in
above case, once T1 starts using
temporary.txt file, this file will be
locked(LOCK mode), and no other thread
will be able to access or modify it until T1
returns.
Using Synchronized Methods
Using Synchronized methods is a way to
accomplish synchronization. But lets first
see what happens when we do not use
synchronization in our program.
Example with no Synchronization
class First
{
class Second extends Thread
{
String msg;
First fobj;
Second (First fp,String str)
{
fobj = fp;
msg = str;
start();
}
public void run()
{
fobj.display(msg);
}
}
public class Syncro
{
public static void main (String[]
args)
{
First fnew = new First();
Second ss = new second(fnew,
"welcome");
Second ss1= new second
(fnew,"new");
Second ss2 = new second(fnew,
"programmer");
}
}
Output :
[welcome [ new [ programmer]
]
]
In the above program, object fnew of class
First is shared by all the three running
threads(ss, ss1 and ss2) to call the shared
method(void display). Hence the result is
unsynchronized and such situation is called
Race condition.
Synchronized Keyword
To synchronize above program, we must
serialize access to the shared display()
method, making it available to only one
thread at a time. This is done by using
keyword synchronized with display()
method.
synchronized void display (String
msg)
Using Synchronised block
If you have to synchronize access to object
of a class that has no synchronized methods,
and you cannot modify the code. You can
use synchronized block to use it.
class First
{
public void display(String msg)
{
System.out.print ("["+msg);
try
{
Thread.sleep(1000);
}
catch(InterruptedException e)
{
e.printStackTrace();
}
System.out.println ("]");
}
}
class Second extends Thread
{
String msg;
First fobj;
Second (First fp,String str)
{
fobj = fp;
msg = str;
start();
}
public void run()
{
synchronized(fobj)
//Synchronized block
{
fobj.display(msg);
}
}
}
public class Syncro
{
public static void main (String[]
args)
{
First fnew = new First();
Second ss = new second(fnew,
"welcome");
Second ss1= new second
(fnew,"new");
Second ss2 = new second(fnew,
"programmer");
}
}
Output :
[welcome]
[new]
[programmer]
Because of synchronized block this program
gives the expected output.
Interthread Communication
Java provide benefit of avoiding thread
pooling using interthread communication.
The wait(), notify(), notifyAll() of Object
class. These method are implemented as
final in Object. All three method can be
called only from within a synchronized
context.
wait() tells calling thread to give up
monitor and go to sleep until some
other thread enters the same monitor
and call notify.
notify() wakes up a thread that called
wait() on same object.
notifyAll() wakes up all the thread
that called wait() on same object.
Difference between wait() and sleep()
wait()
called from
synchronised block
sleep()
no such requirement
monitor is not
released
awake when notify() not awake when
or notifyAll() method notify() or notifyAll()
is called.
method is called
not a static method static method
sleep() method is
wait() is generaly
simply used to put
used on condition
your thread on sleep.
monitor is released
Thread Pooling
Pooling is usually implemented by loop i.e
to check some condition repeatedly. Once
condition is true appropriate action is taken.
This waste CPU time.
Deadlock is a situation of complete Lock,
when no thread can complete its execution
because lack of resources. In the above
picture, Thread 1 is holding a resource R1,
and need another resource R2 to finish
execution, but R2 is locked by Thread 2,
which needs R3, which in turn is locked by
Thread 3. Hence none of them can finish
and are stuck in a deadlock.
Example of deadlock
Deadlock
class Pen{}
class Paper{}
public class Write {
public static void main(String[]
args)
{
final Pen pn =new Pen();
final Paper pr =new Paper();
Thread t1 = new Thread(){
public void run()
{
synchronized(pn)
{
System.out.println("Thread1 is
holding Pen");
try{
Thread.sleep(1000);
}
catch(InterruptedException e){}
synchronized(pr)
{ System.out.println("Requesting
for Paper"); }
}
}
};
Thread t2 = new Thread(){
public void run()
{
synchronized(pr)
{
System.out.println("Thread2 is
holding Paper");
try{
Thread.sleep(1000);
}
catch(InterruptedException e){}
synchronized(pn)
{ System.out.println("requesting
for Pen"); }
}
};
t1.start();
t2.start();
Enumerations was added to Java language in
Enumeration means
a list of named constant.
In Java, enumeration
defines a class type. An
Enumeration can have
constructors, methods
and instance variables. It
is created using enum
keyword. Each enumeration constant
JDK5.
is public, static and final by default. Even
though enumeration defines a class type and
have constructors, you do not instantiate an
enum using new. Enumeration variables are
used and declared in much a same way as
you do a primitive variable.
How to Define and Use an Enumeration
1. An enumeration can be defined
simply by creating a list of enum
variable. Let us take an example for
list of Subject variable, with different
subjects in the list.
enum Subject
//Enumeration defined
{
Java, Cpp, C, Dbms
}
Output
Thread1 is holding Pen
Thread2 is holding Paper
Enumerations
2. Identifiers Java, Cpp, C and Dbms
are called enumeration constants.
These are public, static final by
default.
3. Variables of Enumeration can be
defined directly without any new
keyword.
Subject sub
4. Variables of Enumeration type can
have only enumeration constants as
value.
sub = Subject.Java;
Example of Enumeration
enum WeekDays
{ sun, mon, tues, wed, thurs, fri,
sat }
class Test
{
public static void main(String
args[])
{
WeekDays wk;
wk = WeekDays.sun;
System.out.println("Today is
"+wk);
}
}
Output : Today is sun
Values( ) and ValueOf( ) method
All the enumerations have values() and
valueOf() methods in them. values()
method returns an array of enum-type
containing all the enumeration constants in
it. Its general form is,
public static enum-type[ ] values()
method is used to return the
enumeration constant whose value is equal
to the string passed in as argument while
calling this method. It's general form is,
valueOf()
public static enum-type valueOf
(String str)
Points to remember about Enumerations
1. Enumerations are of class type, and
have all the capabilities that a Java
class has.
2. Enumerations can have Constructors,
instance Variables, methods and can
even implement Interfaces.
3. Enumerations are not instantiated
using new keyword.
4. All Enumerations by default inherit
java.lang.Enum class.
Enumeration with Constructor, instance
variable and Method
enum Student
{
John(11), Bella(10), Sam(13),
Viraaj(9);
private int age;
//age of students
int getage { return age; }
}
class EnumDemo
{
public static void main( String
args[] )
{
Student S;
System.out.println("Age of Viraaj
is " +Student.Viraaj.getage()+
"years");
}
}
Output : Age of Viraaj is 9 years
In this example as soon as we declare an
enum variable(Student S), the constructor is
called once, and it initializes age for every
enumeration constant with values specified
with them in parenthesis.
type wrapper
Java uses primitive types such as int, double
or float to hold the basic data types for the
sake of performance. Despite the
performance benefits offered by the
primitive types, there are situation when you
will need an object representation. For
example, many data structures in Java
operate on objects, so you cannot use
primitive types with those data structures. To
handle these situations Java provides type
Wrappers which provide classes that
encapsulate a primitive type within an
object.
Character : It encapsulates
primitive type char within object.
Character (char ch)
Boolean : It encapsulates primitive
type boolean within object.
Boolean (boolean boolValue)
Numeric type wrappers : It is the
most commonly used type wrapper.
Autoboxing and
Unboxing
Autoboxing and Unboxing features
was added in Java5.
Autoboxing is a
process by which
primitive type is
automatically
encapsulated(boxed
) into its equivalent
type wrapper
Auto-Unboxing is
a process by which
the value of object
is automatically
extracted from a
type wrapper.
Byte Short Integer Long Float Double
Example of Autoboxing and Unboxing
Above mentioned Classes comes
under Numeric type wrapper. These
classes encapsulate byte, short, int,
long, float, double primitive type.
class Test
{
public static void main(String[]
args)
{
Integer iob = 100;
//Autoboxing of int
int i = iob;
//unboxing
of Integer
System.out.println(i+" "+iob);
Character cob = 'a';
/Autoboxing of char
char ch = cob;
//Autounboxing of Character
System.out.println(cob+" "+ch);
}
}
Output :
100 100
a a
Autoboxing / Unboxing in Expressions
Whenever we use object of Wrapper class in
an expression, automatic unboxing and
boxing is done by JVM.
Integer iOb;
iOb = 100;
int
++iOb;
//Autoboxing of
When we perform increment operation on
Integer object, it is first unboxed, then
incremented and then again reboxed into
Integer type object.
This will happen always, when we will use
Wrapper class objects in expressions or
conditions etc.
Benefits of Autoboxing / Unboxing
1. Autoboxing / Unboxing lets us use
primitive types and Wrapper class
objects interchangeably.
2. We don't have to
perform Explicit
typecasting.
3.
It helps prevent
errors, but may lead
to unexpected results
sometimes. Hence
must be used with
care.
IO Stream
A
Stream is linked to a
physical layer by java
I/O system to make
input and output
operation in java. In
general, a stream means
continuous flow of data.
Java performs I/O through Streams.
Streams are clean way to deal with
input/output without having every part of
your code understand the physical.
Java encapsulates Stream under java.io
package. Java defines two types of streams.
They are,
1. Byte Stream : It provides a
convenient means for handling input
and output of byte.
2. Character Stream : It provides a
convenient means for handling input
and output of characters. Character
stream uses Unicode and therefore
can be internationalized.
Byte Stream Classes
Byte stream is defined by using two abstract
class at the top of hierarchy, they are
InputStream and OutputStream.
OutputStream
PrintStream
input.
Abstract class that
describe stream
output.
Output Stream that
contain print()
and println()
method
These classes define several key methods.
Two most important are
1. read() : reads byte of data.
2. write() : Writes byte of data.
These two abstract classes have several
concrete classes that handle various devices
such as disk files, network connection etc.
Character Stream Classes
Character stream is also defined by using
two abstract class at the top of hierarchy,
they are Reader and Writer.
Some important Byte stream classes.
Stream class
Description
Used for Buffered
BufferedInputStream
Input Stream.
Used for Buffered
BufferedOutputStream
Output Stream.
Contains method
DataInputStream
for reading java
standard datatype
An output stream
that contain
DataOutputStream
method for writing
java standard data
type
Input stream that
FileInputStream
reads from a file
Output stream that
FileOutputStream
write to a file.
InputStream
Abstract class that
describe stream
These two abstract classes have several
concrete classes that handle unicode
character.
Some important Charcter stream classes.
Stream class
Description
Handles buffered
input stream.
Handles buffered
BufferedWriter
output stream.
Input stream that
FileReader
reads from file.
Output stream that
FileWriter
writes to file.
Input stream that
InputStreamReader translate byte to
character
Output stream that
OutputStreamReader translate character to
byte.
Output Stream that
contain print() and
PrintWriter
println() method.
Abstract class that
Reader
define character
stream input
Abstract class that
Writer
define character
stream output
Reading Characters
Reading Console Input
To read string we have to use readLine()
function with BufferedReader class's object.
We use the object of BufferedReader class to
take inputs from the keyboard.
String readLine() throws IOException
BufferedReader
method is used with BufferedReader
object to read characters. As this function
returns integer type value has we need to use
typecasting to convert it into char type.
read()
int read() throws IOException
Below is a simple example explaining
character input.
class CharRead
{
public static void main( String
args[])
{
BufferedReader br = new
Bufferedreader(new
InputstreamReader(System.in));
char c = (char)br.read();
//Reading character
}
}
Reading Strings
Program to take String input from
Keyboard in Java
import java.io.*;
class MyInput
{
public static void main(String[]
args)
{
String text;
InputStreamReader isr = new
InputStreamReader(System.in);
BufferedReader br = new
BufferedReader(isr);
text = br.readLine();
//Reading String
System.out.println(text);
{ e.printStackTrace(); }
}
}
Program to read from a file using
BufferedReader class
import java. Io *;
class ReadTest
{
public static void main(String[]
args)
{
try
{
File fl = new
File("d:/myfile.txt");
BufferedReader br = new
BufferedReader(new FileReader(fl)) ;
String str;
while ((str=br.readLine())!=null)
{
System.out.println(str);
}
br.close();
fl.close();
}
catch (IOException e)
{ e.printStackTrace(); }
}
}
Program to write to a File using
FileWriter class
import java. Io *;
class WriteTest
{
public static void main(String[]
args)
{
try
{
File fl = new
File("d:/myfile.txt");
String str="Write this string to
my file";
FileWriter fw = new
FileWriter(fl) ;
fw.write(str);
fw.close();
fl.close();
}
catch (IOException e)
Serialization and
Deserialization in
Java
Serialization is a
process of converting an
object into a sequence of
bytes which can be
persisted to a disk or
database or can be sent
through streams. The
reverse process of
creating object from
sequence of bytes is
called
deserialization.
A class must implement Serializable
interface present in java.io package in order
to serialize its object successfully.
Serializable is a marker interface that adds
serializable behaviour to the class
implementing it.
Java provides Serializable API encapsulated
under java.io package for serializing and
deserializing objects which include,
java.io.serializable
java.io.Externalizable
ObjectInputStream
writeObject() method of
ObjectOutputStream class
and ObjectOutputStream etc.
serializes an object and send it to the output
stream.
Marker interface
Marker Interface is a special interface in
Java without any field and method. Marker
interface is used to inform compiler that the
class implementing it has some special
behaviour or meaning. Some example of
Marker interface are,
java.io.Serializable
java.lang.Cloneable
java.rmi.Remote
java.util.RandomAccess
class references object out of stream and
deserialize it.
All these interfaces does not have any
method and field. They only add special
behavior to the classes implementing them.
However marker interfaces have been
deprecated since Java 5, they were replaced
by Annotations. Annotations are used in
place of Marker Interface that play the exact
same role as marker interfaces did before.
Signature
of
writeObject()
readObject()
public final
void
writeObject(ob
ject x) throws
IOException
readObject() method
of ObjectInputStream
and
public final
Object
readObject()
throws
IOException,Cla
ssNotFoundExcep
tion
while serializing if you do not want any field
to be part of object state then declare it
either static or transient based on your need
and it will not be included during java
serialization process.
{ e. printStackTrace(); }
}
}
Object of Studentinfo class is serialized
using writeObject() method and written to
student.ser file.
Deserialization of Object
Serializing an Object
import java.io.*;
class studentinfo implements
Serializable
{
String name;
int rid;
static String contact;
studentinfo(string n, int r, string
c)
{
this.name = n;
this.rid = r;
this.contact = c;
}
}
class Test
{
public static void main(String[]
args)
{
try
{
Studentinfo si = new
studentinfo("Abhi", 104, "110044");
FileOutputStream fos = new
FileOutputStream("student.ser");
Objectoutputstream oos = new
ObjectOutputStream(fos);
oos.writeObject(si);
oos.close();
fos.close();
}
catch (Exception e)
import java.io * ;
class DeserializationTest
{
public static void main(String[]
args)
{
studentinfo si=null ;
try
{
FileInputStream fis = new
FileInputStream("student.ser");
ObjectOutputStream ois = new
ObjectOutputStream(fis);
si =
(studentinfo)ois.readObject();
}
catch (Exception e)
{ e.printStackTrace(); }
System.out.println(si.name);
System.out. println(si.rid);
System.out.println(si.contact);
}
}
Output :
Abhi
104
null
Contact field is null because,it was marked
as static and as we have discussed earlier
static fields does not get serialized.
NOTE : Static members are never serialized
because they are connected to class not
object of class.
transient Keyword
While serializing an object, if we don't want
certain data member of the object to be
serialized we can mention it transient.
transient keyword will prevent that data
member from being serialized.
class studentinfo implements
Serializable
{
String name;
transient int rid;
static String contact;
}
Making a data member transient
will prevent its serialization.
In this example rid will not be
serialized because it is transient, and
contact will also remain
unserialized because it is static.
Some Important Interfaces
INTERFACES
CookiePolicy
CookieStore
FileNameMap
SocketOption
InetAddress
ServerSocket
SocketImplFactory
ProtocolFamily
InetAddress
Inet Address encapsulates both numerical IP
address and the domain name for that
address. Inet address can handle both IPv4
and Ipv6 addresses. Inet Address class has
no visible constructor. To create an inet
Address object, you have to use Factory
methods.
Three commonly used Inet Address factory
methods are.
Networking in Java
Java is a premier language for network
programming. java.net package encapsulate
large number of classes and interface that
provides an easy-to use means to access
network resources. Here are some important
classes and interfaces of java.net package.
Some Important Classes
CLASSES
CacheRequest
CookieHandler
CookieManager
Datagrampacket
Inet Address
ServerSocket
Socket
DatagramSocket
Proxy
URL
URLConnection
1. static InetAddress getLocalHost()
throws UnknownHostException
2. static InetAddress getByName
(String hostname) throws
UnknownHostException
3. static InetAddress[ ] getAllByName
(String hostname) throws
UnknownHostException
Socket is foundation of modern networking,
a socket allows single computer to serve
many different clients at once. Socket
establishes connection through the use of
port, which is a numbered socket on a
particular machine. Socket communication
takes place via a protocol. Socket provides
communication mechanism between two
computers using TCP. There are two kind of
TCP sockets in Java. One is for server and
other is for client.
ServerSocket is for servers.
Socket class is for client.
Example using InetAddress class
import java.net.*;
class Test
{
public static void main(String[]
args)
{
InetAddress address =
InetAddress.getLocalHost();
System.out.println(address);
address =
InetAddress.getByName("www.studytoni
ght.com");
System.out.println(address);
InetAddress sw[] =
InetAddress.getAllByName("www.google
.com");
for(int i=0; i< sw.length; i++)
{
System.out.println(sw[i]);
}
}
}
Output:
Welcome-PC/59.161.87.227
www.studytonight.com/208.91.198.55
www.google.com/74.125.236.115
www.google.com/74.125.236.116
www.google.com/74.125.236.112
www.google.com/74.125.236.113
www.google.com/74.125.236.114
www.google.com/2404:6800:4009:802:0:
0:0:1014
Socket and ServerSocket Class
URL class
Java URL Class present in java.net package,
deals with URL (Uniform Resource Locator)
which uniquely identify or locate resources
on internet.
Important Methods of URL class
getProtocol() : Returns protocol of
URL
getHost() : Returns
hostname(domain name) of URL
getPort() : Returns port number of
URL
getFile() : Returns filename of URL
Program using URL class
import java.net.*;
class Test
{
public static void main(String[]
arg) throws MalFormedURLException
{
URL hp = New
URL("http://www.studytonight.com/ind
ex");
system.out.println(hp.getProtocol[])
;
System.out.println(hp.getFile[]);
}
}
Ouput:
http
-1
www.studytonight.com
/index
Generics
A class or interface that
operates on
parameterized type is
called Generic. Generics was
first introduced in Java5. Now it is one of
the most profound feature of java
programming language. It provides facility
to write algorithm independent of any
Generics
also provide type
safety.
Using Generics, it becomes
possible to create a single class
or method that automatically
works with all types of
data(Integer, String, Float etc).
It expanded the ability to reuse
code safely and easily.
Example of Generic class
class Gen
{
T ob;
//an object of type T is
declared
Gen(T o) //constructor
{
ob = o;
}
public T getOb()
{
return ob;
}
}
class Test
{
public static void main (String[]
args)
{
Gen < Integer> iob = new Gen(100);
//instance of Integer type Gen
Class.
int x = iob.getOb();
System.out.print in(x);
Gen < String> sob = new
Gen("Hello"); //instance of String
type Gen Class.
String str = sob.getOb();
}
}
Output :
100
Hello
specific type of data.
Generics Work Only with Objects
You cannot use primitive datatype such as
int or char etc with Generics type. It should
always be an object.
Gen< int> iOb = new Gen< int>(07);
//Error, can't use primitive type
}
Output :
java lang.Integer = 88
Java lang.String = this is string
Generic Constructors
Generics Types of different Type
Arguments are never same
It is possible to create a generic constructor
even if the class is not generic.
Reference of one generic type is never
compatible with other generic type unless
their type argument is same. In the example
above we created two objects of class Gen,
one of type Integer, and other of type
String, hence,
Example of Generic Constructor
iob = sob;
//Absolutely Wrong
Generic Methods
You can also create generic methods that can
be called with different types of arguments
based on the type of arguments passed to
generic method, the compiler handles each
method.
Example of Generic method
class GenTest
{
static < V, T> void display (V v, T
t)
{
System.out.println(v.getClass().getN
ame()+" = " +v);
System.out.println(t.getClass().getN
ame()+" = " +t);
}
public static void main(String[]
args)
{
display(88,"This is string");
}
class Gen
{
private double val;
< T extends Number> Gen(T ob)
{
val=ob.doubleValue();
}
void show()
{
System.out.println(val);
}
}
class Test
{
public static void main(String[]
args)
{
Gen g = new Gen(100);
Gen g1 = new Gen(121.5f);
g.show();
g1.show();
}
}
Output :
100.0
121.5
Generic Interface
Like classes and methods, you can also
create generic interfaces.
interface MyInterface< T >
{ .. }
Generic Bounded type Parameter
You can also set restriction on the type that
will be allowed to pass to a type-parameter.
This is done with the help of extends
keyword when specifying the type
parameter.
< T extends Number >
Here we have taken Number class, it can be
any wrapper class name. This specifies that
T can be only be replaced by Number class
data itself or any of its subclass.
Collection Framework
Collection framework was not part of
original Java release. Collections was added
to J2SE 1.2. Prior to Java 2, Java provided
adhoc classes such as Dictionary, Vector,
Stack and Properties to store and manipulate
Collection
framework provides
many important
classes and interfaces
to collect and
organize group of
alike objects.
groups of objects.
Generic Method with bounded type
Parameters.
class Gen
{
static < T, V extends number> void
display(T t, V v)
{
System.out.println(v.getClass().getN
ame()+" = " +v);
System.out.println(t.getClass().getN
ame()+" = " +t);
}
public static void main(String[]
args)
{
// display(88,"This is string");
display ("this is string",99);
}
}
Output :
java.lang.String = This is string
java.lang.Double = 99.O
Type V is bounded to Number type
and its subclass only.
If display(88,"This is string")
is uncommented, it will give an error
of type incompatibility, as String is
not a subclass of Number class.
Important Interfaces of Collection API
Interface
Description
Enables you to work with groups
Collection of object; it is at the top of
collection hierarchy
Extends queue to handle double
Deque
ended queue.
Extends collection to handle
List
sequences list of object.
Extends collection to handle
special kind of list in which
Queue
element are removed only from
the head.
Extends collection to handle
Set
sets, which must contain unique
element.
SortedSet Extends sets to handle sorted set.
We have studied that Autoboxing converts
primitive types into Wrapper class Objects.
As collections doesn't store primitive data
types(stores only refrences), hence
Autoboxing facilitates the storing of
primitive data types in collection by boxing
it into its wrapper type.
Most Commonly thrown Exceptions in
Collection Framework
Exception Name
All these Interfaces give several methods
which are defined by collections classes
which implement these interfaces.
Why Collections were made Generic ?
Generics added type safety to Collection
framework. Earlier collections stored
Object class references. Which means any
collection could store any type of object.
Hence there were chances of storing
incompatible types in a collection, which
could result in run time mismatch. Hence
Generics was introduced, now you can
explicitly state the type of object being
stored.
Description
occurs if a
UnSupportedOperationExcepti Collection
on
cannot be
modified
occurs when
one object is
ClassCastException
incompatibl
e with
another
occurs when
you try to
NullPointerException
store null
object in
Collection
thrown if an
invalid
IllegalArgumentException
argument is
used
thrown if
you try to
add an
IllegalStateException
element to
an already
full
Collection
Interfaces of Collection Framework
Collections and Autoboxing
The collection framework has a lot of
Interfaces, setting the fundamental nature of
various collection classes. Lets study the
most important Interfaces in the collection
framework.
Methods
isEmpty()
The Collection Interface
1. It is at the top of collection heirarchy
and must be implemented by any
class that defines a collection. Its
general declaration is,
interface Collection < E >
2. Following are some of the
commonly used methods in this
interface.
Methods
add( E obj )
addAll( Collection C )
remove( Object obj )
removeAll( Collection C )
contains( Object obj )
Description
Used to add
objects to a
collection.
Doesn't add
duplicate
elements to
the collection.
Add all
elements of
collection C to
the invoking
collection
To remove an
object from
collection
Removes all
element of
collection C
from the
invoking
collection
To determine
whether an
object is
present in
collection or
not
size()
Description
Returns true if
collection is
empty, else
returns false
returns
number of
elements
present in
collection
The List Interface
1. It extends the Collection Interface,
and defines storage as sequence of
elements. Following is its general
declaration,
interface List < E >
2. Allows random access and insertion,
based on position.
3. It allows Duplicate elements.
4. Apart from methods of Collection
Interface, it adds following methods
of its own.
Methods
get( int index )
set( int index, E obj)
indexOf( Object obj )
Description
Returns object
stored at the
specified
index
Stores object
at the
specified
index in the
calling
collection
Returns index
of first
occurence of
obj in the
collection
Methods
lastIndexOf( Object obj )
subList( int start, int end )
Description
Returns index
of last
occurence of
obj in the
collection
Returns a list
containing
elements
between start
and end index
in the
collection
The Set Interface
1. This interface defines a Set. It
extends Collection interface and
doesn't allow insertion of duplicate
elements. It's general declaration is,
interface Set < E >
2. It doesn't define any method of its
own. It has two sub interfaces,
SortedSet and NavigableSet.
3. SortedSet interface extends Set
interface and arranges added
elements in an ascending order.
4. NavigabeSet interface extends
SortedSet interface, and allows
retrieval of elements based on the
closest match to a given value or
values.
interface Queue < E >
2. There are couple of new and
interestin methods added by this
interface. Some of them are
mentioned in below table.
Methods
Description
removes element at the head of
poll()
the queue and returns null if
queue is empty
removes element at the head of
the queue and throws
remove()
NoSuchElementException if
queue is empty
returns the element at the head
of the queue without removing
peek()
it. Returns null if queue is
empty
same as peek(), but throws
element() NoSuchElementException if
queue is empty
offer( E obj
Adds object to queue.
)
The Dequeue Interface
1. It extends Queue interface and
declares behaviour of a double-ended
queue. Its general declaration is,
interface Dequeue < E >
2. Double ended queues can function as
simple queues as well as like
standard Stacks.
The Collection classes
The Queue Interface
1. It extends collection interface and
defines behaviour of queue, that is
first-in, first-out. It's general
declaration is,
Java provides a set of Collection classes that
implements Collection interface. Some of
these classes provide full implementations
that can be used as it is and other abstract
classes provides skeletal implementations
that can be used as starting points for
creating concrete collections.
Output : [ab,bc,cd]
Getting Array from an ArrayList
ArrayList class
1. ArrayList class extends
AbstractList class and implements
the List interface.
2. ArrayList supports dynamic array
that can grow as needed. ArrayList
has three constructors.
method is used to get an araay
containing all the contents of the list.
Following are the reasons why you must
obtain array from your ArrayList whenever
required.
toArray()
To obtain faster processing.
To pass array to methods who do not
accept Collectionn as arguments.
To integrate and use collections with
legacy code.
ArrayList()
ArrayList( Collection C )
ArrayList( int capacity )
3. ArrayLists are created with an initial
size, when this size is exceeded, it
gets enlarged automatically.
4. It can coontain Duplicate elements
and maintains the insertion order.
5. ArrayLists are not synchronized.
Example of ArrayList
import java.util.*
class Test
{
public static void main(String[]
args)
{
ArrayList< String> al = new
ArrayList< String>();
al.add("ab");
al.add("bc");
al.add("cd");
system.out.println(al);
}
}
Storing User-Defined classes
In the above example we are storing only
string object in ArrayList collection. But
You can store any type of object, including
object of class that you create in Collection
classes.
Example of storing User-Defined object
Contact class
class Contact
{
String first_name;
String last_name;
String phone_no;
public Contact(String fn,String
ln,String pn)
{
first_name = fn;
last_name = ln;
phone_no = pn;
}
public String toString()
{
return first_name+"
"+last_name+"("+phone_no+")";
}
}
2. It can be used as List, stack or Queue
as it implements all the related
interfaces.
3. It can contain duplicate elements and
is not synchronized.
Storing Contact class
public class PhoneBook
{
public static void main(String[]
args)
{
Contact c1 = new
Contact("Ricky",
"Pointing","999100091");
Contact c2 = new
Contact("David",
"Beckham","998392819");
Contact c3 = new
Contact("Virat",
"Kohli","998131319");
ArrayList< Contact> al = new
ArrayList< Contact>();
al.add(c1);
al.add(c2);
al.add(c3);
System.out.println(al);
}
}
Example of LinkedList class
import java.util.* ;
class Test
{
public static void main(String[]
args)
{
LinkedList< String> ll = new
LinkedList< String>();
ll.add("a");
ll.add("b");
ll.add("c");
ll.addLast("z");
ll.addFirst("A");
System.out.println(ll);
}
}
Output : [A, a, b,c, z]
HashSet class
Output
[Ricky Pointing(999100091), David
Beckham(998392819), Virat
Kohli(998131319)]
LinkedList class
1. LinkedList class extends
AbstractSequentialList and
implements List,Deque and Queue
inteface.
1. HashSet extends AbstractSet class
and implements the Set interface.
2. It creates a collection that uses hash
table for storage.
3. HashSet does not maintain any order
of elements.
Example of HashSet class
import java.util.*;
class HashSetDemo
{
public static void main(String
args[])
{
HashSet< String> hs = new HashSet<
String>();
hs.add("B");
hs.add("A");
hs.add("D");
hs.add("E");
hs.add("C");
hs.add("F");
System.out.println(hs);
}
}
Output: [D, E, F, A, B, C]
LinkedHashSet Class
1. LinkedHashSet class extends
HashSet class
2. LinkedHashSet maintains a linked
list of entries in the set.
3. LinkedHashSet stores elements in
the order in which elements are
inserted.
Output : [B, A, D, E, C, F]
TreeSet Class
1. It extends AbstractSet class and
implements the NavigableSet
interface.
2. It stores elements sorted ascending
order.
3. Uses a Tree structure to store
elements.
4. Access and retrieval times are quite
fast.
5. It has four Constructors.
TreeSet()
TreeSet( Collection C )
TreeSet( Comparator comp )
TreeSet( SortedSet ss )
Accessing a Collection
Example of LinkedHashSet class
import java.util.*;
class LinkedHashSetDemo
{
public static void main(String
args[])
{
LinkedHashSet< String> hs = new
LinkedHashSet< String>();
hs.add("B");
hs.add("A");
hs.add("D");
hs.add("E");
hs.add("C");
hs.add("F");
System.out.println(hs);
}
}
To access, modify or remove any element
from any collection we need to first find the
element, for which we have to cycle
throught the elements of the collection.
There are three possible ways to cycle
through the elements of any collection.
1.Using Iterator
interface
2.Using ListIterator
interface
3.Using for-each loop
Accessing elements using Iterator
Iterator Interface is used to traverse a list in
forward direction, enabling you to remove
or modify the elements of the collection.
Each collection classes provide iterator()
method to return an iterator.
import java.util.*;
class Test_Iterator
{
public static void main(String[]
args)
{
ArrayList< String> ar = new
ArrayList< String>();
ar.add("ab");
ar.add("bc");
ar.add("cd");
ar.add("de");
Iterator it = ar.iterator();
//Declaring Iterator
while(it.hasNext())
{
System.out.print(it.next()+" ");
}
}
}
Output : ab bc cd de
Accessing element using ListIterator
ListIterator Interface is
used to traverse a list in
both forward and
backward direction. It is
available to only those collections that
implement the List Interface.
import java.util.*;
class Test_Iterator
public static void main(String[]
args)
{
ArrayList< String> ar = new
ArrayList< String>();
ar.add("ab");
ar.add("bc");
ar.add("cd");
ar.add("de");
ListIterator litr =
ar.listIterator();
while(litr.hasNext())
//In forward direction
{
System.out.print(litr.next()+"
");
}
while(litr.hasPrevious())
//In backward direction
{
System.out.print(litr.next()+"
");
}
}
}
Output :
ab bc cd de
de cd bc ab
Using for-each loop
version of for loop can also be
used for traversing each element of a
collection. But this can only be used if we
don't want to modify the contents of a
collection and we don't want any reverse
access. for-each loop can cycle through
any collection of object that implements
Iterable interface.
for-each
import java.util.*;
class ForEachDemo
{
public static void main(String[]
args)
{
LinkedList< String> ls = new
LinkedList< String>();
ls.add("a");
ls.add("b");
ls.add("c");
ls.add("d");
in an
ascending
order.
for(String str : ls)
{
System.out.print(str+" ");
}
}
Output : a b c d
Map Interface
A Map stores data in key and value
association. Both key and values are objects.
The key must be unique but the values can
be duplicate. Although Maps are a part of
Collection Framework, they can not actually
be called as collections because of some
properties that they posses. However we can
obtain a collection-view of maps.
Interface
Map
Map.Entry
NavigableMap
SortedMap
Description
Maps unique
key to value.
Describe an
element in
key and
value pair in
a map. This
is an inner
class of map.
Extends
SortedMap
to handle the
retrienal of
entries based
on closest
match
searches
Extends Map
so that key
are
maintained
Commonly used Methods defined by Map
boolean containsKey(Object k):
returns true if map contain k as key.
Otherwise false.
Object get(Object k) : returns values
associated with the key k.
Object put(Object k, Object v) :
stores an entry in map.
Object putAll(Map m) : put all
entries from m in this map.
Set keySet() : returns Set that
contains the key in a map.
Set entrySet() : returns Set that
contains the entries in a map.
HashMap class
1. HashMap class extends
AbstractMap and implements Map
interface.
a 100
d 400
b 200
TreeMap class
2. It uses a hashtable to store the map.
This allows the execution time of
get() and put() to remain same.
1. TreeMap class extends
AbstractMap and implements
NavigableMap interface.
3. HashMap has four constructor.
2. It creates Map, stored in a tree
structure.
HashMap()
HashMap(Map< ? extends k, ?
extends V> m)
HashMap(int capacity)
HashMap(int capacity, float
fillratio)
4. HashMap does not maintain order of
its element.
Example
import java.util.*;
class HashMapDemo
{
public static void main(String
args[])
{
HashMap< String,Integer> hm = new
HashMap< String,Integer>();
hm.put("a",new Integer(100));
hm.put("b",new Integer(200));
hm.put("c",new Integer(300));
hm.put("d",new Integer(400));
Set< Map.Entry< String,Integer> >
st = hm.entrySet();
//returns Set
view
for(Map.Entry< String,Integer>
me:st)
{
System.out.print(me.getKey()
+":");
System.out.println(me.getValue());
}
}
}
Output:
c 300
3. A TreeMap provides an efficient
means of storing key/value pair in
efficient order.
4. It provides key/value pairs in sorted
order and allows rapid retrieval.
Example
import java.util.*;
class TreeMapDemo
{
public static void main(String
args[])
{
TreeMap< String,Integer> tm = new
TreeMap< String,Integer>();
tm.put("a",new Integer(100));
tm.put("b",new Integer(200));
tm.put("c",new Integer(300));
tm.put("d",new Integer(400));
Set< Map.Entry< String,Integer> >
st = tm.entrySet();
for(Map.Entry me:st)
{
System.out.print(me.getKey()
+":");
System.out.println(me.getValue());
}
}
}
Output:
a 100
b 200
c 300
d 400
Comparator Interface
LinkedHashMap class
1. LinkedHashMap extends
HashMap class.
2. It maintains a linked list of entries in
map in order in which they are
inserted.
3. LinkedHashMap defines the
following constructor
LinkedHashMap()
LinkedHashMap(Map< ? extends
k, ? extends V> m)
LinkedHashMap(int capacity)
LinkedHashMap(int capacity,
float fillratio)
LinkedHashMap(int capacity,
float fillratio, boolean
order)
4. It adds one new method
removeEldestEntry(). This
method is called by put() and
putAll() By default this method
does nothing. However we can
override this method to remove
oldest element in the map. Syntax
In Java, Comparator
interface is used to order
the object in your own
way. It gives you ability to
decide how element are
stored within sorted
collection and map.
Comparator Interface
defines compare()
method. This method
compare two object and
return 0 if two object are
equal. It returns a positive
value if object1 is greater
than object2. Otherwise a
negative value is return. The
method can throw a ClassCastException if
the type of object are not compatible for
comparison.
protected boolean
removeEldestEntry(Map.Entry e)
Example
EnumMap class
Student class
1. EnumMap extends AbstractMap
and implements Map interface.
2. It is used for key as enum
class Student
int roll;
String name;
Student(int r,String n)
{
roll = r;
name = n;
}
public String toString()
{
return roll+" "+name;
}
MyComparator class
This class defines the comparison logic for
Student class based on their roll. Student
object will be sotred in ascending order of
their roll.
class MyComparator implements
Comparator
{
public int compare(Student
s1,Student s2)
{
if(s1.roll == s2.roll)
return 0;
else if(s1.roll > s2.roll)
return 1;
else return -1;
}
}
public class Test
{
public static void main(String[]
args)
{
TreeSet< Student> ts = new
TreeSet< Student>(new
MyComparator());
ts.add(new Student(45,
"Rahul"));
ts.add(new Student(11,
"Adam"));
ts.add(new Student(19,
"Alex"));
System.out.println(ts);
}
}
Output
[ 11 Adam, 19 Alex, 45 Rahul ]
As you can see in the ouput Student object
are stored in ascending order of their roll.
Legacy Classes
Early version of java did not include the
Collection framework. It only defined
several classes and interface that provide
method for storing objects. When Collection
framework were added in J2SE 1.2, the
original classes were reengineered to
support the collection interface. These
classes are also known as Legacy classes.
All legacy claases and interface were
redesign by JDK 5 to support Generics.
The following are the legacy classes defined
by java.util package
1. Dictionary
2. HashTable
3. Properties
4. Stack
5. Vector
There is only one legacy interface called
Enumeration
NOTE: All the legacy classes are
syncronized
Enumeration interface
1. Enumeration interface defines
method to enumerate through
collection of object.
2. This interface is suspended by
Iterator interface.
3. However some legacy classes such
as Vector and Properties defines
several method in which
Enumeration interface is used.
4. It specifies the following two
methods
boolean hasMoreElements()
Object nextElement()
Vector class
1. Vector is similar to ArrayList which
represents a dynamic array.
2. The only difference between Vector
and ArrayList is that Vector is
synchronised while Array is not.
the Vector
Example of Vector
import java.util.*;
public class Test
{
public static void main(String[]
args)
{
Vector ve = new Vector();
ve.add(10);
ve.add(20);
ve.add(30);
ve.add(40);
ve.add(50);
ve.add(60);
Enumeration en =
ve.elements();
while(en.hasMoreElements())
{
3. Vector class has following four
constructor
Vector()
Vector(int size)
Vector(int size, int incr)
Vector(Collection< ? extends
E> c)
Vector defines several legacy method. Lets
see some important legacy method define by
Vector class.
Method
Description
add element to the
addElement()
Vector
return the element at
elementAt()
specified index
return an enumeration
elements
of element in vector
return first element in
firstElement()
the Vector
return last element in
lastElement()
the Vector
removeAllElement() remove all element of
System.out.println(en.nextElement())
;
}
}
}
Output
10
20
30
40
50
60
Hashtable class
1. Like HashMap, Hashtable also stores
key/value pair in hashtable. However
neither keys nor values can be null.
2. There is one more difference
between HashMap and Hashtable
that is Hashtable is synchronized
while HashMap is not.
3. Hashtable has following four
constructor
Hashtable()
Hashtable(int size)
Hashtable(int size, float
fillratio)
Hashtable(Map< ? extends K, ?
extends V> m)
Example of Hashtable
import java.util.*;
class HashTableDemo
{
public static void main(String
args[])
{
Hashtable< String,Integer> ht =
new Hashtable< String,Integer>();
ht.put("a",new Integer(100));
ht.put("b",new Integer(200));
ht.put("c",new Integer(300));
ht.put("d",new Integer(400));
Set st = ht.entrySet();
Iterator itr=st.iterator();
while(itr.hasNext())
{
Map.Entry
m=(Map.Entry)itr.next();
System.out.println(itr.getKey()+"
"+itr.getValue());
}
}
}
Output:
a 100
b 200
c 300
d 400
Difference between HashMap and
Hashtable
Hashtable
Hashtable class is
synchronized.
Because of Threadsafe, Hashtable is
HashMap
HastMap is not
synchronize.
HashMap works
faster.
slower than HashMap
Neither key nor
Both key and values
values can be null
can be null
does not guarantee
Order of table remain that order of map
constant over time. remain constant over
time.
Properties class
1. Properties class extends Hashtable
class.
2. It is used to maintain list of value in
which both key and value are String
3. Properties class define two
constructor
Properties()
Properties(Properties default)
4. One advantage of Properties over
Hashtable is that we can specify a
default property that will be useful
when no value is associated with a
certain key.
Example of Properties class
import java.util.*;
public class Test
{
public static void main(String[]
args)
{
Properties pr = new
Properties();
pr.put("Java", "James
Ghosling");
pr.put("C++", "Bjarne
Stroustrup");
pr.put("C", "Dennis Ritchie");
pr.put("C#", "Microsoft Inc.");
Set< ?> creator = pr.keySet();
for(Object ob: creator)
{
System.out.println(ob+" was
created by "+
pr.getProperty((String)ob) );
}
public void paint(Graphics g)
{
g.drawString("A simple Applet",
20, 20);
}
}
}
}
Output
Java was created by James Ghosling
C++ was created by Bjarne Stroustrup
C was created by Dennis Ritchie
C# was created by Microsoft Inc
Applet in Java
Applets are small Java applications
that can be accessed on an Internet
server, transported over Internet, and
can be automatically installed and
run as apart of a web document. Any
applet in Java is a class that extends
the java.applet.Applet class.
An Applet class does not have any
main() method.
It is viewed using JVM. The JVM
can use either a plug-in of the Web
browser or a separate runtime
environment to run an applet
application.
JVM creates an instance of the applet
class and invokes init() method to
initialize an Applet.
A Simple Applet
import java.awt.*;
import java.applet.*;
public class Simple extends Applet
Every Applet application must declare a
paint() method. This method is defined by
AWT class and must be overridden by the
applet. paint() method is called each time
an applet neede to redisplay its output.
Another important thing to notice about
applet application is that, execution of an
applet does not begin at main() method. In
fact an applet application does not have any
main() method.
Advantages of Applets
1. Very less response time as it works
on the client side.
2. Can be run using any browser, which
has JVM running in it.
Applet class
{
public void destroy()
{
//perform shutdown activity
}
public void paint (Graphics g)
{
//display the content of window
}
Applet class provides all necessary support
for applet execution, such as initializing and
destroying of applet. It also provide methods
that load and display images and methods
that load and play audio clips.
An Applet Skeleton
Most applets override these four methods.
These four methods forms Applet lifecycle.
init() : init() is the first method to be
called. This is where variable are
initialized. This method is called
only once during the runtime of
applet.
start() : start() method is called after
init(). This method is called to restart
an applet after it has been stopped.
stop() : stop() method is called to
suspend thread that does not need to
run when applet is not visible.
destroy() : destroy() method is
called when your applet needs to be
removed completely from memory.
Example of an Applet
import java.applet.*;
import java.awt.*;
public class MyApplet extends Applet
{
int height, width;
public void init()
{
height = getSize().height;
width = getSize().width;
setName("MyApplet");
}
public void paint(Graphics g)
{
g.drawRoundRect(10, 30, 120, 120,
2, 3);
}
}
Example of an Applet Skeleton
import java.awt.*;
import java.applet.*;
public class AppletTest extends
Applet
{
public void init()
{
//initialization
}
public void start ()
{
//start or resume execution
}
public void stop()
{
//suspend execution
How to run an Applet Program
An Applet program is compiled in the same
way as you have been compiling your
console programs. However there are two
ways to run an applet.
Executing the Applet within Javacompatible web browser.
Using an Applet viewer, such as the
standard tool, applet viewer. An
applet viewer executes your applet in
a window
For executing an Applet in an web browser,
create short HTML file in the same
directory. Inside body tag of the file, include
the following code. (applet tag loads the
Applet class)
< applet code = "MyApplet" width=400
height=400 >
< /applet >
Run the HTML file
Running Applet using Applet Viewer
To execute an Applet with an applet viewer,
write short HTML file as discussed above. If
name it as run.htm, then the following
command will run your applet program.
f:/>appletviewer run.htm
How Events are handled ?
A source generates an Event and send it to
one or more listeners registered with the
source. Once event is received by the
listener, they processe the event and then
return. Events are supported by a number of
Java packages, like java.util, java.awt and
java.awt.event.
Important Event Classe and Interface
Event
Classe
Event Handling
Any program that uses GUI (graphical user
interface) such as Java application written
for windows, is event driven. Event
describes the change of state of any object.
Example : Pressing a button, Entering a
character in Textbox.
ActionEven
t
MouseEven
t
Components of Event Handling
Event handling has three main components,
KeyEvent
Events : An event is a change of
state of an object.
Events Source : Event source is an
object that generates an event.
ItemEvent
Listeners : A listener is an object
that listens to the event. A listener
gets notified when an event occurs.
TextEvent
Description
Listener
Interface
generated
when button
is pressed,
menu-item is ActionListener
selected, listitem is double
clicked
generated
when mouse
is dragged,
moved,clicke
d,pressed or MouseListener
released also
when the
enters or exit
a component
generated
when input is
KeyListener
received from
keyboard
generated
when checkbox or list
ItemListener
item is
clicked
generated
TextListener
when value of
textarea or
textfield is
changed
generated
MouseWhe when mouse MouseWheelLi
elEvent
wheel is
stener
moved
generated
when window
is activated,
WindowEve deactivated, WindowListene
nt
deiconified, r
iconified,
opened or
closed
generated
when
component is
Component
ComponentEve
hidden,
Event
ntListener
moved,
resized or set
visible
generated
when
ContainerE component is ContainerListen
vent
added or
er
removed from
container
generated
Adjustment when scroll AdjustmentList
Event
bar is
ener
manipulated
generated
when
component
FocusEvent
FocusListener
gains or loses
keyboard
focus
public class Test extends Applet
implements KeyListener
{
String msg="";
public void init()
{
addKeyListener(this);
}
public void keyPressed(KeyEvent k)
{
showStatus("KeyPressed");
}
public void keyReleased(KeyEvent k)
{
showStatus("KeyRealesed");
}
public void keyTyped(KeyEvent k)
{
msg = msg+k.getKeyChar();
repaint();
}
public void paint(Graphics g)
{
g.drawString(msg, 20, 40);
}
}
HTML code :
< applet code="Test" width=300,
height=100 >
Example of Event Handling
import
import
import
import
import
import
java.awt.*;
java.awt.event.*;
java.applet.*;
java.applet.*;
java.awt.event.*;
java.awt.*;
AWT
AWT contains large number of classes and
methods that allows you to create and
manage windows GUI application. AWT is
the foundation upon which Swing is made.
It is used for GUI programming in Java. But
now a days it is merely used because most
GUI java programs are implemented using
Swing because of its rich implementation of
GUI controls and light-weighted nature.
AWT Hierarchy
Container is a component in AWT that
contains another component like button, text
field, tables etc. Container is a subclass of
component class. Conatiner class keeps
track of components that are added to
another component.
Panel
Panel class is concrete sub class of
Container. Panel does not contain title bar,
menu bar or border.
Window class
Window class creates a top level window.
Window does not have borders and
menubar.
Frame
Component class
Component class is at the top of AWT
hierarchy. Component is an abstract class
that encapsulates all attribute of visual
component. A component object is
responsible for remembering the current
foreground and background colours and the
currently selected text font.
Container
Frame is a sub class of Window and have
resizing canvas. It is a container that contain
several different components like button,
title bar, textfield, label etc. In Java, most of
the AWT applications are created using
Frame window. Frame class has two
different constructors,
Frame() throws HeadlessException
Frame(String title) throws
HeadlessException
Creating a Frame
There are two ways to create a Frame. They
are,
1.By Instantiating
Frame class
2.By extending
Frame class
Creating Frame Window by Instantiating
Frame class
import java.awt.*;
public class Testawt
{
Testawt()
{
Frame fm=new Frame();
//Creating a frame.
Label lb = new Label("welcome to
java graphics");
//Creating a
label
fm.add(lb);
//adding label to the frame.
fm.setSize(300, 300);
//setting frame size.
fm.setVisible(true);
//set frame visibilty true.
}
public static void main(String
args[])
{
Testawt ta = new Testawt();
}
}
Creating Frame window by extending
Frame class
package testawt;
import java.awt.*;
import java.awt.event.*;
public class Testawt extends Frame
{
public Testawt()
{
Button btn=new Button("Hello
World");
add(btn);
//adding a
new Button.
setSize(400, 500);
//setting size.
setTitle("StudyTonight");
//setting title.
setLayout(new FlowLayout());
//set default layout for frame.
setVisible(true);
frame visibilty true.
//set
}
public static void main (String[]
args)
{
Testawt ta = new Testawt();
//creating a frame.
}
}
1. Platform Independent
2. Customizable
3. Extensible
4. Configurable
5. Lightweight
Swing and JFC
JFC is an abbreviation for Java Foundation
classes, which encompass a group of
features for building Graphical User
Interfaces(GUI) and adding rich graphical
functionalities and interactivity to Java
applications.
Features of JFC
Swing
Swing Framework contains a set of classes
that provides more powerful and flexible
GUI components than those of AWT. Swing
provides the look and feel of modern Java
GUI. Swing library is an official Java GUI
tool kit released by Sun Microsystems. It is
used to create graphical user interface with
Java.
Main Features of Swing Toolkit
Swing GUI components.
Look and Feel support.
Java 2D.
Introduction to Swing Classes
JButton : JButton class provides the
functioning of push button. JButton allows
an icon, string or both associated with a
button.
JTextField : JTextFields allow editing of a
single line of text.
Creating a JFrame
There are two way to create a JFrame
Window.
1. By instantiating JFrame class.
2. By extending JFrame class.
Creating JFrame window by Instantiating
JFrame class
JPanel : JPanel is Swing's version of AWT
class Panel and uses the same default layout,
FlowLayout. JPanel is descended directly
from JComponent.
JFrame : JFrame is Swing's version of
Frame and is descended directly from
Frame class. The component which is
added to the Frame, is refered as its
Content.
JWindow : This is Swing's version of
Window and hass descended directly from
Window class. Like Window it uses
BorderLayout by default.
JLabel : JLabel descended from
Jcomponent, and is used to create text
labels.
import javax.swing.*;
import java.awt.*;
public class First
{
JFrame jf;
public First() {
jf = new JFrame("MyWindow");
//Creating a JFrame with name
MyWindow.
JButton btn = new JButton("Say
Hello");
//Creating a Button.
jf.add(btn);
//adding button to frame.
jf.setLayout(new FlowLayout());
//setting layout using FlowLayout
object.
jf.setDefaultCloseOperation(JFrame.E
XIT_ON_CLOSE); //setting close
operation.
jf.setSize(400, 400);
//setting size
jf.setVisible(true);
//setting frame visibilty
}
public static void main(String[]
args)
new First();
setSize(400, 400);
//setting size
setVisible(true);
//setting frame visibilty
}
public static void main(String[]
args)
{
new Second();
}
}
Creating JFrame window by extending
JFrame class
import javax.swing.*;
import java.awt.event.*;
import java.awt.*;
public class Second extends JFrame
{
public Second()
{
setTitle("MyWindow");
JLabel lb = new JLabel("Welcome to
My Second Window");
//Creating a
label.
add(lb);
//adding label to frame.
setLayout(new FlowLayout());
//setting layout using
FlowLayout object.
setDefaultCloseOperation(JFrame.EXIT
_ON_CLOSE);
//setting
close operation.
Swing Component
Swing Framework contains a large set of
components which provide rich
functionalities and allow high level of
customization. All these components are
lightweight components. They all are
derived from JComponent class. It supports
the pluggable look and feel.
JButton
JButton class provides functionality of a
button. JButton class has three constuctors,
JButton(Icon ic)
JButton(String str)
JButton(String str, Icon ic)
It allows a button to be created using icon, a
string or both. JButton supports
ActionEvent. When a button is pressed an
ActionEvent is generated.
Example using JButton
import
import
import
public
JFrame
{
javax.swing.*;
java.awt.event.*;
java.awt.*;
class testswing extends
testswing()
{
JButton bt1 = new JButton("Yes");
//Creating a Yes Button.
JButton bt2 = new JButton("No");
//Creating a No Button.
setDefaultCloseOperation(JFrame.EXIT
_ON_CLOSE)
//setting close
operation.
setLayout(new FlowLayout());
//setting layout using FlowLayout
object
setSize(400, 400);
//setting size of Jframe
add(bt1);
//adding Yes
button to frame.
add(bt2);
//adding No
button to frame.
setVisible(true);
}
public static void main(String[]
args)
{
new testswing();
}
}
JTextField
JTextField is used for taking input of single
line of text. It is most widely used text
component. It has three constructors,
JTextField(int cols)
JTextField(String str, int cols)
JTextField(String str)
cols represent the number of columns in text
field.
Example using JTextField
import javax.swing.*;
import java.awt.event.*;
import java.awt.*;
public class MyTextField extends
JFrame
{
public MyTextField()
{
JTextField jtf = new
JTextField(20); //creating
JTextField.
add(jtf);
//adding JTextField to frame.
setLayout(new FlowLayout());
setDefaultCloseOperation(JFrame.EXIT
_ON_CLOSE);
setSize(400, 400);
setVisible(true);
}
public static void main(String[]
args)
{
new MyTextField();
}
}
Example using JCheckBox
import javax.swing.*;
import java.awt.event.*;
import java.awt.*;
public class Test extends JFrame
{
public Test()
{
JCheckBox jcb = new
JCheckBox("yes");
//creating
JCheckBox.
add(jcb);
//adding JCheckBox to frame.
jcb = new JCheckBox("no");
//creating JCheckBox.
add(jcb);
//adding JCheckBox to frame.
jcb = new JCheckBox("maybe");
//creating JCheckBox.
add(jcb);
//adding JCheckBox to frame.
setLayout(new FlowLayout());
setDefaultCloseOperation(JFrame.EXIT
_ON_CLOSE);
setSize(400, 400);
setVisible(true);
}
public static void main(String[]
args)
{
new Test();
}
}
JCheckBox
JCheckBox class is used to create
checkboxes in frame. Following is
constructor for JCheckBox,
JCheckBox(String str)
JRadioButton
Radio button is a group of related button in
which only one can be selected.
JRadioButton class is used to create a radio
button in Frames. Following is the
constructor for JRadioButton,
JRadioButton(String str)
Example using JRadioButton
import javax.swing.*;
import java.awt.event.*;
import java.awt.*;
public class Test extends JFrame
{
public Test()
{
JRadioButton jcb = new
JRadioButton("A");
//creating
JRadioButton.
add(jcb);
//adding JRadioButton to frame.
jcb = new JRadioButton("B");
//creating JRadioButton.
add(jcb);
//adding JRadioButton to frame.
jcb = new JRadioButton("C");
//creating JRadioButton.
add(jcb);
//adding JRadioButton to frame.
jcb = new JRadioButton("none");
add(jcb);
setLayout(new FlowLayout());
setDefaultCloseOperation(JFrame.EXIT
_ON_CLOSE);
setSize(400, 400);
setVisible(true);
}
public static void main(String[]
args)
{
new Test();
}
}
JComboBox
Combo box is a combination of text fields
and drop-down list.JComboBox component
is used to create a combo box in Swing.
Following is the constructor for
JComboBox,
JComboBox(String arr[])
Example using JComboBox
import javax.swing.*;
import java.awt.event.*;
import java.awt.*;
public class Test extends JFrame
{
String name[] =
{"Abhi","Adam","Alex","Ashkay"}; //
list of name.
public Test()
{
JComboBox jc = new
JComboBox(name);
//initialzing
combo box with list of name.
add(jc);
//adding JComboBox to frame.
setLayout(new FlowLayout());
setDefaultCloseOperation(JFrame.EXIT
_ON_CLOSE);
setSize(400, 400);
setVisible(true);
}
public static void main(String[]
args)
new Test();
and manipulate arrays
gives information about
Constructor
constructor of a class
Field
provide information about field
provide information about
Method
method
provide information about class
Modifier
and member access modifier
Proxy
supports dynamic proxy classes
Apart from these classes java.lang.Class
is another very important class used in
Reflection API.
Uses of Reflection
Reflection API
Developing IDE
Reflection means ability of a software to
analyze itself. In Java, Reflection API
provides facility to analyze and change
runtime behaviour of a Class, at runtime.
Debugging and Test tools
Loading drivers and providing
dynamic information
For example, using reflection at the runtime
you can determine what method, field,
constructor or modifers a class supports.
What is reflect package ?
package encapsulates
several important interfaces and classes.
These classes and interface define methods
which are used for reflection.
java.lang.reflect
Disadvantages of Reflection
Low performance
Security risk
Violation of Oops concept
java.lang.Class class
Some Important Classes of
java.lang.reflect package
Class
Array
What it does ?
allow you to dynamically create
is a final class in java.lang package
which extends Object class. Instance of this
class represents classes and interfaces in a
running Java application. It is used to
analyze and change dynamic behaviour of a
class at runtime.
Class
Some Important Methods of
java.lang.Class class
This class defines several methods using
which we can get information about
methods, constructors, modifiers and
members of a class at runtime.
forName()
This method takes fully qualified name of
classes or interface as its argument and
returns instance of the class assocaited with
it. Syntax
static Class< ?> forName(String
className)
Example using forName() method
class Student{}
class Test
{
public static void main(String
args[])
{
Class c =
Class.forName("Student");
System.out.println(c.getName());
}
}
Ouput : Student
getConstructors() and
getDeclaredConstructors()
method returns array
of Constructors object that represent all the
public constructors of the invoking object.
Remember, this method only returns public
constructors. If you want to see all the
getConstructors()
declared constructors of a class then use
getDeclaredConstructors(). Following
is the general syntax of both,
Constructor< ?>[] getConstructors();
Constructor< ?>[]
getDeclaredConstructors();
Example using getConstructors() and
getDeclaredConstructors() method
import java.lang.reflect.*;
class Student
{
public Student(){}
public Student(String name){}
}
class Test
{
public static void main(String
args[])
{
try
{
Class c =
Class.forName("Student");
Constructor< Student>[] ct =
c.getConstructors();
for(int i=0; i< ct.length; i++)
{ System.out.println(ct[i]); }
Constructor< Student>[] cdt =
c.getDeclaredConstructors();
for(int i=0;i< cdt.length;i++)
{ System.out.println(cdt[i]);}
}
catch(Exception e)
{ e.printStackTrace();}
}
}
Output :
public Student()
public Student()
Student(java.lang.String)
getMethods() and getDeclaredMethods()
method returns array of
Method object that reflect all the public
method of invoking object.
getMethods()
getDeclaredMethods()
Field< ?>[] getFields();
Field< ?>[] getDeclaredFields();
Method< ?>[] getMethods();
Method< ?>[] getDeclaredMethods();
Example using getFields() and
getDeclaredFields() method
returns only the
declared methods of the invoking class
object. Syntax for both is followwing,
Example using getDeclaredMethods()
method
import java.lang.reflect.*;
class Student
{
public void show(){}
void display(){}
}
class Test
{
public static void main(String
args[])
{
try
{
Class c =
Class.forName("Student");
Method md[] =
c.getDeclaredMethods();
for(int i=0; i< md.length; i++ )
{ System.out.println(md[i]); }
}
catch(Exception e)
{ e.printStackTrace();}
}
}
Output :
public void Student.show()
void Student.display()
getFields() and getDeclaredFields()
returns an array containing
Field objects reflecting all the accessible
public members of the class or interface
represented by this Class object.
getDeclaredFields() returns array of
Field objects reflecting all the fields
declared by the class or interface represented
by this Class object.
import java.lang.reflect.*;
class Student
{
public String name;
int roll;
}
class Test
{
public static void main(String
args[])
{
try
{
Class c =
Class.forName("Student");
Field ff[] = c.getFields();
for(int i=0; i< ff.length; i++)
{ System.out.println(ff[i]); }
Field f[] =
c.getDeclaredFields();
for(int i=0;i< f.length; i++)
{ System.out.println(f[i]); }
}
catch(Exception e)
{ e.printStackTrace();}
}
}
Output :
public java.lang.String
Student.name
public java.lang.String
Student.name
int Student.roll
RMI
getFields()
Remote method invocation(RMI) allow a
java object to invoke method on an object
running on another machine. RMI provide
remote communication between java
program. RMI is used for building
distributed application.
Concept of RMI application
A RMI application can be divided into two
part,Client program and Server program. A
Server program creates some remote object,
make their references available for the client
to invoke method on it. A Client program
make request for remote objects on server
and invoke method on them. Stub and
Skeleton are two important object used for
communication with remote object.
Creating a Simple RMI application
involves following steps
Define a remote interface.
Implementing remote interface.
create and start remote application
create and start client application
Stub and Skeleton
Define a remote interface
Stub act as a gateway for Client program. It
resides on Client side and communicate with
Skeleton object. It establish the connection
between remote object and transmit request
to it.
A remote interface specifies the methods
that can be invoked remotely by a client.
Clients program communicate to remote
interfaces, not to classes implementing it. To
be a remote interface, a interface must
extend the Remote interface of java.rmi
package.
import java.rmi.*;
public interface AddServerInterface
extends Remote
{
public int sum(int a,int b);
}
Implementation of remote interface
For implementation of remote interface, a
class must either extend
UnicastRemoteObject or use
exportObject() method of
UnicastRemoteObject class.
Skeleton object resides on server program. It
is responsible for passing request from Stub
to remote object.
import java.rmi.*;
import java.rmi.server.*;
public class Adder extends
UnicastRemoteObject implements
AddServerInterface
{
Adder()throws RemoteException{
super();
}
public int sum(int a,int b)
{
return a+b;
}
}
Create AddServer and host rmi service
You need to create a server application and
host rmi service Adder in it. This is done
using rebind() method of
java.rmi.Naming class. rebind() method
take two arguments, first represent the name
of the object reference and second argument
is reference to instance of Adder
AddServerInterface
st=(AddServerInterface)Naming.lookup
("rmi://"+args[0]+"/AddService");
System.out.println(st.sum(25,8));
}catch(Exception e)
{System.out.println(e);}
}
}
Steps to run this RMI application
Save all the above java file into a directory
and name it as "rmi"
import java.rmi.*;
import java.rmi.registry.*;
public class AddServer{
public static void main(String
args[]){
try{
AddServerInterface addService=new
Adder();
Naming.rebind("AddService",addServic
e);
//addService object is hosted with
name AddService.
compile all the java files
javac *.java
}catch(Exception e)
{System.out.println(e);}
}
}
Create client application
Client application contains a java program
that invokes the lookup() method of the
Naming class. This method accepts one
argument, the rmi URL and returns a
reference to an object of type
AddServerInterface. All remote method
invocation is done on this object.
import java.rmi.*;
public class Client{
public static void main(String
args[]){
try{
Start RMI registry
start rmiregistry
Run Client file in another command
prompt abd pass local host port
number at run time
java Client 127.0.0.1
Run Server file
java AddServer
Introduction to JDBC
Java Database Connectivity(JDBC) is an
Application Programming Interface(API)
used to connect Java application with
Database. JDBC is used to interact with
various type of Database such as Oracle, MS
Access, My SQL and SQL Server. JDBC
can also be defined as the platformindependent interface between a relational
database and Java programming. It allows
java program to execute SQL statement and
retrieve result from database.
JDBC Driver
JDBC Driver is required to process SQL
requests and generate result. The following
are the different types of driver available in
JDBC.
Type-1 Driver or JDBC-ODBC
bridge
Type-2 Driver or Native API Partly
Java Driver
Type-3 Driver or Network Protocol
Driver
Type-4 Driver or Thin Driver
JDBC-ODBC bridge
What's new in JDBC 4.0
JDBC 4.0 is new and advance specification
of JDBC. It provides the following advance
features
Connection Management
Auto loading of Driver Interface.
Better exception handling
Support for large object
Annotation in SQL query.
Type-1 Driver act as a bridge between
JDBC and other database connectivity
mechanism(ODBC). This driver converts
JDBC calls into ODBC calls and redirects
the request to the ODBC driver.
Advantage
Easy to use
Allow easy connectivity to all
database supported by the ODBC
Driver.
Disadvantage
faster as compared to Type-1 Driver
Contains additional features.
Disadvantage
Requires native library
Increased cost of Application
Slow execution time
Dependent on ODBC Driver.
Network Protocol Driver
Uses Java Native Interface(JNI) to
make ODBC call.
This driver translate the JDBC calls into a
database server independent and
Middleware server-specific calls.
Middleware server further translate JDBC
calls into database specific calls.
Native API Driver
This type of driver make use of Java Native
Interface(JNI) call on database specific
native client API. These native client API
are usually written in C and C++.
Advantage
Advantage
Does not require any native library to
be installed.
Database Independency.
Provide facility to switch over from
one database to another database.
Slow due to increase number of
network call.
Disadvantage
Slow due to increase number of
network call.
JDBC 4.0 API
JDBC 4.0 API is mainly divided into two
package
Thin Driver
1. java.sql
This is Driver called Pure Java Driver
because. This driver interact directly with
database. It does not require any native
database library, that is why it is also known
as Thin Driver.
2. javax.sql
java.sql package
This package include classes and interface to
perform almost all JDBC operation such as
creating and executing SQL Queries.
Important classes and interface of
java.sql package
classes/interface
Advantage
Does not require any native library.
Does not require any Middleware
server.
Better Performance than other driver.
Disadvantage
Description
Provide
support for
java.sql.BLOB
BLOB(Binary
Large Object)
SQL type.
creates a
connection
java.sql.Connection
with specific
database
java.sql.CallableStatem Execute stored
ent
procedures
Provide
support for
CLOB(Charact
java.sql.CLOB
er Large
Object) SQL
type.
java.sql.Date
Provide
support for
Date SQL
type.
create an
instance of a
java.sql.Driver
driver with the
DriverManager
.
This class
manages
java.sql.DriverManager
database
drivers.
Used to create
java.sql.PreparedStatem and execute
ent
parameterized
query.
It is an
interface that
provide
java.sql.ResultSet
methods to
access the
result row-byrow.
Specify
java.sql.Savepoint
savepoint in
transaction.
Encapsulate all
java.sql.SQLException JDBC related
exception.
This interface
is used to
java.sql.Statement
execute SQL
statements.
classes/interface
Description
Provide
information
javax.sql.ConnectionEve
about
nt
occurence of
event.
Used to
register event
javax.sql.ConnectionEve
generated by
ntListener
PooledConne
ction object.
Represent the
DataSource
javax.sql.DataSource
interface used
in an
application.
provide object
javax.sql.PooledConnect to manage
ion
connection
pools.
Steps to connect a Java Application
to Database
The following 5 steps are the basic steps
involve in connecting a Java application
with Database using JDBC.
1. Register the Driver
2. Create a Connection
3. Create SQL Statement
javax.sql package
4. Execute SQL Statement
This package is also known as JDBC
extension API. It provides classes and
interface to access server-side data.
5. Closing the connection
Important classes and interface of
javax.sql package
Example establish connection with Oracle
Driver
Connection con =
DriverManager.getConnection
("jdbc:oracle:thin:@localhost:1521:X
E","username","password");
Create SQL Statement
method is invoked on
current Connection object to create a SQL
Statement.
createStatement()
Syntax
public Statement createStatement()
throws SQLException
Example to create a SQL statement
Register the Driver
Class.forName()
is used to load the driver
class explicitly.
Example to register with JDBC-ODBC
Driver
Class.forName("sun.jdbc.odbc.JdbcOdb
cDriver");
Create a Connection
method of
DriverManager class is used to create a
connection.
getConnection()
Syntax
getConnection(String url)
getConnection(String url, String
username, String password)
getConnection(String url, Properties
info)
Statement s=con.createStatement();
Execute SQL Statement
method of Statement
interface is used to execute SQL statements.
executeQuery()
Syntax
public ResultSet executeQuery(String
query) throws SQLException
Example to execute a SQL statement
ResultSet rs=s.executeQuery("select
* from user");
while(rs.next())
{
System.out.println(rs.getString(1)+"
"+rs.getString(2));
}
Closing the connection
After executing SQL statement you need to
close the connection and release the session.
The close() method of Connection
interface is used to close the connection.
Syntax
public void close() throws
SQLException
Example of closing a connection
con.close();
Connecting to Access Database using
Type-1 Driver
3. Select Data Source(ODBC)
To connect a Java application with Access
database using JDBC-ODBC Bridge(type-1)
Driver. You need to follow the following
steps
Create DSN Name
1. Go to control panel
2. Go to Administrative tools
4. Add new DSN name, select add
5. Select Access driver from the list,
click on finish
NOTE: Here we are showing this example
to create DSN in Window 7 os. For other
operating system you need to do small
changes.
Example
We suppose that you have created a student
table with sid and name column name in
access database.
import java.sql.*;
class Test
{
public static void main(String
[]args)
{
try{
Class.forName("sun.jdbc.odbc.JdbcOdb
cDriver");
Connection con =
DriverManager.getConnection("jdbc:od
bc:Test", "", "");
Statement s=con.createStatement();
//creating statement
6. Give a DSN name, click ok
ResultSet rs=s.executeQuery("select
* from student");
//executing
statement
while(rs.next()){
System.out.println(rs.getInt(1)+"
"+rs.getString(2));
}
con.close();
//closing connection
}catch(Exception e)
{
e.printStackTrace();
}
}
}
You will also require Username and
Password of your Oracle Database
Server for creating connection.
3. Loading jar file: To connect your
java application with Oracle, you
will also need to load ojdbc14.jar
file. This file can be loaded into 2
ways.
1. Copy the jar file into
C:\Program
Files\Java\jre7\lib\ext
folder.
Connecting to Oracle Database using
Thin Driver
or,
To connect a Java application with Oracle
database using Thin Driver. You need to
follow the following steps
1. Load Driver Class: The Driver
Class for oracle database is
oracle.jdbc.driver.OracleDriver
and
Class.forName("oracle.jdbc.dri
ver.OracleDriver") method is
used to load the driver class for
Oracle database.
2. Create Connection: For creating a
connection you will need a
Connection URL. The Connection
URL for Oracle is
2. Set it into classpath. For more
detail see how to set
classpath
Download ojdbc14.jar file
NOTE: Here we are discussing about
Oracle 10g as database. For other version of
Oracle you will be require to do some small
changes in the Connection URL.
Example
Create a table in Oracle Database
create table Student(sid
number(10),sname varchar2(20));
Insert some record into the table
insert into Student
values(101,'adam');
insert into Student
values(102,'abhi');
Accessing record from Student table in
Java application
import java.sql.*;
class Test
{
public static void main(String
[]args)
{
try{
//Loading driver
Class.forName("oracle.jdbc.driver.Or
acleDriver");
//creating connection
Connection con =
DriverManager.getConnection
("jdbc:oracle:thin:@localhost:1521:X
E","username","password");
Statement s=con.createStatement();
//creating statement
ResultSet rs=s.executeQuery("select
* from Student");
//executing
statement
while(rs.next()){
System.out.println(rs.getInt(1)+"
"+rs.getString(2));
}
con.close();
//closing connection
}catch(Exception e){
e.printStacktrace();
}
}
}
Output
101 adam
102 abhi
Inserting record into a table using java
application
import java.sql.*;
class Test
{
public static void main(String
[]args)
{
try{
//Loading driver...
Class.forName("oracle.jdbc.driver.Or
acleDriver");
//creating connection...
Connection con =
DriverManager.getConnection
("jdbc:oracle:thin:@localhost:1521:X
E","username","password");
PreparedStatement
pst=con.prepareStatement("insert
into Student values(?,?)");
pst.setInt(1,104);
pst.setString(2,"Alex");
pst.executeUpdate();
con.close();
//closing connection
}catch(Exception e){
e.printStacktrace();
}
}
}
Connecting to MySQL Database using
Thin Driver
To connect a Java application with MySQL
database using Thin Driver. You need to
follow the following steps
1. Load Driver Class: The Driver
Class for MySQL database is
com.mysql.jdbc.Driver and
Class.forName("com.mysql.jdbc.
Driver") method is used to load
the driver class for MySQL
database.
2. Create Connection: For
creating a connection you will
need a Connection URL. The
Connection URL for MySQL is
Insert some record into the table
insert into Student
values(102,'adam');
insert into Student
values(103,'abhi');
Accessing record from Student table in
Java application
You will also require Username
and Password of your MySQL
Database Server for creating
connection.
3. Loading jar file: To connect
your java application with
MySQL, you will also need to
load mysql-connector.jar file.
This file can be loaded into 2
ways.
1. Copy the jar file into
C:\Program
Files\Java\jre7\lib\ext
folder.
or,
2. Set it into classpath. For
more detail see how to
set classpath
Download mysql-connector.jar file
Example
Create a table in MySQL Database
create table Student(sid
int(10),name varchar(20));
import java.sql.*;
class Test
{
public static void main(String
[]args)
{
try{
//Loading driver
Class.forName("com.mysql.jdbc.Driver
");
//creating connection
Connection con =
DriverManager.getConnection
("jdbc:mysql://localhost:3306/test",
"username","password");
Statement s = con.createStatement();
//creating statement
ResultSet rs =
s.executeQuery("select * from
Student");
//executing
statement
while(rs.next()){
System.out.println(rs.getInt(1)+"
"+rs.getString(2));
}
con.close();
//closing connection
}catch(Exception e){
e.printStacktrace();
}
}
}
Output
102 adam
103 abhi
Inserting record into a table using java
application
import java.sql.*;
class Test
{
public static void main(String
[]args)
{
try{
//Loading driver
Class.forName("com.mysql.jdbc.Driver
");
//creating connection
Connection con =
DriverManager.getConnection
("jdbc:mysql://localhost:3306/test",
"username","password");
PreparedStatement
pst=con.prepareStatement("insert
into Student values(?,?)");
pst.setInt(1,104);
pst.setString(2,"Alex");
pst.executeUpdate();
con.close();
//closing connection
}catch(Exception e){
e.printStacktrace();
}
}
}
Usage
Basic usage
Evaluating expressions
Implicit multiplication
Allowing undeclared variables
Obtaining a list of variables
Complex numbers
Using Vectors
Using Strings
Custom types
Manipulating expressions
Using custom number classes
evaluate expressions with trigonometric funct
and e.
7. myParser.addStandardFunctions();
myParser.addStandardConstants();
8. By default you need to specify which variables
expression. If a variable is not added before th
parser will claim that the expression is invalid
allowing undeclared variables).
To add the variable x and initialize it to 0 for e
myParser.addVariable("x", 0);
9. Parse the expression, and evaluate it:
10. myParser.parseExpression(ExpressionString
result = myParser.getValue();
11.The values of variables can be changed with t
double) method.
The code of the sample applets provide more extensive look
used.
Basic usage
Using the JEP package of classes in your project is simple. The following steps will get you
started quickly.
1. Download the JEP package from the
2. Unpack the archive
Evaluating expressions
Three methods for evaluating an expression are available:
3. Move the jep-x.xx.jar file to a directory of your choice (optional)
getValue(): Use this if you are expecting a nor
4. IMPORTANT: For the Java compiler to be able to find the JEP classes when
getComplexValue():
Use
this if you are expect
compiling your program, it needs to know their
location. So you will
need
to add the location of the .jar file to your CLASSPATH environment
variable (if you don't know how, read this getValueAsObject(): Returns the result as an O
should contain something like C:\java\packages\jep-x.xx.jar, depending
The first two methods call getValueAsObject() internally, an
on where you place the jar file.
conversions into either a double value, or a Complex object.
5. In your program, create a new parser object with
org.nfunk.jep.JEP myParser = new org.nfunk.jep.
6. Add the standard functions and constants if you want to be able to
Note that SymbolTable extends Hashtable.
Implicit multiplication
You can enable the implicit multiplication option with
setting is false (no implicit multiplication).
numbersas "2*x". Note
Implicit multiplication allows expressions such as "2Complex
x" to be interpreted
that a space is required between two variables for them to be interpreted as being
If you want to use complex numbers in your expression, you
multiplied. The same holds for a variable followed by a number. For example "y 3" is
creating the parser object. This will add the imaginary unit a
interpreted as "y*3", but "y3" is interpreted as a single variable with the name y3. If a
functions re() and im() are also added and can be used to obt
variable is preceded by a number, no space is required between them for implicit
components of complex numbers. You will need to import th
multiplication to come in effect.
class to be able to manipulate complex values from expressi
By using the imaginary unit constant i, you can work with co
expressions. A sample complex expression would be (1+2*i)
notation is not supported.
To obtain a complex value from an expression, you must use
function. It will evaluate the expression and return the result
To enable parsing of undeclared variables, use setAllowUndeclared(true)
the class used internally for Complex numbers is also used f
setting is false (undeclared variables are not allowed).
Allowing undeclared variables
Adding a complex variable or constant to the parser before e
If you do not know what variable names may occur in
the with
expression
before parsing It
it,takes
you three parameters: the
done
addComplexValue().
can use setAllowUndeclared(true). With this option
it is not and
necessary
to add component.
the enabled,
real component,
the imaginary
variables to the parser before parsing an expression. If a new variable is found while
parsing, it is automatically added and initialized to 0. See
read about how to access these variables.
Using Vectors
Obtaining a list of variables
Vectors are ordered sets of Double elements. A vector is a lis
commas, and enclosed by square brackets. An example expr
4, to
5]*2
A list of all the variables and constants that have been[3,
added
the parser, can be obtained
It would be evaluated as [6, 8, 10] by JEP. To add a vector as
with the getSymbolTable() method.
addVariableAsObject() method. If the result of an expression
by calling
theisgetValueAsObject()
This method is most useful when the undeclared variables
option
enabled. After an function.
expression has been parsed, a list of all variables occurring in that expression can be
obtained using the getSymbolTable() method. The return value is a SymbolTable object.
order to be able to this, you will need direct access to the exp
Using Strings
The expression tree consists of nodes. Each of the nodes in t
of the following types:
ASTFunNode
and operators
Strings can be entered in an expression by using double quotes.
They can be- Functions
concatenated
with the + operator and compared with the == and != relational operators. A sample
ASTConstant - Constants
expression involving the string type is "foo" + "bar" == "foobar", which would be evaluated
by JEP as 1 (true).
ASTVarNode - Variables
To add a string as a variable, use the addVariableAsObject()
All of them extend the SimpleNode class (which implements
expression is a string, it can be obtained by calling the
operators (+,-,*,/...) and functions are ASTFunNodes. The ty
class) is stored in the pfmc member, and as a string in the na
getPFMC() and getName() methods to access these member
Custom types
To traverse the expression tree you can use a visitor class (P
example class used to print out all the nodes). Look at the Ev
expressions are evaluated using the Visitor design pattern.
In most cases, you will only need to work with the few built in types that JEP supplies
(Double, Complex, Vector, String). But suppose you want to evaluate expressions that
involve other types. This is possible by using the
variables of any type. The only place where the type of a variable matters, is in the function
classes.
Using custom number classes
When an expression is evaluated, values are operatedBy
ondefault
with the
classes
in the function
when
an expression
such as "1+2" is parsed, the c
package. These include the operators (such as Add created internally as Double objects. In most cases this is fin
(such as Sine and Cosine). Without making modifications
to use
the source
only
want to
customcode,
classes
forthe
representing numbers.
default types are handled with these classes. So, in order to be able to handle your own
types, you will need to modify theses classes, or make
your
own function
This
is made
possibleclasses
throughascreating a number class that im
described in the custom functions section.
interface. It includes one method called createNumber(doub
an object initialized to the value of the parameter. You can lo
with the JEP constructor JEP(boolean traverse_in, Boo
Boolean implicitMul_in, NumberFactory numberFact
Manipulating expressions
The custom number objects need to be handled by custom fu
by following the instructions on the Custom Functions page.
The getTopNode() method can be used to get the expression tree after parsing an
expression. This will be useful if you want to do more than just evaluate the expressions
you parse. For example, you may want to determine the derivative of an expression. In
Factory methods
Factory methods are static methods
that return an instance of the native
class. Examples in the JDK:
LogManager.getLogManager
Pattern.compile
Collections.unmodifiableCollect
ion,
Collections.synchronizeCollecti
on , and so on
Calendar.getInstance
Factory methods:
have names, unlike
constructors, which can clarify
code.
do not need to create a new
object upon each invocation objects can be cached and
reused, if necessary.
can return a subtype of their
return type - in particular, can
return an object whose
implementation class is
unknown to the caller. This is a
very valuable and widely used
feature in many frameworks
which use interfaces as the
return type of static factory
methods.
Common names for factory methods
include getInstance and valueOf.
These names are not mandatory choose whatever makes sense for
each case.
Example
public final class ComplexNumber {
/**
* Static factory method returns an
object of this class.
*/
public static ComplexNumber
valueOf(float aReal, float
aImaginary) {
return new ComplexNumber(aReal,
aImaginary);
}
/**
* Caller cannot see this private
constructor.
*
* The only way to build a
ComplexNumber is by calling the
static
* factory method.
*/
private ComplexNumber(float aReal,
float aImaginary) {
fReal = aReal;
fImaginary = aImaginary;
}
private float fReal;
private float fImaginary;
}
//..elided
Factory Method
Definition
Provides an abstraction or an interface and
lets subclass or implementing classes decide
which class or method should be instantiated
or called, based on the conditions or
parameters given.
Where to use & benefits
Connect parallel class
hierarchies.
A class wants its subclasses to
specify the object.
A class cannot anticipate its
subclasses, which must be
created.
A family of objects needs to be
separated by using shared
interface.
The code needs to deal with
interface, not implemented
classes.
Hide concrete classes from the
client.
Factory methods can be
parameterized.
The returned object may be
either abstract or concrete
object.
Providing hooks for subclasses
is more flexible than creating
objects directly.
Follow naming conventions to
help other developers to
recognize the code structure.
Related patterns include
o
Abstract Factory , which
is a layer higher than a
factory method.
Template method, which
defines a skeleton of an
algorithm to defer some
steps to subclasses or
avoid subclasses
Prototype, which creates
a new object by copying
an instance, so it reduces
subclasses.
Singleton, which makes a
returned factory method
unique.
Examples
To illustrate such concept, let's use a simple
example. To paint a picture, you may need
several steps. A shape is an interface.
Several implementing classes may be
designed in the following way.
interface Shape {
public void draw();
}
class Line implements Shape {
Point x, y;
Line(Point a, Point b) {
x = a;
y = b;
}
public void draw() {
//draw a line;
}
}
class Square implements Shape {
Point start;
int width, height;
Square(Point s, int w, int h) {
start = s;
width = w;
height = h;
}
public void draw() {
//draw a square;
}
}
class Circle implements Shape {
....
}
class Painting {
Point x, y;
int width, height, radius;
Painting(Point a, Point b, int w,
int h, int r) {
x = a;
y = b;
width = w;
height = h;
radius = r;
}
Shape drawLine() {
return new Line(x,y);
}
Shape drawSquare() {
return new Square(x, width,
height);
}
Shape drawCircle() {
return new Circle(x, radius);
}
....
}
...
Shape pic;
Painting pt;
//initializing pt
....
if (line)
pic = pt.drawLine();
if (square)
pic = pt.drawSquare();
if (circle)
pic = pt.drawCircle();
From the above example, you may see that
the Shape pic's type depends on the
condition given. The variable pic may be a
line or square or a circle.
You may use several constructors with
different parameters to instantiate the object
you want. It is another way to design with
Factory pattern. For example,
class Painting {
...
Painting(Point a, Point b) {
new Line(a, b); //draw a line
}
Painting(Point a, int w, int h) {
new Square(a, w, h); //draw a
square
}
Painting(Point a, int r){
new Circle(a, r); //draw a
circle
}
...
}
You may use several methods to finish the
drawing jobs. It is so-called factory method
pattern. for example,
class Painting {
...
Painting(Point a, Point b) {
draw(a, b); //draw a line
}
Painting(Point a, int w, int h) {
draw(a, w, h); //draw a square
}
Painting(Point a, int r){
draw(a, r); //draw a circle
}
...
}
The above draw() methods are overloaded.
Here is a popular example of Factory design
pattern. For example, you have several
database storages located in several places.
The program working on the database is the
same. The user may choose local mode or
remote mode. The condition is the choice by
the user. You may design your program with
Factory pattern. When the local mode is set,
you may instantiate an object to work on the
local database. If the remote mode is set,
you may instantiate an object which may
have more job to do like remote connection,
downloading, etc.
interface DatabaseService {
public DataInfo getDataInfo()
throws Exception;
public FieldInfo getFieldInfo()
throws Exception;
public void write(FieldInfo fi)
throws Exception;
public void modify(FieldInfo fi)
throws Exception;
public void delete(FieldInfo fi)
throws Exception;
//...
}
class Data implements
DatabaseService {
public Data(String fileName)
{...};
public Data(URL url, String
fileName) {....};
public DataInfo getDataInfo()
throws Exception {...};
public FieldInfo getFieldInfo()
throws Exception {...};
public void write(FieldInfo fi)
throws Exception {...};
public void modify(FieldInfo fi)
throws Exception {...};
public void delete(FieldInfo fi)
throws Exception {...};
//....
}
class DataManager{
Data data = null;
...
if (local) {
data = new Data(localFile);
...
}
if (remote){
data = new Data(connectRemote,
databaseFile);
...
}
data.write(someInfo);
data.modify(someInfo);
....
}
To illustrate how to use factory design
pattern with class level implementation, here
is a real world example. A company has a
website to display testing result from a plain
text file. Recently, the company purchased a
new machine which produces a binary data
file, another new machine on the way, it is
possible that one will produce different data
file. How to write a system to deal with such
change. The website just needs data to
display. Your job is to provide the specified
data format for the website.
Here comes a solution. Use an interface type
to converge the different data file format.
The following is a skeleton of
implementation.
//Let's say the interface is Display
interface Display {
//load a file
public void load(String
fileName);
//parse the file and make a
consistent data type
public void formatConsistency();
}
//deal with plain text file
class CSVFile implements Display{
public void load(String
textfile) {
System.out.println("load
from a txt file");
}
public void formatConsistency()
{
System.out.println("txt file
format changed");
}
}
//deal with XML format file
class XMLFile implements Display {
public void load(String xmlfile)
{
System.out.println("load
from an xml file");
}
public void formatConsistency()
{
System.out.println("xml file
format changed");
}
}
//deal with binary format file
class DBFile implements Display {
{
public
void load(String dbfile)
System.out.println("load
from a db file");
}
public void formatConsistency()
{
System.out.println("db file
format changed");
}
}
//Test the functionality
class TestFactory {
public static void main(String[]
args) {
Display display = null;
//use a command line data as
a trigger
if (args[0].equals("1"))
display = new CSVFile();
else if
(args[0].equals("2"))
display = new XMLFile();
else if
(args[0].equals("3"))
display = new DBFile();
else
System.exit(1);
//converging code follows
display.load("");
display.formatConsistency();
}
}
//after compilation and run it
C:\>java TestFactory 1
load from a txt file
txt file format changed
C:\>java TestFactory 2
load from an xml file
xml file format changed
C:\>java TestFactory 3
load from a db file
db file format changed
Introduction
Java is an object-oriented language and can
view everything as an object. A simple file
can be treated as an object (with
java.io.File), an address of a system can be
seen as an object (with java.util.URL), an
image can be treated as an object (with
java.awt.Image) and a simple data type can
be converted into an object (with wrapper
classes). This tutorial discusses wrapper
classes. Wrapper classes are used to
convert any data type into an object.
The primitive data types are not objects;
they do not belong to any class; they are
defined in the language itself. Sometimes, it
is required to convert data types into objects
in Java language. For example, upto
JDK1.4, the data structures accept only
objects to store. A data type is to be
converted into an object and then added to a
Stack or Vector etc. For this conversion, the
designers introduced wrapper classes.
What are Wrapper classes?
As the name says, a wrapper class wraps
(encloses) around a data type and gives it an
object appearance. Wherever, the data type
is required as an object, this object can be
used. Wrapper classes include methods to
unwrap the object and give back the data
type. It can be compared with a chocolate.
The manufacturer wraps the chocolate with
some foil or paper to prevent from pollution.
The user takes the chocolate, removes and
throws the wrapper and eats it.
Observe the following conversion.
int k = 100;
Integer it1 = new Integer(k);
The int data type k is converted into an
object, it1 using Integer class. The it1
object can be used in Java programming
wherever k is required an object.
The following code can be used to unwrap
(getting back int from Integer object) the
object it1.
int m = it1.intValue();
System.out.println(m*m); // prints 10000
intValue() is a method of Integer class that
returns an int data type.
List of Wrapper classes
In the above code, Integer class is known as
a wrapper class (because it wraps around int
data type to give it an impression of object).
To wrap (or to convert) each primitive data
type, there comes a wrapper class. Eight
wrapper classes exist in java.lang package
that represent 8 data types. Following list
gives.
Primitive data type
byte
short
int
long
float
double
char
boolean
Wrapper class
Byte
Short
Integer
Long
Float
Double
Character
Boolean
Following is the hierarchy of the above
classes.
All the 8 wrapper classes are placed in
java.lang package so that they are implicitly
imported and made available to the
programmer. As you can observe in the
above hierarchy, the super class of all
numeric wrapper classes is Number and the
super class for Character and Boolean is
Object. All the wrapper classes are defined
as final and thus designers prevented them
from inheritance.
Importance of Wrapper classes
There are mainly two uses with wrapper
classes.
1. To convert simple data types into
objects, that is, to give object form to
a data type; here constructors are
used.
2. To convert strings into data types
(known as parsing operations), here
methods of type parseXXX() are
used.
The following program expresses the style
of converting data type into an object and at
the same time retrieving the data type from
the object.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
public class WrappingUnwrapping
{
public static void main(String
args[])
{
// data types
byte grade = 2;
int marks = 50;
float price = 8.6f;
// observe a suffix of
<strong>f</strong> for float
double rate = 50.5;
// data types to objects
Byte g1 = new Byte(grade);
// wrapping
Integer m1 = new
Integer(marks);
Float f1 = new Float(price);
Double r1 = new Double(rate);
// let us print the values from
objects
System.out.println("Values of
Wrapper objects (printing as
objects)");
System.out.println("Byte
object g1: " + g1);
System.out.println("Integer
object m1: " + m1);
System.out.println("Float
object f1: " + f1);
System.out.println("Double
object r1: " + r1);
// objects to
data types (retrieving data types
from objects)
byte bv = g1.byteValue();
// unwrapping
int iv = m1.intValue();
float fv = f1.floatValue();
double dv = r1.doubleValue();
20
21
22
23
24
25
26
27
28
29
30
31 // let us print the values from
32 data types
System.out.println("Unwrapped
values (printing as data
types)");
System.out.println("byte
value, bv: " + bv);
System.out.println("int
value, iv: " + iv);
System.out.println("float
value, fv: " + fv);
System.out.println("double
value, dv: " + dv);
}
}
As you can observe from the screenshot,
constructors of wrapper classes are used to
convert data types into objects and the
methods of the form XXXValue() are used
to retrieve back the data type from the
object.
- See more at: http://way2java.com/javalang/wrapperclasses/#sthash.S3twkGLx.dpuf
Description
Each of Java's eight primitive data types has
a class dedicated to it. These are known as
wrapper classes, because they "wrap" the
primitive data type into an object of that
class. The wrapper classes are part of the
java.lang package, which is imported by
default into all Java programs.
The wrapper classes in java servers two
primary purposes.
To provide mechanism to wrap
primitive values in an object so
that primitives can do activities
reserved for the objects like
being added to ArrayList,
Hashset, HashMap etc.
collection.
To provide an assortment of
utility functions for primitives
like converting primitive types
to and from string objects,
converting to various bases like
binary, octal or hexadecimal, or
comparing various objects.
The following two statements illustrate the
difference between a primitive data type and
an object of a wrapper class:
int x = 25;
Integer y = new Integer(33);
The first statement declares an int variable
named x and initializes it with the value 25.
The second statement instantiates an Integer
object. The object is initialized with the
value 33 and a reference to the object is
assigned to the object variable y.
Below table lists wrapper classes in Java
API with constructor details.
Primiti Wrapper
ve
Class
Constructor
Argument
As explain in above table all wrapper classes
(except Character) take String as argument
constructor. Please note we might get
NumberFormatException if we try to assign
invalid argument in constructor. For
example to create Integer object we can
have following syntax.
Integer intObj = new Integer (25);
Integer intObj2 = new Integer
("25");
Here in we can provide any number as string
argument but not the words etc. Below
statement will throw run time exception
(NumberFormatException)
boolea
Boolean
n
boolean or String
byte
Byte
byte or String
char
Character
char
Integer intObj3 = new Integer
("Two");
int
Integer
int or String
float
Float
float, double or
String
The following discussion focuses on the
Integer wrapperclass, but applies in a
general sense to all eight wrapper classes.
double Double
double or String
long
Long
long or String
short
Short
short or String
Below is wrapper class hierarchy as per Java
API
The most common methods of the Integer
wrapper class are summarized in below
table. Similar methods for the other wrapper
classes are found in the Java API
documentation.
Method
Purpose
parseInt(s)
returns a signed decimal
integer value equivalent
to string s
toString(i)
returns a new String
object representing the
integer i
Returns true if the
boolean
invoking Integer object
equals(Objec is equivalent to intObj.
t intObj)
Otherwise, it returns
false.
byteValue()
returns the value of this
Integer as a byte
Lets see java program which explain few
wrapper classes methods.
doubleValue( returns the value of this
)
Integer as an double
floatValue()
returns the value of this
Integer as a float
intValue()
returns the value of this
Integer as an int
shortValue()
returns the value of this
Integer as a short
longValue()
returns the value of this
Integer as a long
Compares the numerical
value of the invoking
object with that of i.
Returns 0 if the values
int
are equal. Returns a
compareTo(in negative value if the
t i)
invoking object has a
lower value. Returns a
positive value if the
invoking object has a
greater value.
static int
compare(int
num1, int
num2)
Compares the values of
num1 and num2.
Returns 0 if the values
are equal. Returns a
negative value if num1
is less than num2.
Returns a positive value
if num1 is greater than
num2.
view plainprint?
1. package WrapperIntro;
2.
3. public class WrapperDemo {
4.
5.
public static void main (String
args[]){
6.
Integer intObj1 = new Inte
ger (25);
7.
Integer intObj2 = new Inte
ger ("25");
8.
Integer intObj3= new Integ
er (35);
9.
//compareTo demo
10.
System.out.println("Compa
ring using compareTo Obj1 and
Obj2: " + intObj1.compareTo(int
Obj2));
11.
System.out.println("Compa
ring using compareTo Obj1 and
Obj3: " + intObj1.compareTo(int
Obj3));
12.
13.
//Equals demo
14.
System.out.println("Compa
ring using equals Obj1 and Obj2
: " + intObj1.equals(intObj2));
15.
System.out.println("Compa
ring using equals Obj1 and Obj3
: " + intObj1.equals(intObj3));
Output
16.
17.
Float f1 = new Float("2.25f
");
18.
Float f2 = new Float("20.4
3f");
19.
Float f3 = new Float(2.25f);
20.
System.out.println("Compa
ring using compare f1 and f2: "
+Float.compare(f1,f2));
21.
System.out.println("Compa
ring using compare f1 and f3: "
+Float.compare(f1,f3));
valueOf (), toHexString(),
toOctalString() and
toBinaryString() Methods:
This is another approach to create wrapper
objects. We can convert from binary or octal
or hexadecimal before assigning value to
wrapper object using two argument
constructor. Below program explains the
method in details.
view plainprint?
1. package WrapperIntro;
22.
23.
//Addition of Integer with Fl
2.
oat
3. public class ValueOfDemo {
24.
Float f = intObj1.floatValue
() + f1;
4.
25.
System.out.println("Additio
n of intObj1 and f1: "+ intObj1
+"+" +f1+"=" +f );
26.
27.
28.}
5.
public static void main(String
[] args) {
6.
Integer intWrapper = Integ
er.valueOf("12345");
7.
//Converting from binary to
decimal
8.
Integer intWrapper2 = Inte
ger.valueOf("11011", 2);
9.
//Converting from hexadeci
mal to decimal
10.
Integer intWrapper3 = Inte
ger.valueOf("D", 16);
17.
18.}
11.
12.
System.out.println("Value o
f intWrapper Object: "+ intWrap
per);
13.
System.out.println("Value o
f intWrapper2 Object: "+ intWra
pper2);
14.
System.out.println("Value o
f intWrapper3 Object: "+ intWra
pper3);
15.
System.out.println("Hex va
lue of intWrapper: " + Integer.to
HexString(intWrapper));
16.
System.out.println("Binary
Value of intWrapper2: "+ Integer
.toBinaryString(intWrapper2));
Output
- See more at:
http://www.w3resource.com/javatutorial/java-wrapperclasses.php#sthash.yqJ4LjkG.dpuf