Teach Yourself Java in 21 Minutes 1
Teach Yourself Java in 21 Minutes 1
Teach Yourself Java in 21 Minutes 1
The Java programming language was developed at Sun Microsystems and originally
became popular as a language for Internet applications (applets). Such applets are embed-
ded within WWW pages and executed in the users browser. A special format called byte
code is used instead of ordinary machine code, and by using a special Java interpreter pro-
gram that code can be executed on any computer. Such an interpreter is called a Java Vir-
tual Machine (JVM) and is available for most modern computer systems.
(There is nothing about the Java language itself that enforces the byte code technique
there are actually some compilers who generate real machine code, known as native code,
directly.)
The Java language is not limited to Internet applications. It is a complete general object-
oriented language and can be used to develop many kinds of applications. Although the
syntax of Java is very similar to that of C++, many complicated and error-prone features of
C++ have been removed. The result can be described as a Simula with C++ syntax.
Sun Microsystems (who created the Java language) provide free tools for developing Java
software. The Java home page <http://java.sun.com> has links to Java compilers for
most computer systems (such as Unix and Microsoft Windows), as well as a lot of docu-
mentation. It is possible to download a Java compiler and use it for free.
In Java, every source file usually contains exactly one class. The file must have the same
name as the class; a class named TurtleMaze would be stored in the source file
TurtleMaze.java. This source file can then be compiled using the javac compiler:
% javac TurtleMaze.java
The output of the compiler is a file with the same name as the source file, but with the
extension .class instead of .java (i.e., TurtleMaze.class in the above example). That
class file contains the byte code mentioned earlier, so it cannot be executed right away.
Instead it is executed using the JVM (byte code interpreter) as follows:
% java TurtleMaze
This command loads the TurtleMaze class and executes its main method (that is, starts
the program). If the TurtleMaze class in turn uses other classes, these are loaded automat-
ically when needed.
Since every class should be in its own file, several files can need to be recompiled at the
same time. The javac compiler has a special option -depend to compile all files that
depend on a particular file. The command
% javac -depend TurtleMaze.java
will compile not only TurtleMaze.java, but also all changed files it depends upon.
Many details of the Java language have been left out in this tutorial. If you want to know
more about the Java programming language, refer to one of the following sources:
Per Holm: Objektorienterad programmering och Java. Studentlitteratur, 1998.
Mary Campione and Kathy Walrath: The Java Tutorial (second edition). Addison-Wes-
ley, 1998. Also available on WWW:
<http://java.sun.com/docs/books/tutorial/index.html>.
Ken Arnold and James Gosling: The Java Programming Language (second edition).
Addison-Wesley, 1998.
Sun Microsystems: Java Technology Home Page: <http://java.sun.com>. Includes
detailed documentation about the Java class libraries.
If you have a question about Java which this short tutorial does not answer, feel free to ask
any of the teachers in your course.
Note that declarations and statements can be mixed freely (in contrast to Simula and
Pascal).
Unlike Simula, the initial value of a local variable is undefined (unless, of course, an initial
value is explicitly given as just shown).
The Java division operator (/) can actually mean two different things: real division for
real numbers, and integer division for integers. Usually this is not a problem, but it can
occasionally lead to some surprising results:
double f;
f = 1 / 3; // f is now 0.0
f = 1.0 / 3.0; // f is now 0.33333333...
In the first case an integer division is performed, giving an integer result (0). To get the
result 0.33333, the 1 and 3 are expressed as real values (1.0 and 3.0), which means the
division becomes a real division.
Java does not perform all such conversions automatically. Instead the programmer must
indicate where the conversions must be made by writing the desired type in parentheses
before the expression. In Java, such a conversion is called a cast. Example:
double radians;
int degrees;
...
degrees = radians * 180 / 3.141592653; // Error
degrees = (int) (radians * 180 / 3.141592653); // OK
It is, however, possible to assign an integer value to a real variable without casting. In gen-
eral, no cast is necessary as long as the conversion can be made without any loss of infor-
mation.
2 Statements
Java statements are written in much the same way as in other languages. Just like in Sim-
ula or Pascal, statements can be grouped together in blocks using { and } (correspond-
ing to begin and end in these languages).
Note:
There is no then keyword
The condition must be of boolean type and written within parentheses
Comparison is made using ==
There are of course a number of other comparison operators, such as <, >, <=, >=,
and so on. The only one that looks different from Simula and Pascal is the not equals
operator !=, which is used in the example below.
if (x != 0)
y = 3.0 / x; // Executed when x is non-zero
else
y = 1; // Executed when x is zero
Note that, unlike Simula and Pascal, there should be a semicolon before the else key-
word in the example above.
However, when one uses braces ({ and }) to form a block of statements, the right
brace should NOT be followed by a semicolon. (In fact, a right brace is never followed
by a semicolon in Java.)
if (x != 0) {
y = 3.0 / x;
x = x + 1;
} else // <--- Note: no semicolon
y = 1;
It is common practice to always include the braces, even if they only contain a single state-
ment. This avoids forgetting them whenever another statement is added.
For boolean expressions, one needs to use logical operators corresponding to and, or,
and not. In Java, they are written as follows:
and &&
or ||
not !
As the example shows, there is nothing special about Javas while statement. The for state-
ment is quite general and can be used in some very advanced ways. However, the most
common use is to repeat some statement a known number of times:
// Calculate 1 + (1/2) + (1/3) + ... + (1/100)
int i;
double sum = 0.0;
for (i = 1; i <= 100; i++) {
sum = sum + 1.0 / i;
}
As long as these statements are not used as parts of a larger expression, they mean exactly
the same thing. There corresponding operators for decrementing variables are -- and -=.
1. Supporting several ways to write essentially the same thing has historical reasons it is a heritage from
the C programming language.
The private and protected keywords require some explanation. The private declara-
tion means that those attributes cannot be accessed outside of the class. In general,
attributes should be kept private to prevent other classes from accessing them directly.
There are two other related keywords: public and protected. The public keyword is
used to declare that something can be accessed from other classes. The protected key-
word specifies that something can be accessed from within the class and all its subclasses,
but not from the outside.
3.2 Methods
In Java, functions and procedures are called methods. Methods are declared as follows:
class Turtle {
// Attribute declarations, as above
This example contains two methods. The first is called jumpTo and has two integer param-
eters, newX and newY.
The second method is called getX, has no parameters, and returns an integer. Note that the
empty pair of parentheses must be present.
Both method declarations begin with the keyword public, to make sure they can be
accessed from other classes. (It is however possible to declare methods private or pro-
tected, which can be useful for internal methods which should not be used from other
classes.)
Turtle t;
t = new Turtle(100, 100);
The first line is a declaration of a reference variable to a Turtle object, just like a
ref(Turtle) declaration in Simula. The second line creates a new Turtle object and sets
the t variable to refer to it.
Theres nothing strange about calling methods in objects, as the following examples show.
int a = t.getX();
t.jumpTo(300, 200);
The constructor is written just like any ordinary method but with the same name as the
class, and no return type (not even void).
Unlike Simula class parameters, the constructors parameters are not attributes. Instead
they are used to give initial values to the attributes.
A main method usually creates a few objects and does some small work to get things
going. For Turtle a simple main method may look as follows:
public static void main(String[] args) {
Turtle t = new Turtle(100, 200);
t.right(90);
while (t.getX() < 150) {
t.forward(2);
}
}
There are two new things about main, which can both safely be ignored for now. The first
is the static keyword. It means that when the main method is called, it is not associated
with an object, but with the class. (This implies that the method cannot access any
attributes.)
The other new thing is the parameter named args. If the Java interpreter is given any more
information than the class name, this data is passed on to the main method in this parame-
ter.
3.6 Inheritance
To declare a subclass of another class, use the extends keyword in the class declaration:
class NinjaTurtle extends Turtle {
// Declarations for Ninja turtles
}
So far, this works in exactly the same way as subclasses in Simula. If the superclass con-
structor has any parameters, it must be called first using the keyword super. The construc-
tor for NinjaTurtle might look like this:
public NinjaTurtle(int initX, int initY, String name) {
super(initX, initY); // Call superclass constructor
// ... do some more initialization stuff...
}
Virtual methods
In Java, all methods are virtual, so there is no need for any special syntax for virtual meth-
ods. A method in a class automatically overrides any method with the same name and
parameters in any superclass.
A class with one or more abstract methods is itself called abstract, and must be declared as
such by writing abstract class instead of class. It is not possible to create objects
from abstract classes.
Programs with graphical user interfaces often need to be informed whenever the mouse is
clicked. Usually the program has some method which should be automatically called by
the system whenever the user clicks the mouse.
Java provides a very flexible way of specifying an object and a method to call in such situ-
ations. Suppose the window system declares an interface, written as follows:
interface MouseListener {
void processMouseClick(int x, int y);
}
This declaration essentially says that if an object should be used to handle mouse clicks,
its class should contain a processMouseClick method with two integer parameters.
Finally, the window system should have some method to register MouseListener objects
to inform whenever a mouse is clicked. Such a method might look like as follows:
class WindowSystem {
public void addMouseListener(MouseListener m) {
// Insert m into some clever data structure
}
// ... and loads of more stuff...
}
4 Exceptions
Many things can go wrong during the execution of a program. These run-time errors can
be divided into two broad categories:
Faults introduced by the programmer, such as division by zero or calling a method with
a null reference.
Things out of the programs control, such as a user entering a garbage on the keyboard
when the program expects a positive integer.
The latter category is the one that programmers usually take care of. The traditional way
of handling these errors is to put the code in question in some method which returns a
value to indicate whether whings went well or not. A method to read a positive integer
from the keyboard could, for instance, look like this:
public int getNatural() { ... }
Suppose the special value -1 is used to indicate that an invalid number was entered by the
user. The code that calls this method would then have to check the return value with an if
statement. If that code is part of some method, that method may in turn have to return
some value to indicate that things went wrong. This kind of programming can easily turn
into a lot of if statements and special return values, and very few statements that actually
do something.
The try clause can contain many statements that throw exceptions, and there can be sev-
eral different catch clauses. This means that the error handling is separated from the code
that actually does the work. It often also helps in reducing the complexity of the error han-
dling code.
If a method does not handle an exception (for instance, if it uses the getNatural()
method without any try/catch clauses), the exception must be passed on to the calling
method. This is done using a throws declaration as indicated above:
public void doStuff() throws IOException {
int n = getNatural(); // May throw an exception
// Clever calculations using n...
}
The method that calls doStuff() must in turn either catch the exception or pass it on. If
the exception is not caught (even the main method passes it on), the execution is aborted
with an error message.
Note the new keyword in the throw statement above. This reveals that the exception is
actually an object which can contain information. In particular, it contains a string describ-
ing the error, as indicated above.
5 Miscellaneous
This section contains a few details about Java that might be useful to know when writing
Java programs.
5.1 Comments
One kind of comments has already been shown: the line comment, which starts with //
and extends to the end of a line. Multi-line comments are written using /* and */ as
follows:
/* This is a comment
which continues on to a second line */
(A special case of such multi-line comments are the documentation comments. They are
written immediately before classes and methods and begin with /** (two asterisks) and
end, as usual, with */ (one asterisk). Such comments are used by a special tool, java-
doc, to automatically generate low-level documentation of the program.)
5.3 Arrays
A Java array is similar to an object in some ways. It is for example accessed using refer-
ence variables. Array references can be declared as follows:
int[] someInts; // An integer array
Turtle[] turtleFarm; // An array of references to Turtles
Since these variables are only references to arrays, the array sizes are not given in the dec-
larations, but when the arrays are actually created.
someInts = new int[30];
turtleFarm = new Turtle[100];
The array elements can then be used as any simple scalar variables. (Note that indices
always start at 0 and end at the size minus one, so the elements of the someInts array
have the indices 0 to 29.)
int i;
for (i = 0; i < someInts.length; i = i + 1) {
someInts[i] = i * i;
}
The expression someInts.length means in the length of the vector, 30 in this case.
Figure.java
import java.awt.*;
/**
* Simple abstract class for graphic figures that can be drawn in windows.
*/
abstract class Figure {
/**
* Constructor: takes two parameters, the X and Y coordinates.
*/
public Figure(int inX, int inY) {
x = inX;
y = inY;
}
/**
* Abstract method for drawing this thing.
*
* The g parameter is a pen that can be used to draw things
* in the window.
*/
public abstract void draw(Graphics g);
/**
* Move the figure to (newX, newY).
*/
public void move(int newX, int newY) {
x = newX;
y = newY;
}
/**
* A square that can be drawn in a window. The coordinates represent the
* upper left corner of the square.
*/
class Square extends Figure {
/**
* Constructor: first two parameters are the coordinates, the third is
* the side.
*/
public Square(int inX, int inY, int inSide) {
super(inX, inY);
side = inSide;
}
/**
* Drawing method for squares.
*/
public void draw(Graphics g) {
g.drawRect(x, y, side, side);
}
Circle.java
import java.awt.*;
/**
* Circle class. The coordinates represent the circles center.
*/
class Circle extends Figure {
/**
* Constructor: the first two parameters are the coordinates,
* the third is the diameter.
*/
public Circle(int inX, int inY, int inDiam) {
super(inX, inY);
d = inDiam;
/**
* Drawing method for circles.
*/
public void draw(Graphics g) {
g.drawOval(x, y, d, d);
}
FigureWindow.java
import java.awt.*;
/**
* A simple window to display graphic figures in. The window is a subclass
* of the Java Frame class, which describes graphic windows. The window
* keeps its figures in an array.
*
* The Java window system (AWT) automatically calls the paint method in
* the Frame class whenever the windows contents need to be redrawn. A
* new implementation of paint is provided in FigureWindow to handle the
* drawing.
*/
class FigureWindow extends Frame {
/**
* Constructor: the parameter indicates the maximal number of figures.
*/
public FigureWindow(int max) {
super("Fabulous Figures); // Window title
figures = new Figure[max];
nbrOfFigures = 0;
}
/**
* Add the figure f to the window. If the maximal number of figures has
* been reached, nothing happens.
*/
public void addFigure(Figure f) {
if (nbrOfFigures < figures.length) {
figures[nbrOfFigures] = f;
nbrOfFigures++;
}
}
/**
* Main method: creates a FigureWindow and a few figures inside it.
*/
public static void main(String[] args) {
FigureWindow w = new FigureWindow(10);
w.setSize(400, 300);
w.addFigure(new Square(50, 50, 200));
w.addFigure(new Circle(200, 100, 150));
w.addFigure(new Circle(300, 200, 200));
w.show();
}
}