Chapter 1

Welcome to Java

IN THIS CHAPTER

check Finding out about programming

check Scoping out Java

check Comparing Java with other programming languages

check Understanding Java’s incomprehensible version numbers

This chapter is a gentle introduction to the world of Java. In the next few pages, you find out what Java is, where it came from, and where it’s going. You also discover some of the unique strengths of Java, as well as some of its weaknesses. Also, you see how Java compares with other popular programming languages, including C, C++, C#, and Visual Basic.

By the way, I assume in this chapter that you have at least enough background to know what computer programming is all about. That doesn’t mean that I assume you’re an expert or professional programmer. It just means that I don’t take the time to explain such basics as what a computer program is, what a programming language is, and so on. If you have absolutely no programming experience, I suggest that you pick up a copy of Java For Dummies, 5th Edition, or Beginning Programming with Java For Dummies, 3rd Edition, both by Barry Burd (Wiley).

Throughout this chapter, you find little snippets of Java program code, plus a few snippets of code written in other languages, including C, C++, and Basic. If you don’t have a clue what this code means or does, don’t panic. I just want to give you a feel for what Java programming looks like and how it compares with programming in other languages.

tip All the code listings used in this book are available for download at www.dummies.com/go/javaaiofd5e .

What Is Java, and Why Is It So Great?

Java is a programming language in the tradition of C and C++. As a result, if you have any experience with C or C++, you’ll often find yourself in familiar territory as you discover the various features of Java. (For more information about the similarities and differences between Java and C or C++, see the section “Java versus Other Languages ,” later in this chapter.)

Java differs from other programming languages in a couple of significant ways, however. I point out the most important differences in the following sections.

Platform independence

One of the main reasons Java is so popular is its platform independence, which simply means that Java programs can be run on many types of computers. A Java program runs on any computer with a Java Runtime Environment, also known as a JRE, installed. A JRE is available for almost every type of computer you can think of: PCs running any version of Windows, Macintosh computers, Unix and Linux computers, huge mainframe computers, and even cellphones.

Before Java, other programming languages promised platform independence by providing compatible compilers for different platforms. (A compiler is the program that translates programs written in a programming language into a form that can actually run on a computer.) The idea was that you could compile different versions of the programs for each platform. Unfortunately, this idea never really worked. The compilers were never identical on each platform; each had its own little nuances. As a result, you had to maintain a different version of your program for each platform you wanted to support.

Java’s platform independence isn’t based on providing compatible compilers for different platforms. Instead, Java is based on the concept of a virtual machine . You can think of the Java Virtual Machine (sometimes called the JVM ) as being a hypothetical computer platform — a design for a computer that doesn’t exist as actual hardware. Instead, the JRE is an emulator — a program that sets aside part of your hard drive to act like a computer (namely, the JVM) that can execute Java programs.

The Java compiler doesn’t translate Java into the machine language of the computer that the program is running on. Instead, the compiler translates Java into the machine language of the JVM, which is called bytecode . Then the JRE runs the bytecode in the JVM. Because of the JVM, you can execute a Java program on any computer that has a JRE installed without recompiling the program.

That’s how Java provides platform independence — and believe it or not, it works pretty well. The programs you write run just as well on a PC running any version of Windows, a Macintosh, a Unix or Linux machine, or any other computer with a JRE installed — including smartphones or tablet computers.

While you lie awake tonight pondering the significance of Java’s platform independence, here are a few additional thoughts to ponder:

Object orientation

Java is inherently object-oriented, which means that Java programs are made up from programming elements called objects. Simply put (don’t you love it when you read that in a computer book?), an object is a programming entity that represents either some real-world object or an abstract concept.

All objects have two basic characteristics:

Classes are closely related to objects. A class is the program code you write to create objects. The class describes the data and methods that define the object’s state and behavior. When the program executes, classes are used to create objects.

Suppose you’re writing a payroll program. This program probably needs objects to represent the company’s employees. So the program includes a class (probably named Employee ) that defines the data and methods for each Employee object. When your program runs, it uses this class to create an object for each of your company’s employees.

The Java API

