From: elharo@sunsite.unc.edu
Newsgroups: comp.lang.java.programmer,comp.lang.java.api,comp.lang.java.misc,comp.lang.java.tech,alt.www.hotjava
Organization: Cafe Au Lait
Followup-To: poster
Subject: comp.lang.java FAQ

Archive-name: computer-lang/java-faq/part1
Posting-Frequency: weekly
Last-modified: 1997/03/18
Version: 1.4
URL: http://sunsite.unc.edu/javafaq/javafaq.html

The comp.lang.java FAQ List

This is a Java FAQ list for the comp.lang.java newsgroups. If you're reading the text version via Usenet, I do apologize that parts of it may be less intelligible than possible in HTML. Please refer to the HTML version at http://sunsite.unc.edu/javafaq/javafaq.html.

The only official mirrors of this site are at the other sunsites. If the URL where you found this file is not a sunsite, then this is an illegal mirror copy and is likely to be out of date. Please refer to the official site instead.

This document is Copyright 1995-1997 by Elliotte Rusty Harold. For information about reproduction, redistribution and other such rights please see the end of this file.

What's New

I've reorganized the FAQ and added question and section numbers.

There are several new questions including:

For the most part, this FAQ list only covers Java 1.0.2. I have begun the process of converting this list over to Java 1.1. I am aware of other changes in Java 1.1 and will incorporate them as time permits. Please don't send me email pointing out errors or omissions that are only relevant to 1.1. I am fully cognizant of these.

Table of Contents

1: What is Java?

Java, formerly known as oak, is an object-oriented programming language developed by Sun. It shares many superficial similarities with C, C++, and Objective C (for instance for loops have the same syntax in all four languages); but it is not based on any of those languages, nor have efforts been made to make it compatible with them.

Java is sometimes referred to as C++ ++ --. The language was originally created because C++ proved inadequate for certain tasks. Since the designers were not burdened with compatibility with existing languages, they were able to learn from the experience and mistakes of previous object-oriented languages. They added a few things C++ doesn't have like garbage collection and multithreading; and they threw away C++ features that had proven to be better in theory than in practice like multiple inheritance and operator overloading. (There's still argument over whether they made the right choices. I tend to think they were correct to throw out operator overloading and probably correct to throw out multiple inheritance. For now let's just say that neither choice is likely to be reviewed soon.)

Even more importantly Java was designed from the ground up to allow for secure execution of code across a network, even when the source of that code was untrusted and possibly malicious. This required the elimination of more features of C and C++. Most notably there are no pointers in Java. Java programs cannot (at least in theory) access arbitrary addresses in memory.

Furthermore Java was designed not only to be cross-platform in source form like C, but also in compiled binary form. Since this is frankly impossible across processor architectures, Java is compiled to an intermediate byte-code which is interpreted on the fly by the Java interpreter. Thus to port Java programs to a new platform all that is needed is a port of the interpreter and a few native code libraries.

Finally Java was designed to make it a lot easier to write bugfree code. Shipping C code has, on average, one bug per 55 lines of code. About half of these bugs are related to memory allocation and deallocation. Thus Java has a number of features to make bugs less common:

1.1: Where did Java come from?

In the late 1970's Bill Joy thought about doing a language that would merge the best features of MESA and C. However other projects (like cofounding Sun) intervened. In the late 1980's he got Sun's engineers started on a complete revision of the UNIX operating system that involved merging SunOS4.x with AT&T's SYSVR4.

In 1989 Joy sold his Sun stock, invested heavily in Microsoft and moved out of mainstream Sun to Aspen, Colorado. By the early 90's Bill was getting tired of huge programs. He decided that he wanted to be able to write a 10,000 line program that made a difference. In late 1990 Bill wrote a paper called Further which outlined his pitch to Sun engineers that they should produce an object environment based on C++. Today Joy freely admits that C++ was too complicated and wasn't up to the job.

Around this time James Gosling (of emacs fame) had been working for several months on an SGML editor called "Imagination" using C++. The Oak language (now Java) grew out of Gosling's frustration with C++ on his "Imagination" project.

Patrick Naughton, then of Sun, now vice-president of technology at StarWave, started the Green Project on December 5th, 1990. Naughton defined the project as an effort to "do fewer things better". That December he recruited Gosling and Mike Sheridan to help start the project. Joy showed them his Further paper, and work began on graphics and user interface issues for several months in C.

In April of 1991 the Green Project (Naughton, Gosling and Sheridan) settled on smart consumer electronics as the delivery platform, and Gosling started working in earnest on Oak. Gosling wrote the original compiler in C; and Naughton, Gosling and Sheridan wrote the runtime-interpreter, also in C. (The Green project never wrote a single line of C++.) Oak was running its first programs in August of 1991. Joy got his first demos of the system that winter, when Gosling and Naugton went skiing at Joy's place in Aspen.

By the fall of 1992 "*7", a cross between a PDA and a remote control, was ready This was demoed to Scott McNealy, Sun's president, in October. He was blown away. Following that the Green Project was set up as First Person Inc., a wholly owned Sun subsidiary.

In early 1993 the Green team heard about a Time-Warner request for proposal for a settop box operating system. First Person quickly shifted focus from smart consumer electronics (which was proving to be more hype than reality) to the set-top box OS market, and placed a bid with Time-Warner.

Fortuitously, Sun lost the bid. The Time-Warner project went nowhere, the same place it probably would have gone if Sun had won the bid. First Person continued work on settop boxes until early 1994, when it concluded that like smart consumer electronics settop boxes were more hype than reality.

Without a market to be seen First Person was rolled back into Sun in 1994. However around this time it was realized that the requirements for smart consumer electronics and settop box software (small, platform independent secure reliable code) were the same requirements for the nascent web.

For a third time the project was redirected, this time at the web. A prototype browser called WebRunner was written by Patrick Naughton in one weekend of inspired hacking. After additional work by Naughton and Jonathan Payne this browser became HotJava. The rest, as they say, is history.

Information in this section is primarily based on the first hand accounts of Bill Joy and Patrick Naughton (which don't always agree). No doubt other people have still different memories of what occurred. If you've got any more first hand information about what went on in the Green project I'd like to hear from you.

1.2: Doesn't the World Wide Web have something to do with this?

Not necessarily. Java is a programming language. When work began on what has become Java, the World Wide Web was just getting started at CERN; and Mosaic wasn't even a glint in Marc Andreesen's eye. The original use of the Java language (settop boxes) required security and the ability to execute code from untrusted hosts. It turns out these are virtually the same requirements for allowing people to download and run programs from the Web. No other language has the built-in security of Java. The key here is the security features. The object-oriented nature of Java is secondary, and mainly reflects the preferences and prejudices of the developers who set out to write a secure language. The C-like syntax of the language is even less crucial.

At the lowest level the advantage of Java to the web is that it provides a secure, cross-platform way for code to be executed. At a somewhat higher level Java adds several features to existing web sites:

Arbitrary Graphics
Java lets the server draw pictures in a window on the client. In theory this allows a web page to do anything a regular program can do by drawing in a window.

Arbitrary Data Types
In practice rather than using graphics primitives to create your desired web page you'd use a graphics program to draw the page and then write a program that could read and display the file formats of that program. Java lets you write content handlers that display any particular data format. This way you can download your data and your data display program rather than downloading a bitmapped snapshot of the display. People are already using this to add sound and animation to web pages. Rather than having to download a file and spawn an external viewer, the viewer is included with the data; and the data is displayed right on the page.

Less Load On The Server
CPU intensive cgi-bin scripts place a large load on a server, particularly at busy sites. With Java you can offload the calculations to the client's PC. I've written an applet that calculates all possible ram configurations for a given Mac model. However on models with many memory slots the sheer number of permutations can tie up even a fast machine for several hours. Publishing this as a cgi-bin would bring my server to its knees, but by publishing it as a Java applet I can distribute the load across all the machines that want to run it.

More User Interaction
Finally Java allows for more interaction with the user. Java not only allows you to paint arbitrary data on the screen. It also allows you to collect input from the user in the form of mouse clicks, keystrokes and the like. This lets you put almost any application on your web page that doesn't require disk access.

1.3: What platforms does Java run on?

Sun has made a Java development kit available for Sparc and X86 Solaris, Windows NT for Intel, Windows 95, MacOS 7.5 on PowerMacs and 68030 (25 MHz and faster) and 68040 Macs.

An IRIX port has mostly been completed by Simon Leinen. SGI's own port is available at http://www.sgi.com/Fun/Free_webtools.html

A Linux port is in fairly good shape. See http://java.blackdown.org/java-linux.html.

IBM has ported Java to Windows 3.1, OS/2, and AIX. It is working on ports for MVS and OS/400. See http://ncc.hursley.ibm.com/javainfo/hurindex.html .

The OSF has ported Java to Unixware, the Bull Estrella or other PowerPC running AIX4.1, X86 running DASCOM OSF/1 , the Digital Alpha running Digital UNIX 3.2 , the HP700 series running HPUX 10.x, the NCR Globalyst (Pentium) running UNIX SysV, and Sony NEWS (MIPS) running Sony NEWS 6.1.1. See http://www.osf.org/mall/web/JDK/.

Other ports are underway for Nextstep, SunOS 4.1, the Amiga and possibly other platforms.

In the past new versions of Java have most often been made available first for Solaris. If you have to have the latest version as soon as it's released, or if you're developing "Bet your company" applications with Java, you should probably be running Solaris on a SparcStation. Otherwise, if you just want to learn the language, you can get away with an Intel based Windows 95 or NT machine with a lot of RAM.

Netscape 2.0 and later plays Java applets on Windows NT, Windows 95, Solaris, SunOS 4.1, Linux and most other Unix platforms. Netscape 3.0 for the Mac also supports Java. Netscape 2.0 can even compile Java programs. (Netscape 3.0 cannot).

First download the classes.zip file from the Solaris distribution of the JDK. (You have to download the entire JDK. You can't get just the classes.zip file.) Next set your CLASSPATH environment variable to include the classes.zip file. For example, on Unix, if you put the file in /usr/local/lib/classes.zip, then you would set it like this:

sh: % CLASSPATH=$CLASSPATH:/usr/local/lib/classes.zip
csh: % setenv CLASSPATH "$CLASSPATH:/usr/local/lib/classes.zip"
You'll probably want to put this line in your .login or .cshrc file. Of course you'll need to adjust this to match where you've installed these files and to add any other classes you use. Finally you compile programs from the command line like this:

% netscape -java sun.tools.javac.Main HelloWorld.java
You can always alias netscape -java sun.tools.javac.Main to just javac to make this more transparent.

You can also run command-line programs that don't use the AWT in the same way, like this:

% netscape -java HelloWorld.class
You can't use netscape -java to run programs that use the AWT, but you can of course play applets in Netscape..

1.4: Do I need to know C++ to learn Java?

No. Java is in fact a much easier language to learn than C++.

A little further out in left field, it isn't even necessary to know Java to write Java programs. Intermetrics is beta testing an ADA-95 to Java byte code compiler. Other such cross-compilers are probably possible including ANSI Fortran-77. However the one most people probably want, that is a C/C++ to Java byte code compiler, is probably not possible due to Java's lack of pointers.

1.5: Where does Javascript fit in?

To quote from p. 31 of the first edition of my book, The Java Developer's Resource,
Java and JavaScript are about as closely related as the Trump Taj Mahal in Atlantic City is to the Taj Mahal in India. In other words Java and JavaScript both have the word Java in their names. JavaScript is a programming language from Netscape which is incorporated in their browsers. It is superficially similar to Java in the same way C is similar to Java but differs in all important respects.

1.6: What's the difference between an application and an applet?

This question can be answered on many levels. Technically an application is a Java class that has a main() method. An applet is a Java class which extends java.applet.Applet. A class which extends java.applet.Applet and also has a main() method is both an application and an applet.

More generally and less technically an application is a stand-alone program, normally launched from the command line, and which has more or less unrestricted access to the host system. An applet is a program which is run in the context of an applet viewer or web browser, and which has strictly limited access to the host system. For instance an applet can normally not read or write files on the host system whereas an application normally can.

The actions of both applets and applications, however, can be controlled by SecurityManager objects. If you can change the SecurityManager that's used you can change what an applet or an application is and is not allowed to do. Thus these are not hard and fast differences, though this is normally how they separate out in practice.

2 What other Java Resources are available?

2.1Web Sites

The key site for Java information is http://www.javasoft.com/. This is Sun's official site for Java, and contains the latest published version of all official Java information. The most important page on this site is the Documentation page at http://www.javasoft.com/doc/. Most of the other pages are linked off of this page or its children.

For many more web sites see the Cafe Au Lait links page at http://sunsite.unc.edu/javafaq/links.html.

2.2: Mailing Lists

There are over fifty different Java related mailing lists. A more-or-less complete list is at the Cafe Au Lait mailing list page at http://sunsite.unc.edu/javafaq/mailinglists.html.

2.3: Newsgroups

alt.www.hotjava
A newsgroup for the discussion of the HotJava browser.

comp.lang.java.announce
A newsgroup for announcements that may be of interest to Java developers. See http://www.cs.latrobe.edu.au/~leachbj/clj.announce/guidelines.html for the ridiculously complicated submission guidelines and submission address.

comp.lang.java.programmer
A newsgroup for the discussion of the Java language.

comp.lang.java.api
A newsgroup for the discussion of the Java Application Programming Interface (API).

comp.lang.java.tech
Technical issues about Java not related directly to programming, including virtual machines, bytecode, classfile format, performance and optimization, possible extensions, porting, native methods and interfacing Java with other languages.

comp.lang.java.security
Discussion concerning any of Java's security features such as byte code verification, SecurityManagers, class loaders, public-key encryption and authentication of classes, holes in the security model, and similar topics.

comp.lang.java.setup
This group is for end-users of Java systems, not programmers. It deals with installation problems, CLASSPATH problems, the availability of ports to specific platforms, and the like. Subject lines should include the platform that the problem occurs on, and the browser version, for example MacOS 7.5 Netscape 3.0.

comp.lang.java.misc
Anything not covered above, IDEs and books for example.

2.5: Books

As of March, 1997 I recommend four books in particular for those learning the language. The first is my own book, The Java Developer's Resource, ISBN: 0-13-570789-7, $26.95 from Prentice Hall. This is an introduction to Java for programmers, regardless of previous experience with C or OOP. It should be available in most bookstores that stock computer books as well as from amazon.com, http://www.amazon.com/exec/obidos/ISBN=0135707897/

The second book I recommend is Java in a Nutshell: A Desktop Quick Reference for Java Programmers by David Flanagan from O'Reilly & Associates, Inc., ISBN: 1-56592-183-6, $19.95. This is an excellent introduction to Java for C and C++ programmers and an excellent reference for everyone.

For people with no prior experience in programming I recommend Kris Jamsa's Java Now!, ISBN: 1-884133-30-4, $16.95, Jamsa Press.

Finally The Java Handbook by Patrick Naughton, $27.95, Osborne/Mcgraw-Hill, is a moderately comprehensive introduction to Java.

None of these books cover Java 1.1. In fact as of this writing, no book truly covers Java 1.1 though several claim to.

For details about these and many more books see the Cafe Au Lait books page at http://sunsite.unc.edu/javafaq/books.html

3: Java for C++ programmers

In the large Java looks like Smalltalk. In the small it looks like C. The syntax of Java is deliberately similar to C. If you know C you already know large chunks of Java. Here, in brief, is Java syntax for C programmers:

3.1: Data Types

Java's primitive data types are very similar to those of C. Strings, booleans, and true arrays have been added. However the implementation of the data types has been substantially cleaned up in several ways.

  1. Where C and C++ leave a number of issues to be machine and compiler dependent (for instance the size of an int) Java specifies everything.

  2. Java prevents casting between arbitrary variables. Only casts between numeric variables and between sub and superclasses of the same object are allowed.

  3. All numeric variables in Java are signed.

Here are the detailed data types:

boolean
1-bit. May take on the values true and false only.

true and false are defined constants of the language and are not the same as True and False, TRUE and FALSE, zero and nonzero, 1 and 0 or any other numeric value. Booleans may not be cast into any other type of variable nor may any other variable be cast into a boolean.

byte
1 signed byte (two's complement). Covers values from -128 to 127.

short
2 bytes signed (two's complement), -32,768 to 32,767

int
4 bytes, signed (two's complement). -2,147,483,648 to 2,147,483,647. Like all numeric types ints may be cast into other numeric types (byte, short, long, float, double). When lossy casts are done (e.g. int to byte) the conversion is done modulo the length of the smaller type.

long
8 bytes signed (two's complement). Ranges from -9,223,372,036,854,775,808 to +9,223,372,036,854,775,807.

float
4 bytes, IEEE 754. Covers a range from 1.40129846432481707e-45 to 3.40282346638528860e+38 (positive or negative).

Like all numeric types floats may be cast into other numeric types (byte, short, long, int, double). When lossy casts to integer types are done (e.g. float to short) the fractional part is truncated and the conversion is done modulo the length of the smaller type.

double
8 bytes IEEE 754. Covers a range from 4.94065645841246544e-324d to 1.79769313486231570e+308d (positive or negative).

char
2 unsigned bytes, Unicode.

Chars are not the same as bytes, ints, shorts or Strings.

Strings
Strings are a special object defined in java.lang.String. They are not null terminated and are not the same as an array of chars.

array
Arrays are objects. Multidimensional arrays are created via arrays of arrays.

sizeof isn't necessary in Java because all sizes are precisely defined. i.e. an int is always 4 bytes. This may not seem to be adequate when dealing with objects that aren't base data types. However even if you did know the size of a particular object, you couldn't do anything with it anyway. You cannot convert an arbitrary object into bytes and back again.

3.2: Control Statements

Java contains if, else, for, while, do while and switch statements. The syntax is identical to C's. However all condition tests must return boolean values. Since non-boolean assignment statements and arithmetic statements do not return a boolean value, some of the more obfuscated condition tests in C are prohibited.

3.3: Command Line Arguments

Command line arguments are like C's except that argv has become a string array commonly called args and args[0] is the first command line argument, not the name of the program. The other arguments are all shifted one to the left from where they'd be in C or C++.

3.4: Comments

Java supports both the /* This is a comment */ comment from C and the
// This is a C++ comment
comment from C++.

However comments that begin with a /** are special. These comments should only be used before a method or class declaration. They indicate that the comment should be included in automatically generated documentation for that declaration.

3.5: Classes

Java does not support multiple inheritance.

Superclasses of a class are indicated with the extends keyword rather than with a :.

Methods must be defined inside the class to which they belong. They may not be declared inside the class and defined outside the class as is common in C++.

3.6: How is Java unlike C++?

Two classes of language features have been removed from C++ to make it Java. These are those language features which make C++ unsafe and those which make it hard to read.

Features removed that make Java easier to read and understand than C++ include #define, typedef, operator overloading, enum, unions and structs.

The main feature removed to make Java safer and more robust than C++ is pointer arithmetic.

Other features removed include global variables, standalone functions (everything is a method), friend functions (Everything in a package is a friend of everything else in the package.) and non-virtual functions.

A number of features have been added to Java to make it safer including true arrays with bounds checking, garbage collection, concurrency, interfaces (from Objective C) and packages. There is no need to explicitly allocate or free memory in Java.

4: How Do I...

4.1: Make a linked list without pointers?

Short answer: Use the Vector class in java.util. It can do anything a linked list can do and a little more and saves you a lot of coding which, after all, is the point of OOP and the class library. However it is array based so insertions or deletions from the middle of a Vector are not as efficient as with a true linked list.

Long answer: Object variables in Java are all references. A reference acts like a pointer in most other languages. (Though they're handles, not pointers, in most Java implementations. The notable exception is Microsoft's.) The main difference is that you can't do pointer arithmetic on references. Therefore wherever you'd use a pointer to an object in C++, in Java you should just use the object itself.

On the other hand the primitive data types (int, float, double, char, byte, short, long and boolean) are not references. If you want to get a reference to one of these you need to wrap it in a class first. Java provides ready-made type-wrapper classes in the java.lang package for Boolean, Character, Integer, Double, Float, and Long. Bytes and shorts can be stored in the Integer class as well. Java 1.1 will add Byte, Short, and Void classes too.

4.2: How do I scanf, readln, etc. in Java?

Java has no exact equivalent to C's scanf(), fscanf() and sscanf() functions, Pascal's read() and readln() function, or Fortran's READ* function. In particular there's no one method that lets you get input from the user as a numeric value.

However, roughly equivalent functionality is scattered across several classes. You first read an input line into a String using DataInputStream.readline() or BufferedReader (in Java 1.1)

Next use the StringTokenizer class in java.util to split the String into tokens. By default StringTokenizer splits on white space (spaces,tabs, carriage returns and newlines), but this is user definable.

For example,

import java.util.StringTokenizer;

class STTest {

  public static void main(String args[]) {
  
    String s = "9 23 45.4 56.7";
    
    StringTokenizer st = new StringTokenizer(s);
    while (st.hasMoreTokens()) {
      System.out.println(st.nextToken());
    }
    
  }
  
}
prints the following output:

9
23
45.4
56.7
Finally you convert these tokens into numbers using the type wrapper classes as described in the next question.

4.3: How do I convert strings to numbers?

You can convert strings into numbers using the Integer, Float, Double and Long type wrapper classes as indicated by the following code snippet:

class ConvertTest {

  public static void main (String args[]) {

    String str;
  
    str = "25";
  
    int i = Integer.valueOf(str).intValue();
    System.out.println(i);
    long l = Long.valueOf(str).longValue();
    System.out.println(l);

    str = "25.6";
  
    float f = Float.valueOf(str).floatValue();
    System.out.println(f);
    double d = Double.valueOf(str).doubleValue();  
    System.out.println(d); 
  
  }
  
}
There are no equivalent Short and Byte classes in Java 1.0. There are in Java 1.1. For shorts and bytes use the Integer class but use the byteValue() or shortValue() methods instead.

4.4: How Do I Call C Code from Java?

First of all for security reasons you can only call external code from an application. You cannot call external code from an applet. (Otherwise all the security would go out the window.) Furthermore all code you write in this way will be non-portable. If these aren't problems for you, check out javah in the Java developer's kit.

4.5: How Do I Call Java from C?

Since Java is not as of yet a true compiled language, the only way to call Java code from C in Java 1.0 is by using the system() call (or your OS's equivalent) to execute the java interpreter with appropriate command line arguments.

In Java 1.1 the Java Native Method Interface in combination with the Invocation API allows native applications to load and access the Java virtual machine.

4.6: How do you do multiple inheritance?

Java does not support multiple inheritance. Instead declare interfaces for each additional class you want to inherit from, and implement those interfaces in your subclass. For more details, see question 6.1 below.

4.7: Can I write objects to and read objects from a file or other stream?

In theory yes, but once again all the coding is up to you. There is no general method for doing this in Java 1.0. The problem is made harder by Java's security features that don't let you forge arbitrary byte streams into objects.

In Java 1.1 a serialization interface has been added to the language. However only objects that explicitly implement the java.io.Serializable interface can be serialized.

4.8: How do I call the native API from Java?

You can do this only in an application, not in an applet. You will need to write some intermediary code in C or another traditional language and call your C code from Java.

4.9: How do I pass a function pointer to a method?

Methods are not first class objects in Java. Only objects and primitive data types can be passed to methods.

Instead you should declare an interface which declares the function you want to pass; for example

public interface Comparable {

  public abstract int compare(Object o1, Object o2);

}
Then declare that your method takes an object of this type. For example,

  public void sort(Object[] o, Comparable c) {
  
    boolean done = false;
    while (!done) {
      done = true;
      for (int i = 0; i < o.length - 1; i++) {
      if (c.compare(o[i], o[i+1]) < 0) {
        swap(o[i], o[i+1]);
        done = false;
      }
    
    }
  
  }
Each class you want to compare then needs its own class which implements Comparable. For example,

public class StringCompare implements Comparable {

  public int compare(Object o1, Object o2) {
  
    String s1 = (String) o1;
    String s2 = (String) o2;
    return s1.compareTo(s2);
    
  }
  
}
It helps that Object is a superclass for all object types.

5: Programming Applets

5.1: Can applets communicate with each other?

At this point in time applets may communicate with other applets running in the same virtual machine. If the applets are of the same class, they can communicate via shared static variables. If the applets are of different classes, then each will need a reference to the same class with static variables. In any case the basic idea is to pass the information back and forth through a static variable.

An applet can also get references to all other applets on the same page using the getApplets() method of java.applet.AppletContext. Once you've got a reference to an applet, you can communicate with it by using its public members.

It is conceivable to have applets in different virtual machines that talk to a server somewhere on the Internet and store any data that needs to be serialized there. Then, when another applet needs this data, it could connect to this same server. Implementing this is non-trivial.

5.2: Can applets launch programs on the server?

Yes, using CGI. Any other implementation would be server dependent. Of course this requires a lot of coding and is non-trivial. A simple way to do this is not built into Java because that would require a special server. One of Java's strengths is that it is http server independent.

A number of organizations have developed special http servers that allow applets or other clients to run Java programs on the server in a secure environment. Most notably Sun's Jeeves implements a servlet interface for this purpose. The W3C's JigSaw implements a similar idea called resource objects.

5.3: Can applets launch programs on the client?

Absolutely not. This would be a security hole big enough to walk three herds of elephants, two marching bands and at least one quarter of the people AT&T laid off through.

5.4: Can I record audio from an applet?

This is what is known as "a third-party opportunity". In other words not this year and probably not next year either. This would make a neat Java plug-in if anyone cares to write one in C.

6: Language Issues

6.1: What does it mean that a class or member is "final"?

A final class can no longer be subclassed. Mostly this is done for security reasons with basic classes like String and Integer. It also allows the compiler to make some optimizations, and makes thread safety a little easier to achieve.

Methods may be declared final as well. This means they may not be overridden in a subclass.

Fileds can be declared final, too. However, this has a completely different meaning. A final field cannot be changed after it's initialized, and it must include an initializer statement where it's declared. For example,

public final double c = 2.998;

It's also possible to make a static field final to get the effect of C++'s const statement or some uses of C's #define, e.g.

public static final double c = 2.998;
 

6.2: What does it mean that a method or field is "static"?

Static variables and methods are instantiated only once per class. In other words they are class variables, not instance variables. If you change the value of a static variable in a particular object, the value of that variable changes for all instances of that class.

Static methods can be referenced with the name of the class rather than the name of a particular object of the class (though that works too). That's how library methods like System.out.println() work.

6.3: What does it mean that a method or class is abstract?

An abstract class cannot be instantiated. Only its subclasses can be instantiated. You indicate that a class is abstract with the abstract keyword like this:

public abstract class Container extends Component {

Abstract classes may contain abstract methods. A method declared abstract is not actually implemented in the current class. It exists only to be overridden in subclasses. It has no body. For example,

public abstract float price();

Abstract methods may only be included in abstract classes. However, an abstract class is not required to have any abstract methods, though most of them do.

Each subclass of an abstract class must override the abstract methods of its superclasses or itself be declared abstract.

For more details, see section 8.1.2.1 of the Java Language Specification.

6.4: What's an interface?

An interface is an idea taken from Objective C. It describes the public methods that a class implements and their calling conventions without saying anything about how those methods are implemented. It is the responsibility of each class that implements an interface to provide code to handle the cases where the methods of the interface are called.

For example suppose you're writing an inventory database. The inventory may include many different items of many different types and classes. However each item in the warehouse needs to be able to tell you its price. Normally you would implement this by having each class extend a common superclass. However that's not always convenient. Instead you can declare an interface called Price with a price() method like this:

public interface Price {

  public float price();

}
Any class which implements the Price interface must contain a method with the signature public float price(). The code of the price() method is included separately in each separate class which implements Price, not in the Price interface itself.

Different classes in your warehouse can each implement the Price interface like this:

public class Monopoly extends BoardGame implements Price {

  // other methods

  public float price() {
    return 14.95;
  }

}
When other code is passed an object, it can test whether the object implements Price with the instanceof operator. For example,

if (o instanceof Price) System.out.println("Subtotal is " + o.price());

In fact, interfaces can be used to tag objects. The java.rmi.Remote interface declares no methods. Its sole purpose is to indicate that an object is a remote object. In general, sub-interfaces of java.rmi.Remote will declare remote methods, however. For example,

public interface Hello extends java.rmi.Remote {

  public String sayHello();

}
public class HelloImpl extends UnicastRemoteServer implements Hello {

  public String sayHello() {
    return "Hello";
  }

}
For more information about the java.rmi package, see http://chatsubo.javasoft.com/current/rmi/index.html or Chapter 14 of my book, Network Programming in Java, from O'Reilly & Associates (available early 1997).

6.5: Why doesn't Java include insert your favorite feature here?

The Java language has been extensively debated and argued about within Sun. Almost every language construct of existing languages has already been considered for inclusion in Java. While there may still be room for addition, it is very unlikely that your pet feature will be added to the language spec if it isn't already there. In a couple of years parameterized types (i.e. templates) may be added to the language. Otherwise the spec is pretty much frozen except for minor changes and bug fixes.

Extensions are planned for the class library though. In particular Sun is working on extensions for 3D, multimedia, telephony, and improved graphics.

6.6: Is Java CORBA compliant?

Not yet. However work is underway for a Java ORB and IDL. http://splash.javasoft.com/JavaIDL/pages/index.html.

6.7: Can I cast an int to an Integer? a float to a Float?

No, you cannot promote a base data type like int or float to an object such as an Integer or a Float. However the proper way to do this isn't very hard. Instead do

int x = 5;
myInteger = new Integer(x);

6.8: How do I version a class?

There is no support for versioning classes in Java 1.0. However in Java 1.1 the serialver tool provides a serialVersionUID for one or more classes you can add to your class as a field. This is used in object serialization.

6.9: Why isn't there operator overloading?

Because C++ has proven by example that operator overloading makes code almost impossible to maintain. In fact there very nearly wasn't even method overloading in Java, but it was thought that this was too useful for some very basic methods like print(). Note that some of the classes like DataOutputStream have unoverloaded methods like writeInt() and writeByte().

6.10: Does Java have pointers?

No, no, a thousand times no. Java does not have pointers, no way, no how, the daily email I get from people who think differently not withstanding.

Java does have references. A reference is an abstract identifier for an object. It is not a pointer. A reference tags a particular object with a name in the Java virtual machine so that the programmer may refer to it. How exactly the virtual machine implements references at the level of machine code is VM-dependent and completely hidden from the programmer in any case. Most VMs including Sun's use handles, not pointers. A handle is a pointer to a pointer. At the level of machine code in the CPU a reference is an address in memory where the address of the object is stored. This way the objects can be moved around in memory and only the master pointer needs to be updated rather than all references to the object. This is completely hidden from the Java programmer, though. Only the implementer of the virtual machine needs to worry about it. Indeed, this is not the only way references can be implemented. Microsoft's VM actually does use pointers rather than handles. Other schemes are possible.

6.11: Does Java pass method arguments by value or by reference?

Java passes all arguments by value, not by reference. However this is one of the few places where the distinction between an object and a reference to an object becomes important. Object and array variables in Java are really references to the object or array. This can make it look like an object is passed by reference if you only modify the fields of the object or array, but do not change the reference itself. For example, consider this program:

import java.awt.Point;

class changePoint {

  public static void main(String args[]) {
  
    Point p1 = new Point(0, 0);
    changePoint(p1);
    System.out.println(p1);
    
  }
  
  static void changePoint(Point p) {
  
    p.x = 38;
    p.y = 97;

  }

}
It prints:

java.awt.Point[x=38,y=97]
Therefore the point has been changed. However the reference, which is what was really passed, has not been changed. To see that consider the following program.

import java.awt.Point;


class dontChangePoint {

  public static void main(String args[]) {
  
    Point p1 = new Point(0, 0);
    dontChangePoint(p1);
    System.out.println(p1);
    
  }
  
  static void dontChangePoint(Point p) {
  
    p = new Point(38, 97);

  }

}
It prints:


java.awt.Point[x=0,y=0]
What happened in this example was that a copy of the reference p1 was passed to the dontChangePoint() method. A new Point object was then assigned to that copy. However this did not change the old reference in the main method. In the previous example the reference p in the changePoint() method and p1 in the main() method both referred to the same object. In this example p and p1 refer to different objects after the new Point is assigned to p.

6.12: Are there parameterized types (templates)?

Not in Java 1.0 or 1.1. However this is being seriously considered for future versions.

6.13: How does garbage collection work?

Current implementations of Java use a mark and sweep garbage collector. Reference counting is not used. Thus circular linked lists do not lead to memory leaks. It is theoretically possible that future versions of Java will use some other garbage collection algorithm.

6.14: PERFORM and BECOME

Sorry Smalltalkers. There's no equivalent for PERFORM or BECOME in Java 1.0. These would probably open security holes. There are workarounds for some things you might want to do using interfaces.

In Java 1.1 the Core Reflection API and the java.lang.reflect package provides most of the functionality you need. However this API mostly unavailable to applets due to security issues.

7: java.awt

7.1: What Does AWT Stand For?

So far I've heard it claimed that AWT stands for:

I do not know which if any of these are correct, but Abstract Window Toolkit seems to be the most popular.

7.2: What are peer "classes"?

Peer classes exist mainly for the convenience of the people who wrote the Java environment. They help in translating between the AWT user interface and the native (Windows, OpenWindows, Mac etc.) interfaces. Unless you're porting Java to a new platform you shouldn't have to use them.

7.3: Can you explain how events are passed?

The following applies to Java 1.0 only. The event mechanism has changed completely in Java 1.1, though the following is retained for backwards compatibility.

Components are subclasses of java.awt.Component. Examples of components include buttons, scrollbars, textfields, frames, windows, dialogs, panels, canvases, and checkboxes. One subclass of java.awt.Component is java.awt.Container. A container is a component which can hold other components. Examples of containers include Frames, Windows, Dialogs, Panels and Applets. An applet is a subclass of Panel. Panel is a subclass of Container. Container is a subclass of Component. Therefore an applet is both a container and a component.

When the user clicks the mouse, types on the keyboard, drags and drops, or does any of a few other things, the operating system produces an event. This event is passed to Java, and the Java runtime tries to figure out which component the event was intended for.

The Java runtime then passes that event to the handleEvent(Event e) method of some Component. The Component's handleEvent() method contains a big if-else statement to look at the type of event and respond appropriately. What the handleEvent() method does depends on the type of component. Generally some events are ignored and other events are passed to methods that know how to respond to those events. For instance a MOUSE_DOWN event is passed to mouseDown(). The table below shows the events the default handleEvent() can deal with. When one of these events occurs, handleEvent() passes it and various other information to the specified method.

Event                      Method Called
--------------------------------------------------------
Event.MOUSE_ENTER:         mouseEnter(evt, evt.x, evt.y)
Event.MOUSE_EXIT:          mouseExit(evt, evt.x, evt.y)
Event.MOUSE_MOVE:          mouseMove(evt, evt.x, evt.y)
Event.MOUSE_DOWN:          mouseDown(evt, evt.x, evt.y)
Event.MOUSE_DRAG:          mouseDrag(evt, evt.x, evt.y)
Event.MOUSE_UP:            mouseUp(evt, evt.x, evt.y)
Event.KEY_PRESS:           keyDown(evt, evt.key)
Event.KEY_ACTION:          keyDown(evt, evt.key)
Event.KEY_RELEASE:         keyUp(evt, evt.key)
Event.KEY_ACTION_RELEASE:  keyUp(evt, evt.key)
Event.ACTION_EVENT:        action(evt, evt.arg)
Event.GOT_FOCUS:           gotFocus(evt, evt.arg)
Event.LOST_FOCUS:          lostFocus(evt, evt.arg)
By default each of these methods does nothing. Furthermore, by default all other events do nothing. If you want to do something when one of the above events occurs in your component, subclass the component and override the appropriate method. For example, to create a Canvas that prints the message "Don't Tread on Me!" every time the user clicks on it, use the following subclass of Button:

public class noTread extends Canvas {

  public boolean mouseDown(Event e, int x, int y) {
    System.out.println("Don't Tread on Me!");
    return true;
  }
  
}
Button, Choice, TextField, and Checkbox are special because of how they're implemented as native widgets. They do not see MOUSE_DOWN, MOUSE_UP, KEY_PRESS, and other such events. Rather they receive one event and one event only: Event.ACTION_EVENT. When a Button is pressed, the user hits return in a TextField, the user double clicks on a List item, clicks a Checkbox, or selects from a Choice, an ACTION_EVENT is generated. If you haven't overridden handleEvent(), this is passed to the action() method of the component's container. These four components are the only things which generate ACTION_EVENTs. No other component will generate an ACTION_EVENT.

Each event handler method, including handleEvent(), returns true if the event was completely handled and false if it was not. If false is returned, then the event is passed to the component's container to see if the container wants to process the event.

If you want to respond to a different set of events, you must override handleEvent(). You can either completely replace it or just add the extra events you want to handle and then return super.handleEvent() for other types of events. For example to print all the events as they happen in your applet you might use this handleEvent() method:

public boolean handleEvent(Event e, int x, int y) {
  System.out.println(e);
  return super.handleEvent(e, x, y);
}
mouseDown(), mouseUp(), keyDown(), and all the other event methods would still be called by the superclass. If you don't handle an event in the handleEvent() method, return super.handleEvent(e) to give your superclass an opportunity to process the event. In this case, we've handled the event but not completely so we still let the superclass process it by returning super.handleEvent(e, int x, int y).

The return value of handleEvent() is important. If handleEvent() returns true, that means the event has been fully digested and no further processing is needed. On the other hand if handleEvent() returns false, then the event is passed to the component's container to be handled.

Note that this all works for any component at all. You'll most commonly override these methods in a subclass of Applet or perhaps Frame. However the same methods and techniques apply to all subclasses of Component.

The API documentation confuses the issue because of the ambigious use of the word parent. In object-oriented circles the word parent usually refers to the superclass. However in the context of the AWT, the word parent refers to the container that contains a component. Thus in the statement:

return true if the event has been handled and no further action is necessary; false if the event is to be given to the component's parent
the word parent means the component's container, not its superclass.

You must distinguish between the container/component hierarchy and the inheritance hierarchy. By default, the way an event travels has nothing to do with the inheritance hieararchy. If you override an event handling method, then events passed to that method will not be passed to a component's superclass unless you specifically ask them to be. However, in most cases your handleEvent() method will return super.handleEvent() to give the superclass a crack at handling the event rather than simply returning false.

To sum up, when you write a subclass of Component, you can either respond to specific events by overriding the methods that correspond to those events, such as mouseDown(); or you can respond to all events by overriding handleEvent(). Each of your event handling methods must return a boolean. Return true when an event has been completely processed, and return false when you want the component's container to try to handle the event. When overriding handleEvent(), you also have an option to return super.handleEvent() to ask the superclass to handle the event and decide whether or not to pass it along to the component's container.

7.4: Clipping

java.awt.Graphics.clipRect(int, int, int, int) and related methods are hopelessly flawed, at least as of 1.0. Ignore them completely.

Instead if you need to do clipping, create separate offscreen Images for each clipping region. Each Image should be the size of the clipping region you desire. Draw into those offscreen images, and then copy them onto the appropriate section of the of your applet window using java.awt.Graphics.drawImage(). Some coordinate conversion will almost certainly be necessary.

If the background image isn't a simple color then you'll first need to copy the appropriate part of that image to your offscreen clipping Image. You can do this by drawing your background Image into your offscreen region with Graphics.drawImage() and a suitable shifting of coordinates.

This all works for rectangular regions only since all Images are rectangular. More complicated geometries can be faked if all but one section contains only simple colors.

7.5: How do I change the thickness of the line?

Java 1.1 and earlier only support 1 pixel wide lines. There's no easy way around this. You can, however, draw multiple, parallel lines offset from each other by one pixel:

  public void paint(Graphics g) {

    int x1=5;
    int x2=278;
    int y1=8;
    int y2=93;
    

    // Draw a ten pixel thick line
    for (int i = -5; i < 5; i++) {
      g.drawLine(x1+i,y1+i,x2+i,y2+i);
    }

  }
This isn't perfect. The ends of the line are excessively tapered. You really need to take the slope of the line into account when incrementing x and y, but this should give you the idea. If you're doing a lot of this, you can write a class or method to do it for you.

There are other hacks you can use. For example, a thick line is essentially a filled rectangle. Therefore you can calculate the endpoints of the rectangle and use fillPolygon() to draw it.

The real solution is going to have to wait for a more complete graphics API for Java, possibly in Java 1.2.

7.6: What fonts does Java support?

Java implementations are guaranteed to have the fonts Helvetica, Courier, TimesRoman, and Symbol or some reasonable facsimile thereof. Whether fonts installed on the client are available to Java is implementation depenedent. You can get a String array of the names of the available fonts by calling the getFontList() method from java.awt.Toolkit. For example,

String[] fonts = Toolkit.getDefaultToolkit().getFontList()

8: java.io

8.1:How do I read data from a file?

There are a number of ways to read data from a file. If you're reading a file as raw binary data, you open a file using a FileInputStream(String) constructor and use one of the various read() methods to read the data into an array of bytes. For example the following program reads raw data from a file specified on the command line. It then writes the same data to the standard output.

import java.io.*;

class ReadRawData {

  public static void main (String args[]) {

    boolean done = false;
    byte b[] = new byte[1024];
    int num_bytes = 0;

    FileInputStream fin = null;
    try {
      fin = new FileInputStream(args[0]);
    }
    catch(ArrayIndexOutOfBoundsException e) {
      System.out.println("You have to give me the name of a file to open.");
      System.exit(0);   
    }
    catch (FileNotFoundException e) {
      System.out.println("Could not open input file " + args[0]);
      System.exit(0);
    }
    catch(IOException e) {
      System.out.println("Error while opening input file" + args[0]);
      System.exit(0);
    }
    catch (Exception e) {
      System.out.println("Unexpected exception: " + e);
      System.exit(0);     
    }

    try {
      num_bytes = fin.read(b);
    } 
    catch(IOException e) {
      System.out.println("Finished Reading: " + e);
      done = true;
    }
    catch (Exception e) {
      System.out.println("Unexpected exception: " + e);
      System.exit(0);     
    }
      
    while(!done) {
      System.out.write(b, 0, num_bytes);
      try {
        num_bytes = fin.read(b);
      }
      catch(IOException e) {
        System.out.println("Finished Reading: " + e);
        done = true;
      }
      catch (Exception e) {
        System.out.println("Unexpected exception: " + e);
        System.exit(0);     
      }
      if (num_bytes == -1) done = true;
   }  // end while
    
 }  // end main
  
} // end ReadRawData
On the other hand if you're reading a text file in Java 1.0 you'll probably want to use a DataInputStream which gives you a readLine() method that returns successive lines of the file as Java Strings. You can then process each String as you see fit.

// Implement the Unix cat utility in java

import java.io.*;

class cat  {

  public static void main (String args[]) {
  
    String thisLine;
 
   //Loop across the arguments
   for (int i=0; i < args.length; i++) {
 
     //Open the file for reading
     try {
       FileInputStream fin =  new FileInputStream(args[i]);
       // now turn the FileInputStream into a TextFileStream

       try {
         DataInputStream myInput = new DataInputStream(fin);
  
         try {
           while ((thisLine = myInput.readLine()) != null) {  // while loop begins here
             System.out.println(thisLine);
           } // while loop ends here
         }
         catch (Exception e) {
           System.out.println("Error: " + e);
         }
      } // end try
      catch (Exception e) {
        System.out.println("Error: " + e);
      }
  
    } // end try
    catch (Exception e) {
      System.out.println("failed to open file " + args[i]);
      System.out.println("Error: " + e);
    }
  } // for ends here
  
} // main ends here

}
This code emulates the Unix "cat" command. Given a series of filenames on the command line it concatenates the files onto the standard output.

In Java 1.1 DataInputStream.readLine() is deprecated. You should use a BufferedReader instead.

8.2: How do I write data to a file?

You should only assume you'll be able to write to a file from an application. Although it may be possible to write data into a file from an applet if the browser viewing the applet is HotJava, this ability will generally be disabled. From within Netscape there is no way for an applet to write to a file on the local hard drive.

Within an application, however, file access is straight-forward. There are several ways but here is a simple example using formatted output streams:

import java.io.*;

class PrintToAFile  {

  public static void main (String args[]) {

    //First open the file you want to write into
    try {
      FileOutputStream fout =  new FileOutputStream("test.out");

      // now convert the FileOutputStream into a PrintStream

      PrintStream myOutput = new PrintStream(fout);

      // Now you're able to use println statements just as if you were using System.out.println
      // to write to the terminal 

      myOutput.println("Hello There!");
      myOutput.println(1 + " + " + 1 + " = " + (1+1));
    }
    catch (IOException e) {
      System.out.println("Error opening file: " + e);
      System.exit(1);
    }

  } // main ends here

}
There are a number of other things to note about writing data to a file. This program creates or opens a file called "test.out" in the same directory as the running program. However you could pass it a full pathname to a file in a different directory instead.

You should also learn about the DataOutputStream class and the write() method when you get a chance. Da