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.
Contents |
History
Early history
Duke.wave.shadow.gif
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
Java_WebStartApplicationMan.png
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) { 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) — Codename Mustang (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 — Codename Dolphin. As of 2005, this is in the early planning stages.[1] (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.
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
SwingSet.png
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++) { list[i].delete(); } }
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 interface
s give some of the benefit of multiple inheritance with less complexity.
Java interfaces behave much like the concept of the Objective-C protocol.
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:
- Java 2 Platform, Micro Edition — targeting environments with limited resources,
- Java 2 Platform, Standard Edition — targeting workstation environments, and
- Java 2 Platform, Enterprise Edition — targeting large distributed enterprise or Internet environments.
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 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!"); } }
Miscellaneous
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
.
Criticism
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:
- The core libraries, which include:
- Collection libraries which implement data structures such as lists, dictionaries, trees and sets
- XML Parsing libraries
- Security
- Internationalization and Localization libraries
- The integration libraries, which allow the application writer to communicate with external systems. These libraries include:
- The Java Database Connectivity (JDBC) API for database access
- Java Naming and Directory Interface (JNDI) for lookup and discovery
- RMI and CORBA for distributed application development
- User Interface libraries, which include:
- The (heavyweight, or native) Abstract Windowing Toolkit (AWT), which provides GUI components, the means for laying out those components and the means for handling events from those components
- The (lightweight) Swing libraries, which are built on AWT but provide (non-native) implementations of the AWT widgetry
- APIs for audio capture, processing, and playback
- The core libraries, which include:
- 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
- Free software IDEs
- Non-free IDEs
- Developer tools
- 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
- Apache Ant, a Java written software tool for automating software build processes
- 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
- Jarhoo helps [2] (http://www.jarhoo.com/) resolve classpath issues by providing details of Jar files containing a class causing NoClassDefFoundError or ClassNotFoundException problems
- InterProlog ( http://www.declarativa.com/interprolog/ ) A programming library bridge between Java and Prolog, implementing bi-direccional predicate/method calling between both languages; Java objects are mapped into Prolog terms and vice-versa through serialization. Allows the development of GUIs and other functionality in Java while leaving logic processing in the Prolog layer. Supports XSB and SWI Prolog.
See also
- Java virtual machine
- Comparison of Java to C++
- Optimization of Java
- Java Platform Debugger Architecture
- List of Java-programs
- Java User Group
- Artefaktur
- Java XML
- Java Servlet
- Java 2 Platform, Standard Edition (J2SE)
- List of Java scripting languages
- Javapedia
- Java community
- JavaOS
- Java keywords
- zAAP (Java processor)
- Microsoft J++
- Modular Audio Recognition Framework
References
- Jon Byous, Java technology: The early years (http://java.sun.com/features/1998/05/birthday.html). Sun Developer Network, no date [ca. 1998]. Retrieved April 22, 2005.
- James Gosling, A brief history of the Green project (http://today.java.net/jag/old/green/). Java.net, no date [ca. Q1/1998]. Retrieved April 22, 2005.
- James Gosling, Bill Joy, Guy Steele, and Gilad Bracha, The Java language specification, second edition. Addison-Wesley, 2000. ISBN 0201310082.
- James Gosling, Bill Joy, Guy Steele, and Gilad Bracha, The Java language specification, third edition. Addison-Wesley, 2005. ISBN 0321246780.
- Tim Lindholm and Frank Yellin. The Java Virtual Machine specification, second edition. Addison-Wesley, 1999. ISBN 0201432943.
External links
Sun
- Official Java home site (http://java.sun.com/)
- The Java Language Specification, Third edition (http://java.sun.com/docs/books/jls/) 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
- Test your Java VM (http://www.java.com/en/download/help/testvm.xml).
Alternatives
- Blackdown Java, includes (http://wiki.debian.net/?BlackDownJava) Mozilla plug-in
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
- Paul Graham, Java's Cover (http://www.paulgraham.com/javacover.html). Paulgraham.com, April 2001.
- Simson Garfinkel, Java: Slow, ugly and irrelevant (http://www.salon.com/tech/col/garf/2001/01/08/bad_java/). Salon.com, January 8, 2001.
- 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 (View as HTML (http://66.102.7.104/search?q=cache:P_gdZzcIXy0J:www.idinews.com/darkside.pdf+&hl=en))
- Why I Am Not A Java Programmer (http://magnonel.guild.net/~schwern/papers/Why_I_Am_Not_A_Java_Programmer/why.html) (mirror (http://mungus.schwern.org/~schwern/papers/Why_I_Am_Not_A_Java_Programmer/why.html))
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/)
- Echo Framework (http://www.nextapp.com/products/echo/) An open source framework for developing object-oriented, event-driven, thin-client Web applications.
Java portals, magazines and content sites
- Esus.com (http://www.esus.com) A site containing thousands of categorized links and Q&A's
- JExamples.com (http://www.jexamples.com) A site to find examples of Java API's
- 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
- Java Developer's Journal (http://www.java.sys-con.com/) Online edition of 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.
- JavaSight.com (http://www.javasight.com/) Java news & Books.
- JavaRSS.com (http://www.javarss.com/) A Java portal of Java websites rich in Java & J2EE News, Articles, Blogs, Groups and Forums.
- Java Game Development (http://www.javagamedevelopment.net/) Daily news and articles on Java game development
- JavaToolbox (http://JavaToolbox.com) 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编程语言