The Java language itself is very simple, but Java comes with a library of classes that provide commonly used utility functions that most Java programs can’t do without. This class library, called the Java API (short for application programming interface) , is as much a part of Java as the language itself. In fact, the real challenge of finding out how to use Java isn’t mastering the language; it’s mastering the API. The Java language has only about 50 keywords, but the Java API has several thousand classes, with tens of thousands of methods that you can use in your programs.

The Java API has classes that let you do trigonometry, write data to files, create windows onscreen, and retrieve information from a database, among other things. Many of the classes in the API are general purpose and commonly used. A whole series of classes stores collections of data, for example. But many are obscure, used only in special situations.

Fortunately, you don’t have to learn anywhere near all of the Java API. Most programmers are fluent with only a small portion of it: the portion that applies most directly to the types of programs they write. If you find a need to use some class from the API that you aren’t yet familiar with, you can look up what the class does in the Java API documentation at http://download.java.net/jdk9/docs/api .

The Internet

Java is often associated with the Internet, and rightfully so, because Al Gore invented Java just a few days after he invented the Internet. Okay, Java wasn’t really invented by Al Gore. It was developed right at the time the World Wide Web was becoming a phenomenon, and Java was specifically designed to take advantage of the web. In particular, the whole concept behind the JVM is to enable any computer connected to the Internet to run Java programs, regardless of the type of computer or the operating system it runs.

You can find three distinct types of Java programs on the Internet:

remember Applets have recently fallen out of favor because they often experience compatibility problems with different browser versions. As a result, Web Start applications have largely replaced Applets. You’ll find out how to create servlets and Web Start applications in Book 7 .

Java versus Other Languages

Superficially, Java looks a lot like many of the programming languages that preceded it, most notably C and C++. For example, here’s the classic Hello, World! program, written in the C programming language:

main()
{
printf("Hello, World!");
}

This program simply displays the text "Hello, World!" on the computer’s console. Here’s the classic Hello, World! program written in Java:

public class HelloApp
{
public static void main(String[] args)
{
System.out.println("Hello, World!");
}
}

Although the Java version is a bit more verbose, the two have several similarities:

Many other similarities aren’t evident in these simple examples, but the examples bring the major difference between C and Java front and center: Object-oriented programming rears its ugly head even in simple examples. Consider the following points:

Important Features of the Java Language

If you believe the marketing hype put out by Oracle and others, you think that Java is the best thing to happen to computers since the invention of memory. Java may not be that revolutionary, but it does have many built-in features that set it apart from other languages. The following sections describe just three of the many features that make Java so popular.

Type checking

All programming languages must deal in one way or the other with type checking — the way that a language handles variables that store different types of data. Numbers, strings, and dates, for example, are commonly used data types available in most programming languages. Most programming languages also have several types of numbers, such as integers and real numbers.

All languages must check data types, so make sure that you don’t try to do things that don’t make sense (such as multiplying the gross national product by your last name). The question is, does the language require you to declare every variable’s type so you can do type checking when it compiles your programs, or does the language do type checking only after it runs your program?

Some languages, such as Pearl, are not as rigid about type checking as Java. For example, Pearl does not require that you indicate whether a variable will contain an integer, a floating point number, or a string. Thus, all the following statements are allowed for a single variable named $a :

$a = 5
$a = "Strategery"
$a = 3.14159

Here three different types of data — integer, string, and double — have been assigned to the same variable.

Java, on the other hand, does complete type checking at runtime. As a result, you must declare all variables as a particular type so that the compiler can make sure you use the variables correctly. The following bit of Java code, for example, won’t compile:

int a = 5;
String b = "Strategery";
String c = a * b;

If you try to compile these lines, you get an error message saying that Java can’t multiply an integer and a string.

In Java, every class you define creates a new type of data for the language to work with. Thus, the data types you have available to you in Java aren’t just simple predefined types, such as numbers and strings. You can create your own types. If you’re writing a payroll system, you might create an Employee type. Then you can declare variables of type Employee that can hold only Employee objects. This capability prevents a lot of programming errors. Consider this code snippet:

Employee newHire;
newHire = 21;

This code creates a variable ( newHire ) that can hold only Employee objects. Then it tries to assign the number 21 to it. The Java compiler won’t let you run this program because 21 is a number, not an employee.

