Java Introduction
Java Introduction
We need to understand three terminologies for sure in Java such as JDK, JRE and JVM. Here I
give basic idea about these terms.
What is JDK?
What is JRE?
What is JVM?
JVM stands for Java Virtual Machine. JVM drives the java code. Using JVM, we can run java
byte code by converting them into current OS machine language.
Java Syntax:
Introduction to 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.
As of 2015, Java is one of the most popular programming languages in use, particularly for
client-server web applications, with a reported 9 million developers using and working on it.
Creation of Java
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.
The initial name was Oak but it was renamed to Java in 1995 as OAK was a registered
trademark of another Tech company.
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. Keyword assert, chained exceptions and channel based I/O System
was introduced.
Java 1.5 was called J2SE 5, it added following major new features :
Generics
Annotations
Autoboxing and autounboxing
Enumerations
For-each Loop
Varargs
Static Import
Formatted I/O
Concurrency utilities
Next major release was Java SE 7 which included many new changes, like :
And the latest addition to the lot is, Java SE 8, it was released on March 18, 2014. Some of the
major new features introduced in JAVA 8 are,
Lambda Expressions
New Collection Package java.util.stream to provide Stream API.
Enhanced Security
Nashorn Javascript Engine included
Parallel Array Sorting
The JDBC-ODBC Bridge has been removed etc.
Step 4: Now alter the path variable so that it also contains the path to JDK installed directory.
For e.g:- Change C:\windows/ system 32. to C:\windows/system 32; C:\program files / Java/
JDK.
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
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.
Following are some other usage of Java :
2) Object Oriented
In java everything is Object which has some data and behaviour. Java can be easily extended as
it is based on Object Model.
3) Robust
Java makes an effort to eliminate error prone codes by emphasizing mainly on compile time
error checking and runtime checking. But the main areas which Java improved were Memory
Management and mishandled Exceptions by introducing automatic Garbage
Collector and Exception Handling.
4) Platform Independent
Unlike other programming languages such as C, C++ etc which are compiled into platform
specific machines. Java is guaranteed to be write-once, run-anywhere language.
On compilation Java program is compiled into bytecode. This bytecode is platform independent
and can be run on any machine, plus this bytecode format also provide security. Any machine
with Java Runtime Environment can run Java Programs.
5) Secure
When it comes to security, Java is always the first choice. With java secure features it enable us
to develop virus free, temper free system. Java program always runs in Java runtime environment
with almost null interaction with system OS, hence it is more secure.
6) Multi Threading
Java multithreading feature makes it possible to write program that can do many tasks
simultaneously. Benefit of multithreading is that it utilizes same memory and other resources to
execute multiple threads at the same time, like While typing, grammatical errors are checked
along.
7) Architectural Neutral
Compiler generates bytecodes, which have nothing to do with a particular computer architecture,
hence a Java program is easy to intrepret on any machine.
8) Portable
Java Byte code can be carried to any platform. No implementation dependent features.
Everything related to storage is predefined, example: size of primitive data types
9) High Performance
Java is an interpreted language, so it will never be as fast as a compiled language like C or C++.
But, Java enables high performance with the use of just-in-time compiler.
JVM Architecture
JDK : The JDK also called Java Development Kit is a superset of the JRE, and contains everything that is in
the JRE, plus tools such as the compilers and debuggers necessary for developing applets and
applications.
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 : class keyword is used to declare classes in Java
public : It is an access specifier. Public means this function is visible to all.
static : static is again a keyword used to make a function static. To execute a static function you
do not have to create an Object of the class. The main() method here is called by JVM, without
creating any object for class.
void : It is the return type, meaning this function will not return anything.
main : main() method is the most important method in a Java program. This is the method which
is executed, hence all the logic must be inside the main() method. If a java class is not having a
main() method, it causes compilation error.
String[] args : This represents an array whose type is String and name is args. We will discuss
more about array in Java Array section.
System.out.println : This is used to print anything on the console like printf in C language.
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 codes that can violate access right to
the object.
3. Interpreter reads the byte code stream and then executes the instructions, step by step.
Data Types in Java
Java language has a rich implementation of data types. Data types specify size and the type of
values that can be stored in an identifier.
In java, data types are classified into two catagories :
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
Integer
Identifiers in Java
All Java components require names. Name used for classes, methods, interfaces and variables are
called Identifier. Identifier must follow some rules. Here are the rules:
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;
In Java, type casting is classified into two types,
Widening Casting(Implicit)
Example :
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
System.out.println("Int value "+i);
System.out.println("Long value "+l);
System.out.println("Float value "+f);
}
}
Int value 100
Long value 100
Float value 100.0
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
Variable
What is a variable?
When we want to store any information, we store it in an address of the computer. Instead of
remembering the complex address where we have stored our information, we name that address.
The naming of an address is known as variable. Variable is the name of memory location.
Java Programming language defines mainly three kind of variables.
1. Instance variables
2. Static Variables
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. They are referred as object variable. Each object has its own copy of each variable and
thus, it doesn't effect the instance variable if one object changes the value of the variable.
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.
Additional points on static variable:
Note: A static variable can never be defined inside a method i.e it can never be a local variable.
Example:
Suppose you make 2 objects of class Student and you change the value of static variable from
one object. Now when you print it from other object, it will display the changed value. This is
because it was declared static i.e it is constant for every object created.
package studytonight;
class Student{
int a;
static int id = 35;
void change(){
System.out.println(id);
}
}
o1.change();
Student.id = 1;
o2.change();
}
}
35
1
3) Local variables
Local variables are declared in method, constructor or block. Local variables are initialized when
method, constructor or block start and will be destroyed once its end. Local variable reside in
stack. Access modifiers are not used for local variable.
float getDiscount(int price)
{
float discount;
discount=price*(20/100);
return discount;
}
Here discount is a local variable.
Features of Array
Array Declaration
Syntax :
datatype[] identifier;
or
datatype identifier[];
Both are valid syntax for array declaration. But the former is more readable.
Example :
int[ ] arr;
char[ ] arr;
short[ ] arr;
long[ ] arr;
int[ ][ ] arr; // two dimensional array.
Initialization of Array
new operator is used to initialize an array.
Example :
int[] arr = new int[10]; //this creates an empty array named arr of integer type whose size is 10.
or
int[] arr = {10,20,30,40,50}; //this creates an array named arr whose elements are given.
Note: To find the length of an array, we can use the following syntax: array_name.length. There
are no braces infront of length. Its not length().
10
20
30
40
Multi-Dimensional Array
A multi-dimensional array is very much similar to a single dimensional array. It can have
multiple rows and multiple columns unlike single dimensional array, which can have only one
full row or one full column.
Array Declaration
Syntax:
datatype[ ][ ] identifier;
or
datatype identifier[ ][ ];
Initialization of Array
new operator is used to initialize an array.
Example:
array_name[m-1][n-1]
Example:
Jagged Array
Jagged means to have an uneven edge or surface. In java, a jagged array means to have a multi-
dimensional array with uneven size of rows in it.
Initialization of Jagged Array
new operator is used to initialize an array.
Example:
int[ ][ ] arr = new int[3][ ]; //there will be 10 arrays whose size is variable
arr[0] = new int[3];
arr[1] = new int[4];
arr[2] = new int[5];
Java Operators
Java provides a rich set of operators environment. Java operators can be divided 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
% remainder of division
Operator Description
> Check if operand on the left is greater than operand on the right
Logical operators
Java supports following 3 logical operator. Suppose a=1 and b=0;
|| Logical OR (a || b) is true
Operator Description
| Bitwise OR
^ Bitwise exclusive OR
0 0 0 0 0
0 1 0 1 1
1 0 0 1 1
1 1 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:
= assigns values from right side operands to left side operand a=b
+= adds right operand to the left operand and assign the result to left a+=b is same
as a=a+b
-= subtracts right operand from the left operand and assign the result a-=b is same as a=a-
to left operand b
*= mutiply left operand with the right operand and assign the result a*=b is same
to left operand as a=a*b
/= divides left operand with the right operand and assign the result a/=b is same
to left operand as a=a/b
%= calculate modulus using two operands and assign the result to left a%=b is same
operand as a=a%b
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)
Inheritence
Polymorphism
Encapsulation
Abstraction
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. 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. Thus, the instance variables and methods are known
as class members. class is also known as a user defined datatype.
A class and an object can be related as follows: Consider an ice tray(like of cube shape) as a
class. Then ice cubes can be considered as the objects which is a blueprint of its class i.e of ice
tray.
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="StudyTonight";
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 method.
While argument is a value that is passed to a method when it is called.
50
Method overloading
If two or more method in a class have same name but different parameters, it is known as method
overloading. Overloading always occur in the same class(unlike method overriding).
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
Note: Overloaded method can have different access modifiers.
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.6f, 3.8f); //sum(float a, float b) is called.
}
}
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.
Method overloading by changing no. of argument.
Example :
class Area
{
void find(int l, int 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); //find(int l, int b) is method is called.
ar.find(4,6,2); //find(int l, int b,int h) is called.
}
}
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.
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.
}
}
Area is 40
Area is 48
Constructors in Java
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.
A constructor has same name as the class in which it resides. Constructor in Java can not be
abstract, static, final or synchronized. These modifiers are not allowed for constructor.
class Car
{
String name ;
String model;
Car( ) //Constructor
{
name ="";
model="";
}
}
Default Constructor
Parameterized constructor
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.
x=10
this keyword
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 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.
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.
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.
Signature of finalize() method
protected void finalize()
{
//finalize-code
}
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");
}
}
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,
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. Final keyword can be used with a variable, a
method or a class.
1. Final Variable
When a variable is declared as final, then its value cannot be changed. The variable acts like
a constant.
Syntax:
final int a = 5;
2. Final Method
}
104 Abhijit StudyTonight
108 ankit StudyTonight
get memory only once get new memory each time a new object is 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.
}
}
/pre>
101
102
See the difference in value of two variable. Static variable x shows the changes made to it by
increment() method on the different object. While instance variable y 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 :
class Test
{
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
}
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. volatile keyword cannot be used with a method or a class. It can be only used with a
variable.
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 implements keywords are used to describe inheritance in Java.
1. It promotes the code reusabilty i.e the same methods and variables which are defined in a
parent/super/base class can be used in the child/sub/derived class.
2. It promotes polymorphism by allowing method overriding.
Disadvantages of Inheritance
Main disadvantage of using inheritance is that the two classes (parent and child class)
gets tightly coupled.
This means that if we change code of parent class, it will affect to all the child classes which is
inheriting/deriving the parent class, and hence, it cannot be independent of each other.
Child method
Parent method
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();
}
}
sports Car
Types of Inheritance
1. Single Inheritance
2. Multilevel Inheritance
3. Heirarchical Inheritance
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 child class. In other
words super keyword is used by a subclass whenever it need to refer to its immediate super
class.
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();
}
}
Example of Child class refering Parent class methods using super keyword
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();
}
}
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;
Aggregation (HAS-A)
HAS-A relationship is based on usage, rather than inheritance. In other words, class A has-
arelationship 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.
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();
}
}
Book is Java.
price is 550.
Author is me.
Method Overriding
When a method in a sub class has same name, same number of arguments and same 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");
}
}
Parameter must be different and name Both name and parameter must be same.
must be same.
Access specifier can be changed. Access specifier cannot be more restrictive than original
method(can be less restrictive).
Q. Can we Override static method? Explain with reasons ?
No, we cannot override static method. Because static method is bound to class whereas method
overriding is associated with object i.e at runtime.
Example
class Game
{
public void type()
{ System.out.println("Indoor & outdoor"); }
}
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);
}
}
true
Downcasting
Child.show(p);
}
}
Sucessfull Casting
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
true
true
false
false
true
false
false
true
10
20
30
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 or sub-package. Using package it becomes easier to locate the related
classes and it also provides a good structure for projects with hundreds of classes and other files.
Built-in Package: Existing Java package for example java.lang, java.util etc.
User-defined-package: Java package created by user to categorize their project's 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 mypack;
public class employee
{
statement;
}
The above statement will create a package woth name mypack in the project directory.
Java uses file system directories to store packages. For example the .java file for any class you
define to be part of mypack package must be stored in a directory called mypack.
Additional points about package:
A package is always defined as a separate folder having the same name as the package name.
Store all the classes in that package folder.
All classes of the package which we wish to access outside the package must be declared
public.
All classes within the package must have the package statement as its first line.
All classes of the package must be compiled before use (So that they are error free)
If you use fully qualified name to import any class into your program, then only that
particular class of the package will be accessible in your program, other classes in the same
package will not be accessible. For this approach, there is no need to use
the import statement. But you will have to use the fully qualified name every time you are
accessing the class or the interface, which can look a little untidy if the package name is
long.
This is generally used when two packages have classes with same names. For
example: java.util and java.sql packages contain Date class.
Example :
//save by A.java
package pack;
public class A {
public void msg() {
System.out.println("Hello");
}
}
//save by B.java
package mypack;
class B {
public static void main(String args[]) {
pack.A obj = new pack.A(); //using fully qualified name
obj.msg();
}
}
Output:
Hello
If you import packagename.classname then only the class with name classname in the
package with name packagename will be available for use.
Example :
//save by A.java
package pack;
public class A {
public void msg() {
System.out.println("Hello");
}
}
//save by B.java
package mypack;
import pack.A;
class B {
public static void main(String args[]) {
A obj = new A();
obj.msg();
}
}
Output:
Hello
The import keyword is used to make the classes and interface of another package accessible
to the current package.
Example :
//save by First.java
package learnjava;
public class First{
public void msg() {
System.out.println("Hello");
}
}
//save by Second.java
package Java;
import learnjava.*;
class Second {
public static void main(String args[]) {
First obj = new First();
obj.msg();
}
}
Output:
Hello
Points to remember
When a package name is not specified, the classes are defined into the default package (the
current working directory) and the package itself is given no name. That is why, you were
able to execute assignments earlier.
While creating a package, care should be taken that the statement for creating package must
be written before any other import statements.
// not allowed
import package p1.*;
package p3;
Below code is correct, while the code mentioned above is incorrect.
//correct syntax
package p3;
import package p1.*;
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 are called 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 function_name (); //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();
}
}
this is callme.
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 may or may not have an abstract method. But if any class has even a single
abstract method, then it must be declared abstract.
3. Abstract classes can have Constructors, Member variables and Normal methods.
4. Abstract classes are never instantiated.
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.
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 {
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.
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
do without saying anything about how the class will do it.
Syntax :
interface interface_name { }
Example of Interface
interface Moveable
{
int AVERAGE-SPEED=40;
void move();
}
NOTE : Compiler automatically converts methods of Interface as public and abstract, and the
data members as public, static and final by default.
interface Rollable
{
boolean isRollable
}
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());
}
}
true
true
Abstract class is a class which contain one or Interface is a Java Object containing method
more abstract methods, which has to be declaration but no implementation. The classes
implemented by its sub classes. which implement the Interfaces must provide the
method definition for all the methods.
Abstract class Interface
Abstract class is a Class prefix with an Interface is a pure abstract class which starts with
abstract keyword followed by Class interface keyword.
definition.
Abstract class can also contain concrete Whereas, Interface contains all abstract methods and
methods. final variable declarations.
Abstract classes are useful in a situation that Interfaces are useful in a situation that all properties
Some general methods should be should be implemented.
implemented and specialization behavior
should be implemented by child classes.
Nested Class
A class defined within another class is known as Nested class. The scope of the nested class is
bounded by the scope of its enclosing class.
Syntax:
class Outer{
//class Outer members
class Inner{
//class Inner members
}
1. It is a way of logically grouping classes that are only used in one place.
2. It increases encapsulation.
3. It can lead to more readable and maintainable code.
If you want to create a class which is to be used only by the enclosing class, then it is not
necessary to create a separate file for that. Instead, you can add it as "Inner Class"
A non-static Nested class that is created outside a method is called Member inner class.
A non-static Nested class that is created inside a method is called local inner class. If you want
to invoke the methods of local inner class, you must instantiate this class inside the method. We
cannot use private, public or protected access modifiers with local inner class. Only abstract and
final modifiers are allowed.
class Inner
{
public void show()
{
System.out.println("Inside inner");
}
}
}
class Test
{
public static void main(String[] args)
{
Outer ot=new Outer();
ot.display();
}
}
Inside inner
class Test
{
public static void main(String[] args)
{
Outer ot=new Outer();
ot.display();
}
}
Inside inner 0
Inside inner 1
Inside inner 2
Inside inner 3
Inside inner 4
class Test
{
public static void main(String[] args)
{
Outer ot=new Outer();
Outer.Inner in= ot.new Inner();
in.show();
}
}
Inside inner 1
Annonymous class
A class without any name is called Annonymous class.
interface Animal
{
void type();
}
public class ATest {
public static void main(String args[])
{
Animal an = new Animal(){ //Annonymous class created
public void type()
{
System.out.println("Annonymous animal");
}
};
an.type();
}
}
Annonymous animal
Here a class is created which implements Animal interace and its name will be decided by the
compiler. This annonymous class will provide implementation of type() method.
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;
But if we change the new string, its reference gets modified.
str2=str2.concat("world");
Concatenating String
There are 2 methods to concatenate two or more string.
2) Using + operator
string str = "Rahul";
string str1 = "Dravid";
string str2 = str + str1;
string st = "Rahul"+"Dravid";
String Comparison
String comparison can be done in 3 ways.
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(s1 == s2) //true
test(s1 == s3) //false
Reason:
Its because we are creating a new object using new operator, and thus it gets created in a non-
pool memory area of the heap. s1 is pointing to the String in string pool while s3 is pointing to
the String in heap and hence, when we compare s1 and s3, the answer is false.
The following image will explain it more clearly.
By compareTo() method
compareTo() method compares values and returns an int which tells if the string compared is less
than, equal to or greater than the other string. It compares the String based on natural ordering i.e
alphabetically. Its general syntax is,
int compareTo(String str)
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(str.equalsIgnoreCase("JAVA"));
true
indexOf()
indexOf() function returns the index of first occurrence of a substring or a
character. indexOf()method has four forms:
int indexOf(String str): It returns the index within this string of the first occurrence of the
specified substring.
int indexOf(int ch, int fromIndex): It returns the index within this string of the first
occurrence of the specified character, starting the search at the specified index.
int indexOf(int ch): It returns the index within this string of the first occurrence of the
specified character.
int indexOf(String str, int fromIndex): It returns the index within this string of the first
occurrence of the specified substring, starting at the specified index.
Example:
public class StudyTonight {
public static void main(String[] args) {
String str="StudyTonight";
System.out.println(str.indexOf('u')); //3rd form
System.out.println(str.indexOf('t', 3)); //2nd form
String subString="Ton";
System.out.println(str.indexOf(subString)); //1st form
System.out.println(str.indexOf(subString,7)); //4th form
}
}
2
11
5
-1
NOTE: -1 indicates that the substring/Character is not found in the given String.
length()
length() function returns the number of characters in a String.
String str = "Count me";
System.out.println(str.length());
replace()
replace() method replaces occurances of character with a specified new character.
String str = "Change me";
System.out.println(str.replace('m','M'));
Change Me
substring()
substring() method returns a part of the string. substring() method has two forms,
public String substring(int begin);
456
toLowerCase()
toLowerCase() method returns string with all uppercase characters converted to lowercase.
String str = "ABCDEF";
System.out.println(str.toLowerCase());
abcdef
toUpperCase()
This method returns string with all lowercase character changed to uppercase.
String str = "abcdef";
System.out.println(str.toUpperCase());
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.
public class Example{
public static void main(String args[]){
int num = 35;
String s1 = String.valueOf(num); //converting int to String
System.out.println(s1+"IAmAString");
}
}
35IAmAString
But for objects, valueOf() method calls toString() 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.println(c);
}
public String toString()
{
return "This is my car object";
}
}
Hello World
NOTE: If we don't override the toString() method and directly print the object, then it would
print the object id.
Example:
public class Car {
public static void main(String args[])
{
Car c = new Car();
System.out.println(c);
}
}
trim()
This method returns a string from which any leading and trailing whitespaces has been removed.
String str = " hello ";
System.out.println(str.trim());
hello
NOTE: If the whitespaces are between the string, for example: String s1 = "study
tonight"; then System.out.println(s1.trim()); will output "study tonight".
trim() method removes only the leading and trailing whitespaces.
StringBuffer class
StringBuffer class is used to create a mutable string object i.e its state can be changed after it is
created. 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 )
4. StringBuffer ( charSequence [ ]ch )
StringBuffer() creates an empty string buffer and reserves room for 16 characters.
stringBuffer(int size) creates an empty string and takes an integer argument to set capacity of
the buffer.
StringBuffer append(int n)
test123
insert()
This method inserts one string into another. Here are few forms of insert() method.
StringBuffer insert(int index, String str)
test123
reverse()
This method reverses the characters within a StringBuffer object.
StringBuffer str = new StringBuffer("Hello");
str.reverse();
System.out.println(str);
olleH
replace()
This method replaces the string from specified start index to the end index.
<
Hello java
capacity()
This method returns the current capacity of StringBuffer object.
StringBuffer str = new StringBuffer();
System.out.println( str.capacity() );
16
Note: Empty constructor reserves space for 16 characters. Therefore the output is 16.
ensureCapacity()
This method is used to ensure minimum capacity of StringBuffer object.
If the argument of the ensureCapacity() method is less than the existing capacity, then there will
be no change in existing capacity.
If the argument of the ensureCapacity() method is greater than the existing capacity, then there
will be change in the current capacity using following rule: newCapacity = (oldCapacity*2) +
2.
StringBuffer str = new StringBuffer();
System.out.println( str.capacity()); //output: 16 (since empty constructor reserves space for 16
characters)
str.ensureCapacity(30); //greater than the existing capacity
System.out.println( str.capacity()); //output: 34 (by following the rule - (oldcapacity*2) + 2.) i.e
(16*2)+2 = 34.
StringBuilder class
StringBuilder is identical to StringBuffer except for one important difference that it is not
synchronized, which means it is not thread safe. Its because StringBuilder methods are not
synchronised.
StringBuilder Constructors
Example of StringBuilder
class Test {
public static void main(String args[])
{
StringBuilder str = new StringBuilder("study");
str.append( "tonight" );
System.out.println(str);
str.replace( 6, 13, "today");
System.out.println(str);
str.reverse();
System.out.println(str);
str.replace( 6, 13, "today");
}
}
studytonight
studyttoday
yadottyduts
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 exception means exceptional
condition, it is a problem that may arise during the execution of program. A bunch of things can
lead to exceptions, including programmer error, hardware failures, files that need to be opened
cannot be found, resource exhaustion etc.
Exception
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 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.
Exceptions of type Error are used by the Java run-time system to indicate errors having to
do with the run-time environment, itself. Stack overflow is an example of such an error.
Checked Exception
The exception that can be predicted by the programmer at the compile time.Example : File
that need to be opened is not found. These type of exceptions must be checked at compile
time.
Unchecked Exception
Unchecked exceptions are the class that extends RuntimeException. Unchecked exception
are ignored at compile time. Example : ArithmeticException, NullPointerException, Array
Index out of Bound 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 cannot be
handled in the code.
Uncaught Exceptions
When we don't handle the exceptions, 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
}
}
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.
1. try
2. catch
3. throw
4. throws
5. finally
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 transferred outside try block. Thus the line "This line
will not be executed" is never parsed by the compiler. The exception thrown is handled
in catch block. Once the exception is handled, the program control is continue with the next line
in the program i.e after catch block. Thus the line "After exception is handled" is printed.
divide by zero
Note: Although both ArrayIndexOutOfBoundsException and ArithmeticException occured, but
since first catch is of Arithmetic Exception, It will be caught there and program control will be
continued after the catch block.
Note: At a time, only one exception is processed and only one respective catch block is
executed.
Example for Unreachable Catch block
While using multiple catch statements, it is important to remember that sub classes of class
Exception inside catch must come before any of their super classes otherwise it will lead to
compile time error. This is because in Java, if any code is unreachable, then it gives 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");
}
}
}
Generic exception
divide by zero
array index out of bound exception
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 sub-classes of Exception class
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.
1. A resource is an object in a program that must be closed after the program has finished.
2. Any object that implements java.lang.AutoCloseable or java.io.Closeable can be passed as a
parameter to try statement.
3. All the resources declared in the try-with-resources statement will be closed automatically
when the try block exits. There is no need to close it explicitly.
4. We can write more than one resources in the try statement.
5. In a try-with-resources statement, any catch or finally block is run after the resources
declared have been closed.
throw Keyword
throw keyword is used to throw an exception explicitly. Only object of Throwable class or its
sub classes can be thrown. Program execution stops on encountering throw statement, and the
closest catch statement is checked for matching type of exception.
Syntax :
throw ThrowableInstance
new NullPointerException("test");
throws Keyword
Any method that is 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 are
to be handled. A method can do so by using the throws keyword.
Syntax :
type method_name(parameter_list) throws exception_list
{
//definition of method
}
throw keyword is declared inside a method throws keyword is used with method signature
body. (method declaration).
We cannot throw multiple exceptions using We can declare multiple exceptions (separated by
throw keyword. commas) using throws keyword.
finally clause
A finally keyword is used to create a block of code that follows a try block. A finally block of
code is always executed whether an exception has occurred or not. Using a finally block, it 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.
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.");
}
}
}
Out of try
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.
class Test
{
static void sum(int a,int b) throws MyException
{
if(a<0)
{
throw new MyException(a); //calling constructor of user-defined exception class
}
else
{
System.out.println(a+b);
}
}
Points to Remember
child class
Because ArrayIndexOutOfBoundsException is an unchecked exception hence,
overrided show()method can throw it.
child class
child class
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 new methods were added to Throwable class to support chained
exception.
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);
}
}
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). You can think of a lightweight process as a
virtual CPU that executes code or system calls. You usually do not need to concern yourself with
lightweight processes to program with threads. Multithreaded programs contain two or more
threads that can run concurrently and each thread defines a separate path of execution. 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.
class MainThread
{
public static void main(String[] args)
{
Thread t=Thread.currentThread();
t.setName("MainThread");
System.out.println("Name of thread is "+t);
}
}
Name of thread is Thread[MainThread,5,main]
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. Runnable : After invocation of start() method on new thread, the thread becomes runnable.
3. Running : A thread is in running state if the thread scheduler has selected it.
4. Waiting : A thread is in waiting state if it waits 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 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 1 to 10,
MIN-PRIORITY (a constant of 1)
MAX-PRIORITY (a constant of 10)
By default every thread is given a NORM-PRIORITY(5). The main thread always have NORM-
PRIORITY.
Note: Thread priorities cannot guarantee that a higher priority thread will always be executed
first than the lower priority thread. The selection of the threads for execution depends upon the
thread scheduler which is platform dependent.
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.
1. Thread ( )
2. Thread ( String str )
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
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.
Creating a thread
Java defines two ways by which a thread can be created.
run() method introduces a concurrent thread into your program. This thread will end when
run() method terminates.
You must specify the code that your thread will execute inside run() method.
run() method can call other methods, can use other classes and declare variables just like any
other normal method.
class MyThreadDemo
{
public static void main( String args[] )
{
MyThread mt = new MyThread();
Thread t = new Thread(mt);
t.start();
}
}
classMyThreadDemo
{
public static void main( String args[] )
{
MyThread mt = new MyThread();
mt.start();
}
}
Joining threads
Sometimes one thread needs to know when other thread is terminating. In
java, isAlive() and join()are two different methods that are used to check whether a thread has
finished its execution or not.
The isAlive() method returns true if the thread upon which it is called is still running otherwise
it returns 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 specified 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
As we have seen in the Introduction to MultiThreading, the main thread must always be the last
thread to finish its execution. Therefore, we can use Thread join() method to ensure that all the
threads created by the program has been terminated before the execution of the main thread.
r1
true
true
r1
r2
r2
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 ms. At the same time Thread t2 will start its process and
print "r1" on console and then go into sleep for 500 ms. 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
try{
t1.join(); //Waiting for t1 to finish
}catch(InterruptedException ie){}
t2.start();
}
}
r1
r2
r1
r2
In this above program join() method on thread t1 ensures that t1 finishes it process before thread
t2 starts.
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.
General Syntax :
synchronized (object)
{
//statement to be synchronized
}
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.
Synchronized Keyword
To synchronize above program, we must synchronize 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)
Interthread Communication
Java provide benefits of avoiding thread pooling using inter-thread communication.
The wait(), notify(), and notifyAll() methods of Object class are used for this purpose. These
method are implemented as final methods in Object, so that all classes have them. All the 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() sleep()
gets awake when notify() or notifyAll() does not get awake when notify() or notifyAll()
method is called. method is called
wait() is generaly used on condition sleep() method is simply used to put your thread on
sleep.
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
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
class Pen{}
class 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();
}
}
Thread1 is holding Pen
Thread2 is holding Paper
For more details, visit the following: Deadlocks
Enumerations
Enumerations was added to Java language in JDK5. 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
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.
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.
2. enum Subject //Enumeration defined
3. {
4. Java, Cpp, C, Dbms
}
5. Identifiers Java, Cpp, C and Dbms are called enumeration constants. These are public,
static and final by default.
6. Variables of Enumeration can be defined directly without any new keyword.
Subject sub;
7. Variables of Enumeration type can have only enumeration constants as value. We define an
enum variable as enum_variable = enum_type.enum_constant;
sub = Subject.Java;
8. Two enumeration constants can be compared for equality by using the = = relational
operator.
Example:
if(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 is an enumeration variable of type WeekDays
wk = WeekDays.sun; //wk can be assigned only the constants defined under enum type
Weekdays
System.out.println("Today is "+wk);
}
}
Today is sun
I AM paninos
enum Restaurants {
dominos, kfc, pizzahut, paninos, burgerking
}
class Test {
public static void main(String args[])
{
Restaurants r;
System.out.println("All constants of enum type Restaurants are:");
Restaurants rArray[] = Restaurants.values(); //returns an array of constants of type Restaurants
for(Restaurants a : rArray) //using foreach loop
System.out.println(a);
r = Restaurants.valueOf("dominos");
System.out.println("I AM " + r);
}
}
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.
class EnumDemo
{
public static void main( String args[] )
{
Student S;
System.out.println("Age of Viraaj is " +Student.Viraaj.getage()+ "years");
}
}
type wrapper
Java uses primitive data types such as int, double, float etc. to hold the basic data types for the
sake of performance. Despite the performance benefits offered by the primitive data types, there
are situations when you will need an object representation of the primitive data type. For
example, many data structures in Java operate on objects. So you cannot use primitive data types
with those data structures. To handle such type of situations, Java provides type
Wrappers which provide classes that encapsulate a primitive type within an object.
Above mentioned Classes comes under Numeric type wrapper. These classes encapsulate
byte, short, int, long, float, double primitive type.
Character cob = 'a'; //Auto-boxing of char i.e converting primitive data type char to a Wrapper
class Character
char ch = cob; //Auto-unboxing of Character i.e converting Wrapper class Character to a
primitive type char
System.out.println(cob+" "+ch);
}
}
100 100
aa
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.
4. Auto-unboxing also allows you to mix different types of numeric objects in an expression.
When the values are unboxed, the standard type conversions can be applied.
Example:
class Test {
public static void main(String args[]) {
Integer i = 35;
Double d = 33.3;
d = d + i;
System.out.println("Value of d is " + d);
}
}
Value of d is 68.3
Note: When the statement d = d + i; was executed, i was auto-unboxed into int, d was auto-
unboxed into double, addition was performed and then finally, auto-boxing of d was done into
Double type Wrapper class.
IO Stream
Java performs I/O through Streams. 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.
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.
These two abstract classes have several concrete classes that handle various devices such as disk
files, network connection etc.
These classes define several key methods. Two most important are
These two abstract classes have several concrete classes that handle unicode character.
Some important Charcter stream classes.
Reading Strings
To read string we have to use readLine() function with BufferedReader class's object.
String readLine() throws IOException
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);
}
}
java.io.serializable
java.io.Externalizable
ObjectInputStream
and ObjectOutputStream etc.
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
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.
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)
{
e.printStackTrace();
}
}
}
Object of Studentinfo class is serialized using writeObject() method and written
to student.ser file.
Deserialization of Object
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);
}
}
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;
}
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.
CLASSES
CacheRequest CookieHandler
CookieManager Datagrampacket
Socket DatagramSocket
Proxy URL
URLConnection
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.
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
Generics
Generics was first introduced in Java5. Now it is one of the most profound feature of java
programming language. Generic programming enables the programmer to create
classes,interfaces and methods in which type of data is specified as a parameter. It provides a
facility to write an algorithm independent of any specific type of data. Generics also provide type
safety. Type safety means ensuring that an operation is being performed on the right type of data
before executing that operation.
Using Generics, it has become possible to create a single class ,interface or method that
automatically works with all types of data(Integer, String, Float etc). It has expanded the ability
to reuse the code safely and easily.
Before Generics was introduced, generalized classes,interfaces or methods were created using
references of type Object because Object is the super class of all classes in Java, but this way of
programming did not ensure type safety.
Syntax for creating an object of a generic type
Class_name <data type> reference_name = new Class_name<data type> ();
OR
Class_name <data type> reference_name = new Class_name<>();
This is also known as Diamond Notation of creating an object of Generic type.
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.println(x);
Gen < String> sob = new Gen<>("Hello"); //instance of String type Gen Class.
String str = sob.getOb();
System.out.println(str);
}
}
100
Hello
In the above program, we first passed an Integer type parameter to the Generic class. Then, we
passed a String type parameter to the same Generic class. Hence, we reused the same class for
two different data types. Thus, Generics helps in code reusability with ease.
class Test
{
public static void main (String[] args)
{
Gen < String,Integer> obj = new Gen<>("StudyTonight",1);
String s = obj.getName();
System.out.println(s);
Integer i = obj.getValue();
System.out.println(i);
}
}
StudyTonight
1
Note: Since there are two parameters in Generic class - T1 and T2, therefore, while creating an
instance of this Generic class, we need to mention two data types that needs to be passed as
parameter to this class.
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.
The syntax for a generic method includes a type-parameter inside angle brackets, and should
appear before the method's return type.
<type-parameter> return_type method_name (parameters) {...}
Example of Generic method
class GenTest
{
static <b>< V, T></b> void display (V v, T t)
{
System.out.println(v.getClass().getName()+" = " +v);
System.out.println(t.getClass().getName()+" = " +t);
}
public static void main(String[] args)
{
display(88,"This is string");
}
}
java lang.Integer = 88
java lang.String = This is string
Generic Constructors
It is possible to create a generic constructor even if the class is not generic.
Example of Generic Constructor
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();
}
}
100.0
121.5
Generic Interface
Like classes and methods, you can also create generic interfaces.
interface MyInterface< T >
{ .. }
Collection Framework
Collections framework was not a 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 groups of objects.
Framework in java means hierarchy of classes and interfaces.Collections framework is contained
in java.util package. It provides many important classes and interfaces to collect and organize
group of alike objects.
Important Interfaces of Collection API
Interface Description
Collection Enables you to work with groups of object; it is at the top of Collection hierarchy
Queue Extends Collection to handle special kind of list in which element are removed only
from the head.
Set Extends Collection to handle sets, which must contain unique element.
1. It is at the top of collection heirarchy and must be implemented by any class that defines a
collection. Its general declaration is,
Methods Description
boolean add( E obj ) Used to add objects to a collection. Returns true if obj was
added to the collection. Returns false if obj is already a
member of the collection, or if the collection does not allow
duplicates.
boolean addAll( Collection C ) Add all elements of collection C to the invoking collection.
Returns true if the element were added. Otherwise, returns
false.
boolean remove( Object obj ) To remove an object from collection. Returns true if the
element was removed. Otherwise, returns false.
boolean removeAll( Collection C ) Removes all element of collection C from the invoking
collection. Returns true if the collection's elements were
removed. Otherwise, returns false.
boolean retainAll(Collection c) Deletes all the elements of invoking collection except the
specified collection.
boolean equals(Object obj) Returns true if the invoking collection and obj are equal.
Otherwise, returns false.
Object[] toArray(Object array[]) Returns an array containing only those collection elements
whose type matches of the specified array.
1. It extends the Collection Interface, and defines storage as sequence of elements. Following is
its general declaration,
Object get( int index ) Returns object stored at the specified index
Object set( int index, E obj) Stores object at the specified index in the calling collection
int indexOf( Object obj ) Returns index of first occurrence of obj in the collection
int lastIndexOf( Object obj ) Returns index of last occurrence of obj in the collection
List subList( int start, int end ) Returns a list containing elements between start and end index in
the collection
1. This interface defines a Set. It extends Collection interface and doesn't allow insertion of
duplicate elements. It's general declaration is,
1. It extends collection interface and defines behaviour of queue, that is first-in, first-out. It's
general declaration is,
2. There are couple of new and interesting methods added by this interface. Some of them are
mentioned in below table.
Methods Description
Object poll() removes element at the head of the queue and returns null if queue
is empty
Object peek() returns the element at the head of the queue without removing it.
Returns null if queue is empty
1. It extends Queue interface and implements behaviour of a double-ended queue. Its general
declaration is,
interface Dequeue < E >
2. Since it implements Queue interface, it has the same methods as mentioned there.
3. Double ended queues can function as simple queues as well as like standard Stacks.
1. To use any Collection class in your program, you need to import it in your program. It is
contained inside java.util package.
2. Whenever you print any Collection class, it gets printed inside the square brackets [].
ArrayList class
Simple arrays have fixed size i.e it can store fixed number of elements. But, sometimes you may
not know beforehand about the number of elements that you are going to store in your array. In
such situations, We can use an ArrayList, which is an array whose size can increase or decrease
dynamically.
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.
3. ArrayList() //It creates an empty ArrayList
4.
5. ArrayList( Collection C ) //It creates an ArrayList that is initialized with elements of the Col
lection C
6.
7. ArrayList( int capacity ) //It creates an ArrayList that has the specified initial capacity
8. ArrayLists are created with an initial size. When this size is exceeded, the size of the
ArrayList increases automatically.
9. It can contain Duplicate elements and it also maintains the insertion order.
10. Manipulation is slow because a lot of shifting needs to be occurred if any element is removed
from the array list.
11. ArrayLists are not synchronized.
12. ArrayList allows random access because it works on the index basis.
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);
}
}
[ab,bc,cd]
LinkedList class
6. It can be used as List, stack or Queue as it implements all the related interfaces.
7. They are dynamic in nature i.e it allocates memory when required. Therefore insertion and
deletion operations can be easily implemented.
8. It can contain duplicate elements and it is not synchronized.
9. Reverse Traversing is difficult in linked list.
10. In LinkedList, manipulation is fast because no shifting needs to be occurred.
[A, a, b,c, z]
HashSet class
1. HashSet extends AbstractSet class and implements the Set interface.
2. HashSet has three constructors.
HashSet( Collection C ) //This creates a HashSet that is initialized with the elements of the
Collection C
HashSet( int capacity ) //This creates a HashSet that has the specified initial capacity
3. It creates a collection that uses hash table for storage. A hash table stores information by
using a mechanism called hashing.
4. In hashing, the informational content of a key is used to determine a unique value, called its
hash code. The hash code is then used as the index at which the data associated with the key
is stored.
5. HashSet does not maintain any order of elements.
6. HashSet contains only unique elements.
[D, E, F, A, B, C]
LinkedHashSet Class
TreeSet Class
TreeSet() //It creates an empty tree set that will be sorted in an ascending order according t
o the
natural order of the tree set
TreeSet( Collection C ) //It creates a new tree set that contains the elements of the Collectio
nC
TreeSet( Comparator comp ) //It creates an empty tree set that will be sorted according to gi
ven Comparator
TreeSet( SortedSet ss ) //It creates a TreeSet that contains the elements of given SortedSet
Iterator itr=al.iterator();
while(itr.hasNext()){
System.out.println(itr.next());
}
}
}
Ajay
Ravi
Vijay
PriorityQueue Class
class StudyTonight
{
public static void main(String args[])
{
PriorityQueue<String> queue=new PriorityQueue<String>();
queue.add("WE");
queue.add("LOVE");
queue.add("STUDY");
queue.add("TONIGHT");
System.out.println("At head of the queue:"+queue.element());
System.out.println("At head of the queue:"+queue.peek());
System.out.println("Iterating the queue elements:");
Iterator itr=queue.iterator();
while(itr.hasNext()){
System.out.println(itr.next());
}
queue.remove();
queue.poll();
System.out.println("After removing two elements:");
Iterator itr2=queue.iterator();
while(itr2.hasNext()){
System.out.println(itr2.next());
}
}
}
Accessing a Collection
To access, modify or remove any element from any collection we need to first find the element,
for which we have to cycle through the elements of the collection. There are three possible ways
to cycle through the elements of any collection.
1. Obtain an iterator to the start of the collection by calling the collection's iterator() method.
2. Set up a loop that makes a call to hasNext() method. Make the loop iterate as long
as hasNext()method returns true.
3. Within the loop, obtain each element by calling next() method.
Method Description
boolean hasNext() Returns true if there are more elements in the collection. Otherwise, returns
false.
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()+" ");
}
}
}
ab bc cd de
Method Description
void add(E obj) Inserts obj into the list in front of the element that will be returned by the
next call to next() method.
boolean hasNext() Returns true if there is a next element. Otherwise, returns false.
boolean hasPrevious() Returns true if there is a previous element. Otherwise, returns false.
int previousIndex() Returns the index of the previous element. If there is not a previous element,
returns -1.
void remove() Removes the current element from the list. An IllegalStateException is
thrown if remove() method is called before next() or previous() method is
invoked.
void set(E obj) Assigns obj to the current element. This is the element last returned by a call
to either next() or previous() method.
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.previous()+" ");
}
}
}
ab bc cd de
de cd bc ab
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 Description
Map.Entry Describe an element in key and value pair in a map. Entry is sub
interface of 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
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));
c 300
a 100
d 400
b 200
TreeMap class
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));
a 100
b 200
c 300
d 400
LinkedHashMap class
12. 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
EnumMap class
Comparator Interface
In Java, Comparator interface is used to order(sort) the objects in the collection in your own way.
It gives you the ability to decide how elements will be sorted and stored within collection and
map.
Comparator Interface defines compare() method. This method has two parameters. This method
compares the two objects passed in the parameter. It returns 0 if two objects are equal. It returns
a positive value if object1 is greater than object2. Otherwise a negative value is returned. The
method can throw a ClassCastException if the type of object are not compatible for
comparison.
1. If you want to sort the elements of a collection, you need to implement Comparator interface.
2. If you do not specify the type of the object in your Comparator interface, then, by default, it
assumes that you are going to sort the objects of type Object. Thus, when you override the
compare() method ,you will need to specify the type of the parameter as Object only.
3. If you want to sort the user-defined type elements, then while implementing the Comparator
interface, you need to specify the user-defined type generically. If you do not specify the
user-defined type while implementing the interface,then by default, it assumes Object type
and you will not be able to compare the user-defined type elements in the collection
For Example:
If you want to sort the elements according to roll number, defined inside the class Student, then
while implementing the Comparator interface, you need to mention it generically as follows:
class MyComparator implements Comparator<Student>{}
If you write only,
class MyComparator implements Comparator {}
Then it assumes, by default, data type of the compare() method's parameter to be Object, and
hence you will not be able to compare the Student type(user-defined type) objects.
Example
Student class
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 sorted in ascending order of their roll.
class MyComparator implements Comparator<Student>
{
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
{
Note:
When we are sorting elements in a collection using Comparator interface, we need to pass
the class object that implements Comparator interface.
To sort a TreeSet collection, this object needs to be passed in the constructor of TreeSet.
If any other collection, like ArrayList,was used, then we need to call sort method of
Collections class and pass the name of the collection and this object as a parameter.
For example, If the above program used ArrayList collection, the public class test would be
as follows:
Legacy Classes
Early version of java did not include the Collections framework. It only defined several classes
and interfaces that provide methods for storing objects. When Collections 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 classes and interface were redesign by JDK
5 to support Generics. In general, the legacy classes are supported because there is still some
code that uses them.
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 synchronized
Enumeration interface
boolean hasMoreElements() //It returns true while there are still more elements to extract,
and returns false when all the elements have been enumerated.
Object nextElement() //It returns the next object in the enumeration i.e. each call to
nextElement() method
obtains the next object in the enumeration. It throws NoSuchElementException when the
enumeration is complete.
Vector class
Method Description
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())
{
System.out.println(en.nextElement());
}
}
10
20
30
40
50
60
Hashtable class
1. Like HashMap, Hashtable also stores key/value pair. 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
4. Hashtable() //This is the default constructor. The default size is 11.
5.
6. Hashtable(int size) //This creates a hash table that has an initial size specified by size.
7.
8. Hashtable(int size, float fillratio) //This creates a hash table that has an initial size specified
by size
9. and a fill ratio specified by fillRatio. This ratio must be between 0.0 and 1.0, and it
determines how full
10. the hash table can be before it is resized upward. Specifically, when the number of elements
is greater
11. than the capacity of the hash table multiplied by its fill ratio, the hash table is expanded.
12. If you do not specify a fill ratio, then 0.75 is used.
13.
14. Hashtable(Map< ? extends K, ? extends V> m) //This creates a hash table that is initialized
with the
15. elements in m. The capacity of the hash table is set to twice the number of elements in m.
The default load factor of 0.75 is used.
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());
}
}
}
a 100
b 200
c 300
d 400
Hashtable HashMap
Neither key nor values can be null Both key and values can be null
Order of table remain constant over time. does not guarantee that order of map will remain
constant over time.
Properties class
6. 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.
7. In Properties class, you can specify a default property that will be returned if no value is
associated with a certain key.
Stack class
4. If you want to put an object on the top of the stack, call push() method. If you want to
remove and return the top element, call pop() method. An EmptyStackException is thrown if
you call pop() method when the invoking stack is empty.
You can use peek() method to return, but not remove, the top object. The empty() method returns
true if nothing is on the stack. The search() method determines whether an object exists on the
stack and returns the number of pops that are required to bring it to the top of the stack.
Example of Stack
import java.util.*;
class StackDemo {
public static void main(String args[]) {
Stack st = new Stack();
st.push(11);
st.push(22);
st.push(33);
st.push(44);
st.push(55);
Enumeration e1 = st.elements();
while(e1.hasMoreElements())
System.out.print(e1.nextElement()+" ");
st.pop();
st.pop();
Enumeration e2 = st.elements();
while(e2.hasMoreElements())
System.out.print(e2.nextElement()+" ");
}
}
11 22 33 44 55
After popping out two elements
11 22 33
Dictionary class
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.
After a user receives an applet, the applet can produce a graphical user interface. It has
limited access to resources so that it can run complex computations without introducing the
risk of viruses or breaching data integrity.
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
{
public void paint(Graphics g)
{
g.drawString("A simple Applet", 20, 20);
}
}
Every Applet application must import two packages - java.awt and java.applet.
java.awt.* imports the Abstract Window Toolkit (AWT) classes. Applets interact with the user
(either directly or indirectly) through the AWT. The AWT contains support for a window-based,
graphical user interface. java.applet.* imports the applet package, which contains the class
Applet. Every applet that you create must be a subclass of Applet class.
The class in the program must be declared as public, because it will be accessed by code that is
outside the program.Every Applet application must declare a paint() method. This method is
defined by AWT class and must be overridden by the applet. The paint() method is called each
time when an applet needs 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
Applet class
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);
}
}
For executing an Applet in an web browser, create short HTML file in the same directory.
Inside bodytag 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
AWT Hierarchy
Component class
Component class is at the top of AWT hierarchy. Component is an abstract class that
encapsulates all the attributes of visual component. A component object is responsible for
remembering the current foreground and background colors and the currently selected text font.
Container
Container is a component in AWT that contains another component like button, text field, tables
etc. Container is a subclass of component class. Container class keeps track of components that
are added to another component.
Panel
Panel class is a concrete subclass of Container. Panel does not contain title bar, menu bar or
border. It is container that is used for holding components.
Window class
Window class creates a top level window. Window does not have borders and menubar.
Frame
Frame is a subclass 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
Creating a Frame
There are two ways to create a Frame. They are,
import java.awt.*;
import java.awt.event.*;
1. While creating a frame (either by instantiating or extending Frame class), Following two
attributes are must for visibility of the frame:
o setSize(int width, int height);
o setVisible(true);
2. When you create other components like Buttons, TextFields, etc. Then you need to add it to
the frame by using the method - add(Component's Object);
3. You can add the following method also for resizing the frame - setResizable(true);
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.
Swing classes are defined in javax.swing package and its sub-packages.
Main Features of Swing Toolkit
1. Platform Independent
2. Customizable
3. Extensible
4. Configurable
5. Lightweight
6. Rich Controls
7. Pluggable Look and Feel
Features of JFC
Points To Remember
1. Import the javax.swing and java.awt package to use the classes and methods of Swing.
2. While creating a frame (either by instantiating or extending Frame class), following two
attributes are must for visibility of the frame:
3. setSize(int width, int height);
setVisible(true);
4. When you create objects of other components like Buttons, TextFields, etc. Then you need to
add it to the frame by using the method - add(Component's Object);
5. You can add the following method also for resizing the frame - setResizable(true);
JButton
JButton class provides functionality of a button. JButton class has three constuctors,
JButton(Icon ic)
JButton(String str)
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.
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[])
JFrame frame;
JPanel panel;
JButton b1,b2,b3,b4,b5;
StColor(){
panel = new JPanel(); //Creating a panel which is a container and will hold all the buttons
panel.setSize(100, 50);
}
//The below method is called whenever a button is clicked
@Override
public void actionPerformed(ActionEvent e) {
class Test {
public static void main(String[] args) {
StColor o = new StColor();
}
}
Ouput:
Reflection API
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.
For example, using reflection at the runtime you can determine what method, field, constructor
or modifers a class supports.
What is reflect package ?
java.lang.reflect package encapsulates several important interfaces and classes. These classes and
interface define methods which are used for reflection.
Apart from these classes java.lang.Class is another very important class used in Reflection API.
Uses of Reflection
Developing IDE
Debugging and Test tools
Loading drivers and providing dynamic information
Disadvantages of Reflection
Low performance
Security risk
Violation of Oops concept
java.lang.Class class
Class 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.
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)
Student
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();}
}
}
public Student()
public Student()
Student(java.lang.String)
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();}
}
}
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();}
}
}
RMI
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.
Skeleton object resides on server program. It is responsible for passing request from Stub to
remote object.
}catch(Exception e){System.out.println(e);}
}
}
javac *.java
Start RMI registry
start rmiregistry
Run Server file
java AddServer
Run Client file in another command prompt abd pass local host port number at run time