Search

The Online Encyclopedia and Dictionary

 
     
 

Encyclopedia

Dictionary

Quotes

   
 

Java programming language

Java is an object-oriented programming language developed initially by James Gosling and colleagues at Sun Microsystems. The language, initially called Oak (named after the oak trees outside Gosling's office), was intended to replace C++, although the feature set better resembles that of Objective C. Java should not be confused with JavaScript, which shares only the name and a similar C-like syntax. Sun Microsystems currently maintains and updates Java regularly.

Specifications of the Java language, the JVM (Java Virtual Machine) and the Java API are community-maintained through the Sun-managed Java Community Process.

Contents

History

Main article: History of Java

Java was developed in 1991 by James Gosling and other Sun engineers, as part of the Green Project. After first being made public in 1994, it achieved prominence following the announcement at 1995's SunWorld that Netscape would be including support for it in their Navigator browser.

Overview

There were four primary goals in the creation of the Java language:

  • It should use the object-oriented programming methodology.
  • It should allow the same program to be executed on multiple computer platforms.
  • It should contain built-in support for using computer networks.
  • It should be designed to execute code from remote sources securely.

Especially for the latter part, however sometimes extensions are required, like Corba or OSGi.

Language characteristics

Object orientation

The first characteristic, object orientation ("OO"), refers to a method of programming and language design. Although there are many interpretations of OO, one primary distinguishing idea is to design software so that the various types of data it manipulates are combined together with their relevant operations. Thus, data and code are combined into entities called objects. An object can be thought of as a self-contained bundle of behavior (code) and state (data). The principle is to separate the things that change from the things that stay the same; often, a change to some data structure requires a corresponding change to the code that operates on that data, or vice versa. This separation into coherent objects provides a more stable foundation for a software system's design. The intent is to make large software projects easier to manage, thus improving quality and reducing the number of failed projects.

Platform independence

The second characteristic, platform independence, means that programs written in the Java language must run similarly on diverse hardware. One should be able to write a program once and run it anywhere.

This is achieved by most compilers by compiling the Java language code "halfway" to bytecode—simplified machine instructions specific to the Java platform. The code is then run on a virtual machine (VM), a program written in native code on the host hardware that translates generic Java bytecode into usable code on the hardware. Further, standardized libraries are provided to allow access to features of the host machines (such as graphics, threading and networking) in unified ways.

There are also implementations of Java compilers that compile to native object code, such as GCJ, removing the intermediate bytecode stage, but the output of these compilers can only be run on a single architecture.

Sun's license for Java insists that all implementations be "compatible". This resulted in a legal dispute with Microsoft after Sun claimed that the Microsoft implementation did not support the RMI and JNI interfaces and had added platform-specific features of their own. Sun sued and won both damages (some $20 million dollars) and a court order enforcing the terms of the license from Sun. In response, Microsoft decided to no longer ship Java with Windows, and stock versions of Internet Explorer in such versions of Windows will break for Web sites using Java applets. However, Sun and others have made available Java run-time systems at no cost for those versions of Windows without Java.

The first implementations of the language used an interpreted virtual machine to achieve portability. These implementations produced programs that ran more slowly than programs written in C or C++, so the language suffered a reputation for producing slow programs. More recent implementations of the Java VM produce programs that run much faster than before, using multiple techniques.

The first technique is to simply compile directly into native code like a more traditional compiler, skipping bytecodes entirely. This achieves great performance, but at the expense of portability. Another technique, known as just-in-time compilation (JIT), compiles the Java bytecodes into native code at the time that the program is run. More sophisticated VMs use dynamic recompilation, in which the VM can analyze the behavior of the running program and selectively recompile and optimize critical parts of the program. Both of these techniques allow the program to take advantage of the speed of native code without losing portability.

Portability is a technically difficult goal to achieve, and Java's success at that goal has been mixed. Although it is indeed possible to write programs for the Java platform that behave consistently across many host platforms, the large number of available platforms with small errors or inconsistencies led some to parody Sun's "Write once, run anywhere" slogan as "Write once, debug everywhere".

Platform-independent Java is, however, very successful with server-side applications, such as web services, servlets, or Enterprise Java Beans - and meanwhile also with Embedded systems based on OSGi, using Embedded Java environments.

Automatic garbage collection

One major problem with languages such as C++ is the need for manual memory management. In C++, memory must be allocated by the programmer to create an object, then deallocated to delete the object. Often a programmer forgets or is unsure when to deallocate, leading to a memory leak, where a program consumes more and more memory without cleaning up after itself. Even worse, if a region of memory is deallocated twice, the program can become unstable and crash.

In Java, this problem is solved by automatic garbage collection. Objects are created and placed at an address on the heap. The program or other objects can reference an object by holding a reference to its address on the heap. When no references to an object remain, the Java garbage collector automatically deletes the object, freeing memory and preventing a memory leak. Memory leaks, however, can still occur if a programmer's code holds a reference to an object that is no longer needed—in other words, they still occur but at higher conceptual levels. But on the whole, Java's automatic garbage collection makes creation and deletion of objects in Java much easier and safer than in C++.

Interfaces and classes

One thing that Java accommodates is creating an interface which classes can then implement. For example, you can create an interface like this:

public interface Deleteable {
    void delete();
}

This code says that any class that implements the interface Deleteable will have a method named delete(). The exact implementation and function of the method are determined by each class. There are many uses for this concept; for example, the following could be a class:

public class Fred implements Deleteable {
     //Must include the delete () method to satisfy the Deleteable interface
     public void delete() {
     }
     //Can also include other methods
     public void doOtherStuff() {
     }
}

Then, in another class, the following is legal code:

public void deleteAll (Deleteable[] list) {
     for (int i = 0; i < list.length; i++)
          list[i].delete();
}

because any objects in the array are guaranteed to have the delete() method.

The purpose is to separate the details of the implementation of the interface from the code that uses the interface. For example, the Collection interface lists a bunch of methods that any collection of data might want to implement, like getting data or adding data, but a specific collection could be an array, or a linked list.

The feature is a result of compromise. The designers of Java decided not to support multi-inheritance but interfaces can be used to simulate multi-inheritance in some occasions.

Interfaces in Java work differently than in other object-oriented programming languages — Java interfaces behave much more like the concept of the Objective-C protocol.

Encoding independence

The language distinguishes between bytes and characters. Characters are stored internally using UTF-16, and Java program source may contain any Unicode character.

Miscellaneous

Although the language has special syntax for them, arrays and strings are not primitive types: they are objects.

Criticism

Most consider Java technology to deliver reasonably well on all these promises. The language is not, however, without drawbacks.

Java was designed with emphasis on security and portability, so low-level features like hardware-specific data types and pointers to arbitrary memory were deliberately omitted. These features must be accessed by calling C code using the Java Native Interface (JNI), which is inconvenient and can be a performance bottleneck.

Some programmers miss multiple inheritance, which is available in many other languages.

The performance of Java programs can be difficult to predict due to dynamic compilation and garbage collection, and Java programs often use more memory than programs written in lower-level languages.

GUI applications written using Java's AWT and/or Swing components and running on older JREs usually don't look like native applications due to the use of a Java-specific cross platform look and feel. Alternative widget components such as SWT or GTK employ native widgets on some platforms for a look and feel that is closer to native GUI applications. Recent JRE versions (from 1.5 onwards) also use native widgets on some platforms.

Some parts of the standard Java libraries are considered excessively complicated, or badly designed, but can't be changed due to the need for backward compatibility.

Advocates of scripting languages tend to think Java code is excessively verbose due to type declarations and casts.

Non-object-oriented programming has to be simulated using static methods. This is more awkward than in languages that directly support it.

The division between primitive types and objects is disliked by programmers familiar with languages such as Smalltalk and Ruby where everything is an object. The JDK 5.0 releases blurs this a little with the introduction of automatic boxing and unboxing of primitive types.

Versions of Java before JDK 5.0 required many explicit casts to be written due to the lack of support for generic types. The implementation of generic types is also considered controversial by some but was approved by the Java Community Process.

Input/Output

Versions of Java prior to 1.4 only supported stream-based blocking I/O . This required a thread per stream being handled, as no other processing could take place while the active thread blocked waiting for input or output. This was a major scalability and performance issue for anyone needing to implement any Java network service. Since the introduction of NIO (New IO) in Java 1.4, this scalability problem has been rectified by the introduction of a non-blocking I/O framework (though there are a number of open issues in the NIO API as implemented by Sun).

The non-blocking IO framework, though considerably more complex than the original blocking IO framework, allows any number of "channels" to be handled by a single thread. The framework is based on the Reactor Pattern.

APIs

Sun has defined three platforms targeting different application environments and segmented many of its APIs so that they belong to one of the platforms. The platforms are:

The classes in the Java APIs are organized into separate groups called packages. Each package contains a set of related interfaces, classes and exceptions. Refer to the separate platforms for a description of the packages available.

The set of APIs is controlled by Sun Microsystems in cooperation with others through its Java Community Process program. Companies or individuals participating in this process can influence the design and development of the APIs, but Sun retains ownership and control of the APIs. This process has been a subject of controversy.

In 2004, IBM and BEA publicly supported the notion of creating an official open source implementation of Java but as of 2005, Sun Microsystems has refused.

Version history

The Java language has undergone several changes since JDK 1.0 as well as numerous additions of packages to the standard library:

  • 1.0 (1996) — Initial release.
  • 1.1 (1997) — Major additions, notably inner classes .
  • 1.2 (1998) — Major changes were made to the API (where reflection was introduced) and Sun's JVM (which was equipped with a JIT compiler), but these had little impact on the language itself: the only change to the Java language was the addition of the keyword strictfp. This and subsequent releases were rebranded "Java 2", but this had no effect on any software version numbers.
  • 1.3 (2000) — minor changes and fixes.
  • 1.4 (2002) — As of 2004, the most widely used version. Added the assert keyword.
  • 5.0 (2004) — (Originally numbered 1.5, which is still used as the internal version number.) Added a number of significant new language features. One in partcular, Annotations has been argued to be modeled on Microsoft's C#, which was itself modeled on earlier versions of Java:
    • Generics — Provides compile-time type safety for collections and eliminates the need for most typecasts.
    • Autoboxing/unboxing — Automatic conversions between primitive types (such as int) and wrapper types (such as Integer).
    • Metadata — also called Annotations , allows language constructs such as classes and methods to be tagged with additional data, which can then be processed by metadata-aware utilities
    • Enumerations — the enum keyword creates a typesafe, ordered list of values (such as Day.monday, Day.tuesday, etc.). Previously this could only be achieved by non-typesafe constant integers or manually constructed classes (typesafe enum pattern).
    • Enhanced for loop — the for loop syntax is extended with special syntax for iterating over each member of an array or Collection, using a construct of the form:
for (Widget w: box) {
   System.out.println(w);
}

This example iterates over box, assigning each of its items in turn to the variable w, which is then printed to standard output.

  • 6.0 (currently in development, estimated release date 2006) — Also known by its project name Mustang[1] https://mustang.dev.java.net/. An early development version of the Java SDK version 6.0 (internal version number 1.6) was made available in November 2004. New builds including enhancements and bug fixes are released on a regular basis.
  • 7.0 — The next major release after Mustang, project name Dolphin, is in the early planning stages.[2] http://weblogs.java.net/blog/editors/archives/2004/09/evolving_a_lang.html

In addition to the language changes, much more dramatic changes have been made to the Java class library over the years, which has grown from a few hundred classes in version 1.0 to over three thousand in Java 5.0. Entire new APIs, such as Swing and Java2D, have been introduced, and many of the original 1.0 classes and methods have been deprecated.

Java Runtime Environment

The Java Runtime Environment or JRE is the software required to run any application deployed on the Java platform. End-users commonly use a JRE in software packages and plug-ins. Sun also distributes a superset of the JRE called the Java 2 SDK (more commonly known as the JDK), which includes development tools such as the Java compiler, Javadoc , and debugger.

Components of the JRE

  • Java libraries - which are the compiled byte codes of source developed by the JRE implementor to support application development in Java. Examples of these libraries are:
  • A platform dependent implementation of Java virtual machine (JVM) which is the means by which the byte codes of the Java libraries and third party applications are executed
  • Plugins, which enable applets to be run in web browsers
  • Java Webstart, which allows Java applications to be efficiently distributed to end users across the Internet
  • Licensing and documentation

Extensions and related architectures

Extensions and architectures closely tied to the Java programming language include:

  • J2EE (Enterprise edition)
  • J2ME (Micro-Edition for PDAs and cellular phones)
  • JMF (Java Media Framework)
  • JNDI (Java Naming and Directory Interface)
  • JSML (Java Speech API Markup Language)
  • JDBC (Java Database Connectivity)
  • JAIN (Java API for Integrated Networks)
  • JDMK (Java Dynamic Management Kit)
  • Jini (a network architecture for the construction of distributed systems)
  • Jiro
  • JXTA (open source-based peer-to-peer infrastructure)
  • JavaSpaces
  • JMI (Java Metadata Interface)
  • JMX (Java Management Extensions)
  • JSP (JavaServer Pages)
  • JSF (JavaServer Faces)
  • JNI (Java Native Interface)
  • J3D (A high level API for 3D graphics programming)
  • JOGL (A low level API for 3D graphics programming, using OpenGL)
  • OSGi Dynamic Service Management and Remote Maintenance

Hello World

// The source file must be named HelloWorld.java
public class HelloWorld
{
    // The main method is passed an array of command-line parameters
    public static void main(String[] args)
    {
        System.out.println("Hello world!");
    }
}

Related free software

Compilers and JVMs

  • GCJ, a Java compiler that is part of GCC, the GNU Compiler Collection
  • Jikes, a Java compiler originally developed by IBM
  • GNU Classpath, GNU's non-compatible replacement for Sun's implementation of the Java class libraries
  • Kaffe, a clean room implementation, non-compatible of the Java virtual machine with associated class libraries
  • SableVM, a Java Virtual Machine meant to be robust, efficient and portable
  • IKVM
  • SuperWaba, a Java-subset virtual machine, with a minimalistic design suitable for PDA programming

IDEs

Developer Tools

  • Jarhoo http://www.jarhoo.com/ helps resolve classpath issues by providing details of Jar files containing a class causing NoClassDefFoundError or ClassNotFoundException problems
  • The Jakarta Project produces free software in Java, especially tools for building web applications
  • JUnit, a widely used framework for creating automated unit tests
  • JSwat, a standalone, graphical Java debugger
  • Spring Framework , a framework for developing Java web applications
  • Struts, a framework for developing Java web applications
  • Javassist
  • Byte Code Engineering Library
  • JMangler
  • Geronimo , a compatible implementation of J2EE being created within the Apache Software Foundation

See also

External links

Sun

  • Official Java home site http://java.sun.com/
  • The Java Language Specification, 2nd edition http://java.sun.com/docs/books/jls/second_edition/html/jTOC.doc.html Authoritative description of the Java language
  • J2SE API reference, v1.4.2 http://java.sun.com/j2se/1.4.2/docs/api/
  • J2SE API reference, v5.0 http://java.sun.com/j2se/1.5.0/docs/api/
  • Sun's tutorial on Java Programming http://java.sun.com/docs/books/tutorial/
  • Original Java whitepaper http://java.sun.com/docs/white/langenv/, 1996

Frameworks

  • OSGi: Dynamic Service Management http://www.osgi.org

General

  • Newsgroup comp.lang.java news:comp.lang.java (Google Groups link http://groups.google.com/groups?group=comp.lang.java), and its FAQ http://www.ibiblio.org/javafaq/javafaq.html
  • Javapedia project http://wiki.java.net/bin/view/Javapedia/
  • The Java Wiki http://jinx.swiki.net/
  • A Java glossary http://mindprod.com/jgloss/jgloss.html
  • Java Basics Manual http://www.cookienest.com/content/manual-javabasics.php
  • Thinking in Java http://www.bruceeckel.com/, by Bruce Eckel
  • Java-API with examples http://en.pure-java.de/
  • Java: Cornerstone of the Global Network Enterprise http://ei.cs.vt.edu/~history/Youmans.Java.html
  • How to Think Like a Computer Scientist http://ibiblio.org/obp/thinkCS/ Java version
  • Vulnerabilities in Java Environments http://www.illegalaccess.org/

Historical

  • Java(TM) Technology: The Early Years http://java.sun.com/features/1998/05/birthday.html
  • A Brief History of the Green Project http://java.sun.com/people/jag/green/
  • Java Was Strongly Influenced by Objective-C http://www.cs.umd.edu/users/seanl/stuff/java-objc.html
  • The Java Saga http://www.wired.com/wired/archive/3.12/java.saga.html
  • A history of Java http://ei.cs.vt.edu/~wwwbtb/book/chap1/java_hist.html

Criticism

  • Java's Cover http://www.paulgraham.com/javacover.html by Paul Graham
  • Java: Slow, ugly and irrelevant (Salon) http://www.salon.com/tech/col/garf/2001/01/08/bad_java/
  • java sucks http://www.jwz.org/doc/java.html, by Jamie Zawinski
  • Free But Shackled — The Java Trap http://www.gnu.org/philosophy/java-trap.html, by Richard Stallman, and James Gosling's response http://today.java.net/jag/page7.html#59 (third item down)
  • The Dark Side of Java http://www.idinews.com/darkside.pdf (PDF) by Conrad Weisert
  • Why I Am Not A Java Programmer http://magnonel.guild.net/~schwern/papers/Why_I_Am_Not_A_Java_Programmer/why.htm
    l
    (mirror http://mungus.schwern.org/~schwern/papers/Why_I_Am_Not_A_Java_Programmer/why.htm
    l
    )

Third-party software

  • beanshell http://www.beanshell.org/ An interpreted implementation of Java, which may be used as a shell or an embedded extension language
  • cajo https://cajo.dev.java.net/ A simple, powerful, and free framework; for transparent, dynamic cooperation, between Java Virtual Machines
  • SuperWaba, a Java-like virtual machine http://www.superwaba.com.br/
  • A pure java desktop http://www.jdistro.com/
  • Java on PocketPC http://www.vikdavid.com/mobile/
  • JCreator official website http://www.jcreator.com/
  • Netbeans official website http://www.netbeans.org/
  • [http://webdeveloper.pl Mobile and Internet Solution for Programmers

Java portals, magazines and content sites

  • TheServerSide.com http://www.theserverside.com/ A popular Java J2EE portal
  • Javalobby http://www.javalobby.org/ A popular forum for Java discussions
  • Java.Net http://www.java.net/ A site for Java articles and upcoming projects
  • OnJava.com http://www.onjava.com/ An oreilly site for Java with many good Java articles
  • IndicThreads.com http://www.indicthreads.com/ An upcoming portal for Java and J2EE
  • JavaPro magazine http://www.javapro.com/ A popular java magazine
  • JavaWorld magazine http://www.javaworld.com/ A popular java magazine
  • Java KB http://www.JavaKB.com/ Offers Java discussions, news, articles, and an open source project directory.
  • JavaRSS.com http://www.javarss.com/ A Java portal of Java websites rich in Java News, Java
  • Java Game Development http://www.javagamedevelopment.net/ Daily news and articles on Java game development.

Articles, Java Blogs, Java Groups and Java Forums.

Last updated: 05-02-2005 17:51:01
Last updated: 05-03-2005 17:50:55