Java & DS UNIT 3 Notes
Java & DS UNIT 3 Notes
Java & DS UNIT 3 Notes
3.1.1 Types
In java, the packages have divided into two types.
■ Built-in Packages
■ User-defined Packages
3.1.1.1 Built-in Packages
The built-in packages are the packages from java API. The Java API is a library of pre-
defined classes, interfaces, and sub-packages. The built-in packages were included in the
JDK.There are many built-in packages in java, few of them are as java, lang, io, util, awt,
javax, swing, net, sql, etc.
These packages consist of a large number of classes which are a part of Java API.Some of the
commonly used built-in packages are:
1) java.lang: Contains language support classes(e.g classed which defines primitive data
types, math operations). This package is automatically imported.
2) java.io: Contains classed for supporting input / output operations.
3) java.util: Contains utility classes which implement data structures like Linked List,
Dictionary and support ; for Date / Time operations.
4) java.applet: Contains classes for creating Applets.
5) java.awt: Contain classes for implementing the components for graphical user interfaces (like button
1
PERI COLLEGE OF ARTS AND SCIENCE
SE23A| JAVA AND DATA STRUCTURES
, ;menus etc).
6) java.net: Contain classes for supporting networking operation.
■ The user-defined packages are the packages created by the user. User is free to create
their own packages.
3.1.1.3 Naming Convention
While choosing a package name you need to keep the following points in mind.
■ The name of the package should be in small letters.
■ It is suggested to start the name of the package with the top level domain level followed
by sub domains, ex: com.example.tutorialspoint
3.1.2 Defining and Creating a Package in java
step1: simply include a package command has the first statement in java source file.
Any class you declare with in that file will belong to the specified package.
syntax: package packagename;
Eg: package mypack;
step 2: next define the class that is to be put in the package and declare it as public
step 3: now store the classname.java file in the directory having name same as package name.
step 4: file is to be compiled, which creates .class file in the directory
java also supports the package hierarchy , which allows to group related classes
into a package and then group related packages into a larger package.
We can achieve this by specifying multiple names in a package statement,
separated by dot . i.e., package firstpackage.secondpackage;
2
PERI COLLEGE OF ARTS AND SCIENCE
SE23A| JAVA AND DATA STRUCTURES
A java system package can be accessed either using a fully qualified classname or
using import statement.
We generally use import statement.
syntax:
import pack1[.pack2][.pack3].classname;
or
package myPackage;
import java.util.Scanner ;
public class ImportingExample
{
public static void main(String[] args)
{
Scanner read = new Scanner(System.in);
int i = read.nextInt();
System.out.println("You have entered a number " + i);
}
}
interface Animal {
public void eat();
public void travel();
}
4
PERI COLLEGE OF ARTS AND SCIENCE
SE23A| JAVA AND DATA STRUCTURES
Now, let us implement the above interface in the same package animals −
package animals;
/* File name : MammalInt.java */
3.2 INTERFACE
An interface is a special case of abstract class, which contains all the abstract methods (methods
without their implementation).
• An interface specifies what a class must do, but not how to do.
• Using the keyword interface, we can fully abstract a class interface from its implementation.
• Interfaces are syntactically similar to classes, but they lack instance variable, and their
methods are declared without anybody.
• Once it is defined, any number of classes can implement an interface. Also, once
class can implement any number of interfaces.
3.2.1 Initializing interface
• An interface is defined much like a class.
• This is the general form of an interface:
access interface interface_name
{
type final_varname1=value;
type final_varname2=value;
. . . .
returntype method-name1(parameter_list);
returntype method-name2(parameter_list);
. . . .
5
PERI COLLEGE OF ARTS AND SCIENCE
SE23A| JAVA AND DATA STRUCTURES
Eg:
Interface
{
int pcode=999; // final variable
String pname=”HardDisk”; // final variable
void show(); // abstract method
}
Example:
interface ItemConstants
{
int code=1001;
String name=”Fan”;
}
interface Item extends ItemConstants
{
void display();
}
class display implements Item
{
public void display()
{
System.out.println(code+”:”+name);
}
}
6
PERI COLLEGE OF ARTS AND SCIENCE
SE23A| JAVA AND DATA STRUCTURES
Syntax:
access class classname [extends superclass][implements interface
[,interface…]]
{
class body
}
Example:
interface product
{
int pcode=999;
String pname=”HardDisk”;
abstract void showProduct();
}
class ProductDesc implements Product
{
public void showProduct()
{
System.out.println(“Pcode=”+pcode);
System.out.println(“PName=”+pname);
}
}
class DemoInterface
{
public static void main(String ar[])
{
ProductDesc ob=new
ProductDesc();
ob.showProduct();
}
}
Variables in interface:
• Interfaces can also be used to declare a set of constants that can be used in different classes.
• The constant values will be available to any class that implements the interface.
• The values can be used in any method, as part of any variable declaration, or anywhere
where we can use a final value.
Example:
interface A
{
int m=10, n=50;
}
class B implements A
{
void display()
{
System.out.println(“m=”+m+” , n=”+n);
}
}
7
PERI COLLEGE OF ARTS AND SCIENCE
SE23A| JAVA AND DATA STRUCTURES
The exception handling in java is one of the powerful mechanism to handle the
runtime errors so that normal flow of the application can be maintained.
The core advantage of exception handling is to maintain the normal flow of the
application. Exception normally disrupts the normal flow of the application that is why
we use exception handling.
There are mainly two types of exceptions: checked and unchecked where
error is considered as unchecked exception. The sun microsystem says there are
three types of exceptions:
1. CheckedException
2. UncheckedException
3. Error
Unchecked Exception: The classes that extend RuntimeException are known as unchecked
exceptions e.g. ArithmeticException, NullPointerException,
ArrayIndexOutOfBoundsException etc. Unchecked exceptions are not checked at compile-
time rather they are checked at runtime.
Error
Error is irrecoverable e.g. OutOfMemoryError, VirtualMachineError,
AssertionErroretc.
3.3.4 Java try block
Java try block is used to enclose the code that might throw an exception. It must be
used within the method.
8
PERI COLLEGE OF ARTS AND SCIENCE
SE23A| JAVA AND DATA STRUCTURES
try
{
//code that may throw exception
}
catch(Exception_class_Name ref){ }
Syntax of try- finallyblock
try{
//code that may throwexception
}
finally{}
3.3.4.1 Java catch block
Java catch block is used to handle the Exception. It must be used after
the try block only. You can use multiple catch block with a single try.
Problem without exception handling
Output:
Exception in thread main java.lang.ArithmeticException:/ byzero
3.3.5 Solution by exception handling
int data=50/0;
}
catch(ArithmeticException e)
{System.out.println(e);}
System.out.println("rest of the code...");
} }
Output:
Exception in thread main java.lang.ArithmeticException:/ by zero
rest of the code...
public class
TestMultipleCatchBlock{ pu
blic static void
main(Stringargs[]){ try{
int a[]=new int[5];
a[5]=30/0;
}
catch(ArithmeticException e)
{ System.out.println("task1 iscompleted"); }
catch(ArrayIndexOutOfBoundsException e)
{ System.out.println("task 2 completed"); }
catch(Exception e)
{ System.out.println("common taskcompleted") ;
}
System.out.println("rest of the code...");
}}
class Excep6{
public static void main(String args[])
{
try{
10
PERI COLLEGE OF ARTS AND SCIENCE
SE23A| JAVA AND DATA STRUCTURES
try{
System.out.println("going to divide");
int b =39/0;
}
catch(ArithmeticException e)
{System.out.println(e);}
try{
t a[]=new int[5];
a[5]=4;
}
catch(ArrayIndexOutOfBoundsException e)
{ System.out.println(e);}
System.out.println("other statement);
}
catch(Exception e)
{ System.out.println("handeled"); }
System.out.println("normal flow..");
}
3.3.8 Java throw keyword
{
validate(13);
System.out.println("rest of the code...");
} }
Output:
Exception in thread main java.lang.ArithmeticException:notvalid
3.3.9 Java throws keyword
import java.io.IOException;
class Testthrows1{
void m()throws IOException{
throw new IOException("device error");//checked exception
}
void n()throws IOException
{ m(); }
void p()
{
try{ n(); }
catch(Exception e)
{ System.out.println("exception handled");}
}
public static void main(String args[])
{
Testthrows1 obj=new Testthrows1();
obj.p();
System.out.println("normal flow...");
} }
12
PERI COLLEGE OF ARTS AND SCIENCE
SE23A| JAVA AND DATA STRUCTURES
New
When a thread object is created using new, then the thread is said to be in the New state.
This state is also known as Born state.
Example
Runnable / Ready
13
PERI COLLEGE OF ARTS AND SCIENCE
SE23A| JAVA AND DATA STRUCTURES
When a thread calls start( ) method, then the thread is said to be in the Runnable state.
This state is also known as a Ready state.
Example
t1.start( );
Running
When a thread calls run( ) method, then the thread is said to be Running. The run( )
method of a thread called automatically by the start( ) method.
Blocked / Waiting
A thread in the Running state may move into the blocked state due to various reasons like
sleep( ) method called, wait( ) method called, suspend( ) method called, and join( ) method
called, etc.
When a thread is in the blocked or waiting state, it may move to Runnable state due to reasons
like sleep time completed, waiting time completed, notify( ) or notifyAll( ) method called, resume(
) method called, etc.
Example
Thread.sleep(1000);
wait(1000);
wait();
suspend();
notify();
notifyAll();
resume();
Dead / Terminated
A thread in the Running state may move into the dead state due to either its execution
completed or the stop( ) method called. The dead state is also known as the terminated state.
3.4.2 Creating a Thread
In java, a thread is a lightweight process. Every java program executes by a thread called
the main thread. When a java program gets executed, the main thread created automatically. All
other threads called from the main thread.
The java programming language provides two methods to create threads, and they are listed
below.
14
PERI COLLEGE OF ARTS AND SCIENCE
SE23A| JAVA AND DATA STRUCTURES
Step-1: Create a class as a child of Thread class. That means, create a class that extends
Thread class.
Step-2: Override the run( ) method with the code that is to be executed by the thread.
The run( ) method must be public while overriding.
Step-3: Create the object of the newly created class in the main( ) method.
Step-4: Call the start( ) method on the object created in the above step.
Example
class SampleThread extends Thread{
public void run() {
System.out.println("Thread is under Running...");
for(int i= 1; i<=10; i++) {
System.out.println("i = " + i);
}
}
}
public class My_Thread_Test {
public static void main(String[] args)
{ SampleThread t1 = new SampleThread();
System.out.println("Thread about to start...");
t1.start();
}}
3.4.2.2 Runnable Interface:
The java contains a built-in interface Runnable inside the java.lang package. The
Runnable interface implemented by the Thread class that contains all the methods that are related
to the threads.
To create a thread using Runnable interface, follow the step given below.
15
PERI COLLEGE OF ARTS AND SCIENCE
SE23A| JAVA AND DATA STRUCTURES
Thread()
Thread(String name)
Thread(Runnable r)
Thread(Runnable r,String name)
16
PERI COLLEGE OF ARTS AND SCIENCE
SE23A| JAVA AND DATA STRUCTURES
The Thread class also contains three constants that are used to set the thread priority, and they are
listed below.
Thread.currentThread().getName());
}}
public class My_Thread_Test {
public static void main(String[] args) {
SampleThread threadObject1 = new SampleThread(); SampleThread
threadObject2 = new SampleThread();
threadObject1.setName("first");
threadObject2.setName("second"); threadObject1.setPriority(4);
threadObject2.setPriority(Thread.MAX_PRIORITY);
threadObject1.start();
threadObject2.start();
}}
3.4.3.3 Java Thread Synchronization
The java programming language supports multithreading. The problem of shared
resources occurs when two or more threads get execute at the same time. In such a situation, we
need some way to ensure that the shared resource will be accessed by only one thread at a time,
and this is performed by using the concept called synchronization.
In java, the synchronization is achieved using the following concepts.
Mutual Exclusion
Inter thread communication
In this tutorial, we discuss mutual exclusion only, and the inter thread communication will be
discussed in the next tutorial.
Mutual Exclusion
Using the mutual exclusion process, we keep threads from interfering with one another while
they accessing the shared resource. In java, mutual exclusion is achieved using the following
concepts.
Synchronized method
Synchronized block
Synchronized method
When a method created using a synchronized keyword, it allows only one object to access it at a
time. When an object calls a synchronized method, it put a lock on that method so that other
objects or thread that are trying to call the same method must wait, until the lock is released.
Once the lock is released on the shared resource, one of the threads among the waiting threads
will be allocated to the shared resource.
In the below image, initially the thread-1 is accessing the synchronized method and other
18
PERI COLLEGE OF ARTS AND SCIENCE
SE23A| JAVA AND DATA STRUCTURES
threads (thread-2, thread-3, and thread-4) are waiting for the resource (synchronized method).
When thread-1 completes it task, then one of the threads that are waiting is allocated with the
synchronized method, in the above it is thread-3.
EXAMPLE:
class Table{
synchronized void printTable(int n)
{
for(int i = 1; i <= 10; i++)
System.out.println(n + " * " + i + " = " + i*n);
}
}
class MyThread_1 extends Thread
{
Table table = new Table();
int number;
MyThread_1(Table table, int number)
{
this.table = table;
this.number = number;
}
public void run() {
table.printTable(number);
}
}
class MyThread_2 extends Thread{ Table table = new Table();
int number;
MyThread_2(Table table, int number)
{
this.table = table;
this.number = number;
}
public void run() {
table.printTable(number);
19
PERI COLLEGE OF ARTS AND SCIENCE
SE23A| JAVA AND DATA STRUCTURES
}
}
public class ThreadSynchronizationExample
{
public static void main(String[] args)
{
Table table = new Table();
MyThread_1 thread_1 = new MyThread_1(table, 5);
MyThread_2 thread_2 = new MyThread_2(table, 10);
thread_1.start();
thread_2.start();
}
}
3.4.4 Synchronized block
The synchronized block is used when we want to synchronize only a specific sequence of
lines in a method. For example, let's consider a method with 20 lines of code where we want to
synchronize only a sequence of 5 lines code, we use the synchronized block.
3.4.5 Java Inter Thread Communication
Inter thread communication is the concept where two or more threads communicate to
solve the problem of polling. In java, polling is the situation to check some condition repeatedly,
to take appropriate action, once the condition is true. That means, in inter-thread communication,
a thread waits until a condition becomes true such that other threads can execute its task. The
inter-thread communication allows the synchronized threads to communicate with each other.
Java provides the following methods to achieve inter thread communication.
wait( )
notify( )
notifyAll( )
The following table gives detailed description about the above methods.
Method Description
It makes the current thread to pause its execution until other thread in
void wait( ) the same monitor calls notify( )
void notify( ) It wakes up the thread that called wait( ) on the same object.
void notifyAll() It wakes up all the threads that called wait( ) on the same object.
Example:
20
PERI COLLEGE OF ARTS AND SCIENCE
SE23A| JAVA AND DATA STRUCTURES
class Customer
{
int amount=10000;
synchronized void withdraw(int amount)
{
System.out.println("going to withdraw...");
if(this.amount<amount)
{
System.out.println("Less balance; waiting for deposit...");
try{wait();}
catch(Exception e){}
}
this.amount-=amount;
System.out.println("withdraw completed...");
}
class Test
{
public static void main(String args[])
{
final Customer c=new Customer();
new Thread()
{
public void run()
{c.withdraw(15000);}
}.start();
new Thread()
{
public void run()
{c.deposit(10000);}
}.start();
}
}
3.5 DEADLOCK IN JAVA
Example:
Program with DEAD LOCK:
package thread;
public class ResolveDeadLockTest { public static void main(String[]
args) {
ResolveDeadLockTest test = new ResolveDeadLockTest();
// Thread-1
Runnable block1 = new Runnable() { public void run() {
synchronized (a) { try {
// Adding delay so that both threads can start trying to
// lock resources Thread.sleep(100);
} catch (InterruptedException e) { e.printStackTrace();
}
// Thread-1 have A but need B also synchronized (b) {
System.out.println("In block 1");
}
}
}
};
// Thread-2
Runnable block2 = new Runnable() { public void run() {
synchronized (b) {
22
PERI COLLEGE OF ARTS AND SCIENCE
SE23A| JAVA AND DATA STRUCTURES
new Thread(block1).start();
new Thread(block2).start();
}
// Resource B
private class B {
private int i = 20;
AVOIDING THREAD
Avoid Unnecessary Locks: The locks should be given to the important threads.
Giving locks to the unnecessary threads that cause the deadlock condition.
Using Thread Join: A deadlock usually happens when one thread is waiting for the other
to finish. In this case, we can use join with a maximum time that a thread will take.
The suspend() method of thread class puts the thread from running to waiting state. This method
is used if you want to stop the thread execution and start it again when a certain event occurs.
This method allows a thread to temporarily cease execution. The suspended thread can be
resumed using the resume() method.Syntax
public final void suspend()
The resume() method of thread class is only used with suspend() method. This method is used to
resume a thread which was suspended using suspend() method. This method allows the
suspended thread to start again.
Syntax
24
PERI COLLEGE OF ARTS AND SCIENCE
SE23A| JAVA AND DATA STRUCTURES
The stop() method of thread class terminates the thread execution. Once a thread is
stopped, it cannot be restarted by start() method.Syntax
Parameter
The java.io package contains nearly every class you might ever need to perform input
and output (I/O) in Java. All these streams represent an input source and an output destination.
The stream in the java.io package supports many data such as primitives, object, localized
characters, etc.
Stream
A stream can be defined as a sequence of data. There are two kinds of Streams −
InPutStream − The InputStream is used to read data from a source.
OutPutStream − The OutputStream is used for writing data to a destination.
Java provides strong but flexible support for I/O related to files and networks but this tutorial
covers very basic functionality related to streams and I/O. We will see the most commonly used
examples one by one −
3.6.1 Byte Streams
Java byte streams are used to perform input and output of 8-bit bytes. Though there are
many classes related to byte streams but the most frequently used classes
are, FileInputStream and FileOutputStream. Following is an example which makes use of these
two classes to copy an input file into an output file −
Example
25
PERI COLLEGE OF ARTS AND SCIENCE
SE23A| JAVA AND DATA STRUCTURES
try {
in = new FileInputStream("input.txt");
out = new FileOutputStream("output.txt");
int c;
while ((c =
in.read()) != -1)
{ out.write(c);
}
}finally {
if (in != null) {
in.close();
}
if (out != null)
{ out.close();
}
}
}
}
Now let's have a file input.txt with the following content − This is test for copy file.
As a next step, compile the above program and execute it, which will result in creating
output.txt file with the same content as we have in input.txt. So let's put the above code in
CopyFile.java file and do the following –
$javac CopyFile.java
$java CopyFile
try {
in = new FileReader("input.txt");
out = new FileWriter("output.txt");
int c;
while ((c =
in.read()) != -1)
{ out.write(c);
}
}finally {
if (in != null) {
in.close();
}
if (out != null) {
out.close();
}
}
}
}
Now let's have a file input.txt with the following content − This is test for copy file.
As a next step, compile the above program and execute it, which will result in creating
output.txt file with the same content as we have in input.txt. So let's put the above code in
CopyFile.java file and do the following −
$javac CopyFile.java
$java CopyFile
27
PERI COLLEGE OF ARTS AND SCIENCE
SE23A| JAVA AND DATA STRUCTURES
System.err.
Following is a simple program, which creates InputStreamReader to read standard input stream
until the user types a "q" −
Example
import java.io.*;
public class ReadConsole
{
public static void main(String args[]) throws IOException
{
InputStreamReader cin = null;
try {
cin = new InputStreamReader(System.in);
System.out.println("Enter characters, 'q' to quit.");
char c;
do {
c = (char) cin.read();
System.out.print(c);
} while(c != 'q');
}finally {
if (cin != null) {
cin.close();
}
}
}
}
Let's keep the above code in ReadConsole.java file and try to compile and execute it as shown
in the following program. This program continues to read and output the same character until
we press 'q' −
$javac ReadConsole.java
$java ReadConsole
Enter characters, 'q' to quit.
1
1
e
e
q
q
28
PERI COLLEGE OF ARTS AND SCIENCE
SE23A| JAVA AND DATA STRUCTURES
1
public void close() throws IOException{}
This method closes the file output stream. Releases any system resources associated
with the file. Throws an IOException.
2
protected void finalize()throws IOException {}
This method cleans up the connection to the file. Ensures that the close method of this
file output stream is called when there are no more references to this stream. Throws
an IOException.
3
public int read(int r)throws IOException{}
This method reads the specified byte of data from the InputStream. Returns an int.
Returns the next byte of data and -1 will be returned if it's the end of the file.
4
public int read(byte[] r) throws IOException{}
This method reads r.length bytes from the input stream into an array. Returns the
total number of bytes read. If it is the end of the file, -1 will be returned.
5
29
PERI COLLEGE OF ARTS AND SCIENCE
SE23A| JAVA AND DATA STRUCTURES
There are other important output streams available, for more detail you can refer to the following
links −
ByteArrayOutputStream
30
PERI COLLEGE OF ARTS AND SCIENCE
SE23A| JAVA AND DATA STRUCTURES
DataOutputStream
Following is the example to demonstrate InputStream and OutputStream −
import java.io.*;
public class fileStreamTest {
public static void main(String args[])
{ try {
byte bWrite [] = {11,21,3,40,5};
OutputStream os = new FileOutputStream("test.txt");
for(int x = 0; x < bWrite.length ; x++)
{
os.write( bWrite[x] ); // writes the bytes
}
os.close();
InputStream is = new FileInputStream("test.txt");
int size = is.available();
for(int i = 0; i < size; i++)
{ System.out.print((char)is.read() + " ");
}
is.close();
}
catch (IOException e)
{ System.out.print("Exception");
}
}
31
PERI COLLEGE OF ARTS AND SCIENCE
SE23A| JAVA AND DATA STRUCTURES
Other classes that the applet needs can be downloaded in a single Java Archive (JAR) file.
3.7.1 Life Cycle of an Applet
Four methods in the Applet class gives you the framework on which you build any serious applet.
init − This method is intended for whatever initialization is needed for your applet. It is
called after the param tags inside the applet tag have been processed.
start − This method is automatically called after the browser calls the init method. It is
also called whenever the user returns to the page containing the applet after having gone
off to other pages.
stop − This method is automatically called when the user moves off the page on which
the applet sits. It can, therefore, be called repeatedly in the same applet.
destroy − This method is only called when the browser shuts down normally. Because
applets are meant to live on an HTML page, you should not normally leave resources
behind after a user leaves the page that contains the applet.
paint − Invoked immediately after the start() method, and also any time the applet needs
to repaint itself in the browser. The paint() method is actually inherited from the
java.awt.
A "Hello, World" Applet
Following is a simple applet named HelloWorldApplet.java −
import java.applet.*;
import java.awt.*;
public class HelloWorldApplet extends Applet {
public void paint (Graphics g) {
g.drawString ("Hello World", 25, 50);
}
}
These import statements bring the classes into the scope of our applet class −
java.applet.Applet
java.awt.Graphics
Without those import statements, the Java compiler would not recognize the classes Applet and
Graphics, which the applet class refers to.
3.7.2 The Applet Class
Every applet is an extension of the java.applet.Applet class. The base Applet class
provides methods that a derived Applet class may call to obtain information and services from
the browser context.
These include methods that do the following −
Get applet parameters
Get the network location of the HTML file that contains the applet
Get the network location of the applet class directory
32
PERI COLLEGE OF ARTS AND SCIENCE
SE23A| JAVA AND DATA STRUCTURES
</html>
Simple example of Applet by appletviewer tool:
To execute the applet by appletviewer tool, create an applet that contains applet tag in comment
and compile it. After that run it by: appletviewer First.java. Now Html file is not required but it
is for testing purpose only.
//First.java
import java.applet.Applet;
import java.awt.Graphics;
public class First extends Applet{
public void paint(Graphics g){
g.drawString("welcome to applet",150,150);
}
}
/*
<applet code="First.class" width="300" height="300">
</applet>
*/
To execute the applet by appletviewer tool, write in command prompt:
c:\>javac First.java c:\>appletviewer First.java
3.7.3 Displaying Graphics in Applet
java.awt.Graphics class provides many methods for graphics programming.
10. public abstract void setColor(Color c): is used to set the graphics current color to
the specified color.
11. public abstract void setFont(Font font): is used to set the graphics current font to the
specified font.
import java.awt.*;
import java.awt.event.*;
import java.applet.*;
public class MouseDrag extends Applet implements MouseMotionListener{
public void init(){
addMouseMotionListener(this);
setBackground(Color.red);
}
public void mouseDragged(MouseEvent me)
{
Graphics g=getGraphics();
g.setColor(Color.white);
g.fillOval(me.getX(),me.getY(),5,5);
}
public void mouseMoved(MouseEvent me){}
}
myapplet.html
<html>
<body>
<applet code="MouseDrag.class" width="300" height="300">
</applet>
</body>
</html>
35
PERI COLLEGE OF ARTS AND SCIENCE