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. 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.



Early history

Missing image
Duke, Java's mascot

The Java platform and language began as an internal project at Sun Microsystems in the December 1990 timeframe. Patrick Naughton, an engineer at Sun, had become increasingly frustrated with the state of Sun's C++ and C APIs and tools. While considering moving to NeXT, Patrick was offered a chance to work on new technology and thus the Stealth Project was started.

The Stealth Project was soon renamed to the Green Project with James Gosling and Mike Sheridan joining Patrick Naughton. They, together with some other engineers, began work in a small office on Sand Hill Road in Menlo Park, California to develop a new technology. The team originally considered C++ as the language to use, but many of them as well as Bill Joy found C++ and the available APIs problematic for several reasons.

Their platform was an embedded platform and had limited resources. Many members found that C++ was too complicated and developers often misused it. They found C++'s lack of garbage collection to also be a problem. Security, distributed programming, and threading support was also required. Finally, they wanted a platform that could be easily ported to all types of devices.

According to the available accounts, Bill Joy had ideas of a new language combining the best of Mesa and C. He proposed, in a paper called Further, to Sun that its engineers should produce an object-oriented environment based on C++. James Gosling's frustrations with C++ began while working on Imagination, an SGML editor. Initially, James attempted to modify and extend C++, which he referred to as C++ ++ -- (which is a play on the name of C++ meaning 'C++ plus some good things, and minus some bad things'), but soon abandoned that in favor of creating an entirely new language, called Oak named after the oak tree that stood just outside his office.

Like many stealth projects working on new technology, the team worked long hours and by the summer of 1992, they were able to demo portions of the new platform including the Green OS, Oak the language, the libraries, and the hardware. Their first attempt focused on building a PDA-like device having a highly graphical interface and a smart agent called Duke to assist the user.

The device was named Star7 after a telephone feature activated by *7 on a telephone keypad. The feature enabled users to answer the telephone anywhere. The PDA device itself was demonstrated on September 3, 1992.

In November of that year, the Green Project was spun off to become a wholly owned subsidiary of Sun Microsystems: FirstPerson, Inc. The team relocated to Palo Alto. The FirstPerson team was interested in building highly interactive devices and when Time Warner issued an RFP for a set-top box, FirstPerson changed their target and responded with a proposal for a set-top box platform. However, the cable industry felt that their platform gave too much control to the user and FirstPerson lost their bid to SGI. An additional deal with The 3DO Company for a set-top box also failed to materialize. FirstPerson was unable to generate any interest within the cable TV industry for their platform. Following their failures, the company, FirstPerson, was rolled back into Sun.

Java meets the Internet

In June and July of 1994, after a three-day brainstorming session with John Gage, James Gosling, Bill Joy, Patrick Naughton, Wayne Rosing, and Eric Schmidt, the team re-targeted yet again its efforts, this time to use the technology for the Internet. They felt that with the advent of the Mosaic browser, the Internet was on its way to evolving into the same highly interactive vision that they had had for the cable TV network. Patrick Naughton wrote a small web browser, WebRunner, as a prototype. WebRunner would later be renamed HotJava.

It was also in 1994 that Oak was renamed Java. An IP (intellectual property) search revealed that Oak had already been trademarked by a video adaptor card manufacturer so the team searched for a new name. The name Java was coined at a local coffee shop frequented by some of the members. It is not clear whether the name is an acronym or not. Most likely, it is not, however some accounts claim that it stands for the names of James Gosling, Arthur Van Hoff, and Andy Bechtolsheim. Others, that it is an acronym for Just Another Vague Acronym.

In October of 1994, HotJava and the Java platform was demoed for Sun executives. Java 1.0a was made available for download in 1994, but the first public release of Java and the HotJava web browser came on May 23, 1995, at the SunWorld conference. The announcement was made by John Gage, the Director of Science for Sun Microsystems. His announcement was accompanied by a surprise announcement by Marc Andreessen, Executive Vice President of Netscape, that Netscape would be including Java support in its browsers. In January of 1996, the JavaSoft business group was formed by Sun Microsystems to develop the technology.

The College Board currently administers an Advanced Placement exam in Computer Science, which tests knowledge in Java and object oriented programming. The exam also tests knowledge on the Marine Biology Simulation Case Study a program written in Java. The exam switched from C++ to Java as its featured programming language in the 2003-2004 school year.

Version history

Missing image
Java Web Start, introduced in Java 2, allows provisioning applications over the web by clicking a desktop icon or a link on a website.

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 (December 4, 1998) — Codename Playground. 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 (May 8, 2000) — Codename Kestrel. Minor changes and fixes.
  • 1.4 (February 13, 2002) — Codename Merlin. As of 2004, the most widely used version. Added the assert keyword.
  • 5.0 (September 29, 2004) — Codename Tiger. (Originally numbered 1.5, which is still used as the internal version number.) Added a number of significant new language features. One in particular, 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)

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) — Codename Mustang ( 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 — Codename Dolphin. As of 2005, this is in the early planning stages.[1] (

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.

Language characteristics

There were five 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.
  • It should be easy to use and borrow the good parts of older Object Oriented languages like C++.

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

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

Missing image
The Look and Feel of a Java GUI is independent of the platform it is running on

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 no longer ships Java with Windows, and in recent versions of Windows, Internet Explorer cannot support Java applets without a third-party plugin. However, Sun and others have made available Java run-time systems at no cost for those and other versions of Windows.

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 argument against languages such as C++ is the burden of having to peform manual memory management. In C++, memory is allocated by the programmer to create an object, then deallocated to delete the object. If a programmer forgets or is unsure when to deallocate, this can lead 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 will likely crash.

In Java, this potential problem is avoided 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 can still occur but at higher conceptual levels. But on the whole, Java's automatic garbage collection makes creation and deletion of objects in Java simpler and potentially safer than in C++.

It should be noted, however, that programmers have access to garbage collection in C++ via smart pointers, such as the ones provided by the Standard Template Library and Boost's library. However, smart pointers have significant overhead in both speed and memory consumption, and fail when confronted by cyclical object graphs. Aside from that, common smart pointer implementations do not support polymorphic assignments combined with typesafety, as they are template-based.

Interfaces and classes

One thing that Java accommodates is creating an interface which classes can then implement. For example, an interface can be created 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() { //code implementation goes here
     //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++) {

because any objects in the array are guaranteed to have the delete() method. The Deleteable array may contain references to Fred objects, and the deleteAll() method needn't differentiate between the Fred objects and other Deleteable objects.

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 contains methods that any collection of objects might want to implement, like retrieving or storing objects, but a specific collection could be a resizeable array, a linked list, or any of a number of different implementations.

Methods defined by an interface are implicitly public and abstract. Fields defined by an interface are implicitly public, static, and final.

The feature is a result of compromise. The designers of Java decided not to support multiple inheritance because of the difficulty of C++'s multiple inheritance, but interfaces give some of the benefit of multiple inheritance with less complexity.

Java interfaces behave much like the concept of the Objective-C protocol.


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.


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. 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.

Hello World example

For an explanation of the tradition of programming "Hello World", see Hello world program.

// The source file must be named
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!");


The language distinguishes between bytes and characters. Characters are stored internally using UCS-2 (though as of Java 5, the language also supports using UTF-16, with surrogates), and Java program source may contain any Unicode character. Although the language has special syntax for them, arrays and strings are not primitive types: they are reference types that can be assigned to java.lang.Object.


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

Language Issues

Java code is often more verbose than code written in other languages due to its frequent type declarations.

The division between primitive types and objects is disliked by programmers familiar with languages such as Smalltalk and Ruby where everything is an object.

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

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

Versions of Java before 5.0 required many explicit casts to be written due to the lack of generic types.

Java's generic types can be awkward to use because they are compile-time only constructs; generic type information is unavailable at runtime.

Library issues

The look and feel of GUI applications written in Java is often different from native applications.

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

Performance issues

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.

Java array access can be slower than other languages due to range-checking.

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. Most major companies still use other languages for off the shelf software, as Java is typically considered too slow for major desktop applications.

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)
  • JDO (Java Data Objects)
  • 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)
  • Java Card
  • 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)
  • SuperWaba (JavaVMs for handhelds)
  • MARF (Modular Audio Recognition Framework)

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
  • Groovy, a language similar to Java, that also compiles code that runs on the Java virtual machine
Developer tools

See also


External links








Third-party software

Java portals, magazines and content sites

  • ( A site containing thousands of categorized links and Q&A's
  • ( A site to find examples of Java API's
  • ( A popular Java J2EE portal
  • Javalobby ( A popular forum for Java discussions
  • Java.Net ( A site for Java articles and upcoming projects
  • ( An oreilly site for Java with many good Java articles
  • ( An upcoming portal for Java and J2EE
  • JavaPro magazine ( A popular java magazine
  • Java Developer's Journal ( Online edition of a popular java magazine
  • JavaWorld magazine ( A popular java magazine
  • Java KB ( Offers Java discussions, news, articles, and an open source project directory.
  • ( Java news & Books.
  • ( A Java portal of Java websites rich in Java & J2EE News, Articles, Blogs, Groups and Forums.
  • Java Game Development ( Daily news and articles on Java game development
  • JavaToolbox ( List of the available development tools and libraries for Java/J2EE

Template:Major programming languages smallar:جافا bg:Java ca:Java cs:Java da:Java (programmeringssprog) de:Java (Programmiersprache) et:Java es:Lenguaje de programacin Java eo:Java fr:Java (langage) he:Java hr:Java (programski jezik) hu:Java programozsi nyelv is:Forritunarmli Java it:Java (linguaggio) ja:Java言語 ko:자바 프로그래밍 언어 lt:Java (kalba) lv:valoda Java mk:Java nl:Programmeertaal Java nb:Java (programmeringssprk) pl:Java pt:Linguagem de programao Java ru:Java fi:Java sv:Java (programsprk) vi:Java th:ภาษาจาวา tr:Java uk:Мова програмування Java zh:Java编程语言


  • Art and Cultures
    • Art (
    • Architecture (
    • Cultures (
    • Music (
    • Musical Instruments (
  • Biographies (
  • Clipart (
  • Geography (
    • Countries of the World (
    • Maps (
    • Flags (
    • Continents (
  • History (
    • Ancient Civilizations (
    • Industrial Revolution (
    • Middle Ages (
    • Prehistory (
    • Renaissance (
    • Timelines (
    • United States (
    • Wars (
    • World History (
  • Human Body (
  • Mathematics (
  • Reference (
  • Science (
    • Animals (
    • Aviation (
    • Dinosaurs (
    • Earth (
    • Inventions (
    • Physical Science (
    • Plants (
    • Scientists (
  • Social Studies (
    • Anthropology (
    • Economics (
    • Government (
    • Religion (
    • Holidays (
  • Space and Astronomy
    • Solar System (
    • Planets (
  • Sports (
  • Timelines (
  • Weather (
  • US States (


  • Home Page (
  • Contact Us (

  • Clip Art (
Personal tools