technicalstuff An important object-oriented programming feature of Java called inheritance adds an interesting — and incredibly useful — twist to type checking. Inheritance is way too complicated to dive into just yet, so I’ll be brief here: In Java, you can create your own data types that are derived from other data types. Employees are people, for example, and customers are people too, so you might create a Person class and then create Employee and Customer classes that both inherit the Person class. Then you can write code like this:

Person p;
Employee e;
Customer c;
p = e; // this is allowed because an Employee is also a
    Person.
c = e; // this isn't allowed because an Employee is not a
    Customer.

Confused yet? If so, that’s my fault. Inheritance is a pretty heady topic for Chapter 1 of a Java book. Don’t panic if it makes no sense just yet. It will all be clear by the time you finish reading Book 3, Chapter 4 , which covers all the subtle nuances of using inheritance.

Automatic memory management

Memory management is another detail that all programming languages have to deal with. All programming languages let you create variables. When you create a variable, the language assigns a portion of the computer’s memory to store the data referred to by the variable. Exactly how this memory is allocated is a detail that you usually can safely ignore, no matter which language you’re working with. But a detail that many languages do not let you safely ignore is what happens to that memory when you no longer need the data that was stored in it.

In C++ and similar languages, you must write code that explicitly releases that memory so that other programs can access it. If you don’t do this, or if you do it wrong, your program might develop a memory leak. In a memory leak, your program slowly but surely sucks memory away from other programs until the operating system runs out of memory and the computer grinds to a halt.

In Java, you don’t have to explicitly release memory when you’re done with it; instead, memory is freed automatically when it’s no longer needed. The JVM includes a special process called the garbage collector that snoops around the virtual machine’s memory; determines when data is no longer being used; and automatically deletes that data, freeing the memory that it occupied.

technicalstuff A feature related to garbage collection is bounds checking, which guarantees that programs can’t access memory that doesn’t belong to them. Languages such as C and C++ don’t have this type of safety net. As a result, programming errors in C or C++ can cause one program to trample over memory that’s being used by another program, which in turn can cause your computer to crash.

Exception handling

As Robert Burns said, “The best-laid schemes o’ mice an’ men gang oft agley, an’ lea’e us nought but grief an’ pain, for promis’d joy!” When you tinker with computer programming, you’ll quickly discover what he meant. No matter how carefully you plan and test your programs, errors happen, and when they do, they threaten to bring your whole program to a crashing halt.

Java has a unique approach to error handling that’s superior to that of any other language (except C#, which just copies Java’s approach, as I mention earlier in the chapter). In Java, the JRE intercepts and folds errors of all types into a special type of object called an exception object. After all, Java is object-oriented through and through, so why shouldn’t its exception-handling features be object-oriented?

Java requires any statements that can potentially cause an exception to be bracketed by code that can catch and handle the exception. In other words, you, as the programmer, must anticipate errors that can happen while your program is running and make sure that those errors are dealt with properly. Although this necessity can be annoying, it makes the resulting programs more reliable.

On the Downside: Java’s Weaknesses

So far, I’ve been tooting Java’s horn pretty loudly. Lest you think that figuring out how to use it is a walk in the park, the following paragraphs point out some of Java’s shortcomings (many of which have to do with the API rather than the language itself):

This little program should print 5.03 , right? It doesn’t. Instead, it prints 5.029999999999999 . This little error may not seem like much, but it can add up. If you ever make a purchase from an online store and notice that the sales tax is a penny off, this is why. The explanation for why these errors happen — and how to prevent them — is pretty technical, but it’s something that every Java programmer needs to understand.

Java Version Insanity

Like most products, Java gets periodic upgrades and enhancements. Since its initial release in 1996, Java has undergone the following version updates:

You may need to be aware of version differences if you’re writing applications that you want to be able to run on earlier versions of Java. Bear in mind, however, that one of the chief benefits of Java is that the runtime system is free and can be easily downloaded and installed by end users. As a result, you shouldn’t hesitate to use the features of Java 9 when you need them.

What’s in a Name?

The final topic that I want to cover in this chapter is the names of the various pieces that make up Java’s technology — specifically, the acronyms you constantly come across whenever you read or talk about Java, such as JVM, JRE, JDK, and J2EE. Here they are, in no particular order of importance: