Most of the code samples in this book are available in a Git repository at https://github.com/ChrisMayfield/ThinkJavaCode2. Chi-Yu Li pointed out a typo and an error in one of the code samples.
What Is a Computer?
At one level, you will learn to write Java programs, a useful skill in itself. Users generally see and interact with touchscreens, keyboards and monitors, but it is the processors and memory that do the actual computing.
What Is Programming?
Each type of computer has its own unique design, but internally they all share the same type of hardware. These days, it's pretty standard, even for a smartphone, to have at least eight processors and four gigabytes (four billion cells) of memory.
The Hello World Program
The name of the class must match the name of the file it is in, so this class must be in a file called Hello.java. Comments have no effect on program execution, but they make it easier for other programmers (and your future self) to understand what you intended to do.
Compiling Java Programs
As a result, it is possible to compile a Java program on one machine, transfer the bytecode to another machine, and execute the bytecode on that other machine. If there are no errors, the compiler stores the bytecode in the Hello.class file.
Displaying Two Messages
It can be difficult to write source code that compiles and runs correctly on different types of machines. The programmer writes the source code in the Hello.java file and uses javac to compile it.
Formatting Source Code
For example, in DrJava (see Appendix A.1), you can indent your code by selecting all text (Ctrl+A) and pressing the Tab key. For example, Google publishes its Java coding standards for use in open source projects: https://google.github.
Using Escape Sequences
What Is Computer Science?
Debugging Programs
Vocabulary
Bytecode is similar to object code, but it is portable as a high-level language.
Exercises
Sometimes the compiler tells you exactly what's wrong, and all you have to do is fix it. Over time, you'll develop a feel for when you can trust the compiler and when you should figure things out yourself.
Declaring Variables
Variable names usually start with a lowercase letter, unlike class names (like Hello) which start with an uppercase letter. But there are about 50 reserved words, called keywords, that you must not use as variable names.
Assigning Variables
The last line shows how to declare multiple variables with the same type: hour and minute are both integers. These words include public, class, static, void, and int, which are used by the compiler to analyze the structure of the program.
Memory Diagrams
Each variable is represented by a box that shows the name of the variable on the outside and its current value inside. When the program is running, the memory state changes so that memory diagrams show only a certain point in time.
Printing Variables
Arithmetic Operators
Floating-Point Numbers
You can expect the variable y to take the value 0.333333, which is a legal variable value. One way to solve this problem (once you figure out the error) is to make the right-hand side a floating-point expression.
Rounding Errors
The expression on the right divides two integers, so Java does the division of integers, yielding the int value0. It is a matter of style that you always assign floating-point values to floating-point variables.
Operators for Strings
In general, Java evaluates operators from left to right (as you saw in the previous section). Whenever you want to override the order of operations (or you're not sure what that is), you can use parentheses.
Compiler Error Messages
Parsing is the process of reading a program before translating it; if the compiler reaches the end of the file while parsing, it means something has been left out. The compiler detects the error at the end of the program (line 7), but the missing brace should be on the previous line.
Other Types of Errors
First, the error message is written from the compiler's perspective, not yours. In the first few weeks of your programming career, you'll probably spend a lot of time tracking down syntax and other compile-time errors.
Vocabulary
Exercises
Modify the program to display the date in standard US format; for example: Thursday, July 18, 2019. Variables that are used in a calculation but never appear are sometimes called "intermediate" or "temporary" variables.
The System Class
The numbers and letters after the @ sign are the address of System.out, represented as a hexadecimal (base 16) number. The address of a value is its location in the computer's memory, which can be different on different computers.
The Scanner Class
As shown in Figure 3.1, System is defined in the System.java file, and PrintStream is defined in PrintStream.java. According to the documentation, java.lang "provides classes that are fundamental to the design of the Java programming language." The String class is also part of java.lang.
Language Elements
Literals and Constants
But when numbers like 2.54 appear in an expression without explanation, they make the code difficult to read. Values like 2.54 are sometimes called magic numbers (with the implication that being magic is not a good thing).
Formatting Output
Reading Error Messages
Type Cast Operators
Java does not automatically perform this operation to ensure that you are aware of the loss of the fractional part of the number. The easiest way to convert a floating point value to an integer is to use a type cast, so called because it forms or "casts" a value from one type to another.
Remainder Operator
The parentheses after the conversion operator require that the division be performed before the type conversion. In the next chapter, you'll see how to round floating-point numbers to the nearest whole number.
Putting It All Together
This practice makes it easier to find their types later and helps the reader know what data is included in the algorithm. For readability, each major step of the algorithm is separated by a blank line and begins with a comment.
The Scanner Bug
First you read the number and then you read the rest of the line, which is just a newline mark.
Vocabulary
Exercises
And as with Scanner, we need to use the new operator to create a Random (number generator). We'll also look at the Math class, which provides methods for common mathematical operations.
Defining New Methods
In this example, thenewLineandmain methods are both public, which means they can be called (or "called") by other classes. You can use any name you want for the methods, except for any of the Java keywords.
Flow of Execution
Parameters and Arguments
Multiple Parameters
This is a syntax error, because the compiler sees int hour and int minute as variable declarations, not expressions representing values. The hour in printTime and the hour in main refer to different memory locations and can have different values.
Stack Diagrams
Math Methods
Composition
The compiler looks for a method called pow in the Test.java file (the file for this example). If you don't specify a class name when referencing a method, the compiler defaults to looking at the current class.
Return Values
But in the place where we are used to seeing void, we see double, which means that the return value from this method is double. The type of the expression in the return statement must match the return type of the method itself.
Incremental Development
At this stage, the program doesn't do anything useful, but it's good to compile it so we can catch any syntax errors before adding more code. Once we've compiled the stub, we can start adding code one line at a time.
Vocabulary
We could use the Math.pow method, but it's simpler (and more efficient) to multiply each term by itself.
Exercises
Write the number 2 next to the second line of code, and so on until the end of the program. Draw a stack diagram showing the state of the program the first time ping is activated.
Relational Operators
The programs in the previous chapters do the same thing every time they are run, regardless of the input. When comparing values of different numeric types, Java applies the same conversion rules you saw before with the assignment operator.
The if-else Statement
Since there are no parentheses, only the first println is part of the if statement. Because of the semicolon, the if statement is constructed as if there were no parentheses, and the subsequent block runs independently.
Chaining and Nesting
The switch Statement
Logical Operators
For example, really || anything is always true, so Java does not need to evaluate the expression anything. Ignoring the second operand when possible is called short-circuit evaluation by analogy with an electrical circuit.
De Morgan’s Laws
But it is useful to explore different ways of representing the same logic, especially when it is complex.
Boolean Variables
Each part of a condition can be stored in a separate flag, and these flags can be combined with logical operators.
Boolean Methods
Validating Input
If the user enters aString when we expect a duplicate, Java throws an "input mismatch" exception. We can use in.next to show the user exactly which word they typed was not a number.
Example Program
Vocabulary
Exercises
For example, if one of the rods is 12 inches long and the other two are 1 inch, you will not be able to get the short rods to meet in the middle. If any of the three lengths is greater than the sum of the other two, you cannot construct a triangle.
The while Statement
In this chapter, you'll learn how to use while and for loops to add repetition to your code. The body of the loop must change the value of one or more variables so that, eventually, the condition becomes false and the loop ends.
Increment and Decrement
The for Statement
To increment or decrement a variable by an amount other than 1, you can use += and . A forloop is often easier to read because it places all statements related to the loop at the top of the loop.
Nested Loops
Characters
In Unicode, each character is represented by a "code point", which you can think of as an integer.
Which Loop to Use
String Iteration
The indexOf Method
Substrings
As the last example shows, substring returns the empty string if the argument is the length of the string. But calling substring with one argument is more convenient when you want the end of the string.
String Comparison
String Formatting
String.format uses the same arguments as System.out.printf: a format specification followed by a series of values. The easiest way to find documentation for Java classes is to search the Internet for "Java" and the name of the class.
Vocabulary
Exercises
Using this technique, write a method called squareRoot that accepts a double and returns an approximation of the square root of the parameter. In this chapter, you will learn how to store multiple values of the same type using a single variable.
Creating Arrays
Accessing Elements
Each time through the loop, we use i as an index into the array that shows that idea element.
Displaying Arrays
Copying Arrays
These statements create an array of three doubles and let two different variables refer to them, as shown in Figure 7.3. The second parameter is the number of elements you want to copy, so copyOf can also be used to copy part of an array.
Traversing Arrays
For example, the following method takes an array and a value, and it returns the index where the value appears:. Another common traversal is a reduce operation, which "reduces" an array of values to a single value.
Random Numbers
Building a Histogram
This code is repetitive, but it is acceptable as long as the number of ranges is small. Because this code only traverses the array of scores once, it is much more efficient.
The Enhanced for Loop
Each time through the loop, it selects an element from scores and uses it as an index to increment the corresponding element of counter.
Counting Characters
If we find a count that is neither 0 nor 2, we know the word is not double and can return immediately. If we pass it through the for loop, we know that all the counts are 0 or 2, which means the word is a double.
Vocabulary
Exercises
Write a method called sieve that takes an integer parameter, n, and returns a boolean array that indicates, for each number from0ton - 1, whether the number is prime. The zero element of the histogram must contain the number of a's in the string (uppercase and lowercase letters); the 25th element must contain the number of z's.
Recursive Void Methods
The execution of countdown starts with == 3, and since then it is not 0, it displays the value 3 and then calls itself. The execution of countdown starts with == 1, and since niche is not 0, it displays the value 1, and then calls itself.
Recursive Stack Diagrams
If there is no base case in a recursive method, or if the base case is never reached, the stack would grow forever - at least in theory. This method displays the given string until the stack overflows, at which point an error is thrown.
Value-Returning Methods
In each method call, the recursion stores factorial n-1 and the result factorial n. Note that iteration and result do not exist in the last frame because when n == 0 the code that declares them is not executed.
The Leap of Faith
Of course, it is strange to assume that the method works correctly when you have not finished writing. But if we take a leap of faith and assume that the two recursive calls work correctly, then it's clear, looking at the definition, that our implementation is correct.
Counting Up Recursively
Binary Number System
There are 10 digits in decimal, and the written representation of numbers is based on powers of 10. In binary, there are two digits, and the written representation of numbers is based on powers of two.
Recursive Binary Method
CodingBat Problems
The base case is the simplest version of the problem; for noX this is the empty string. To solve a problem recursively, you need to come up with a simpler instance of the same problem.
Vocabulary
We then look at the current number (based on the given index) and check if it is 11. Learning to think recursively is an important part of learning to think like a computer scientist.
Exercises
Write a recursive method called ack that takes two ints as parameters and that calculates and returns the value of the Ackermann function. Using these methods and not using any other String methods, write a method called printString that takes a string as a parameter and displays the letters of the string, one on each line.
Primitives vs Objects
Java is an object-oriented language, meaning it uses objects to (1) represent data and (2) provide methods related to it. For example, Scanner, which you saw in Section 3.2, is an object that provides methods for parsing input.
The null Keyword
Strings Are Immutable
Wrapper Classes
Because these constants are available in wrapper classes, you don't need to remember them, and you don't need to write them yourself.
Command-Line Arguments
It is customary for programs that require command-line arguments to display a "usage message" if the arguments are not valid. For example, if you run javac orjava from the command line without any arguments, you will get a very long message.
Argument Validation
If str is null, calling charAt throws a NullPointerException because you can't call a method on null. If str is null, it is || the operator will short circuit (see Section 5.5) and immediately evaluate to true.
BigInteger Arithmetic
Incremental Design
Finally, we generalize the method to print multiples of other numbers by replacing the constant value2 with a parameter n. By now you can probably guess how we're going to display a multiplication table: we'll call printRow repeatedly with different arguments.
More Generalization
PrintRow now takes two parameters: this is the value whose multiples should be displayed, and this is the number of columns. As a result, the number of columns is equal to the number of rows, so we get a square 7 x 7 table, instead of the previous 7 x 6 table.
Vocabulary
Exercises
At the intersection of each pair of types, you must indicate whether it is legal to use the + operator with these types, the operation being performed (addition or concatenation), and the type of result. Vary the number of terms in the sequence (the second argument sent by check to myexp) and see the effect on the accuracy of the result.
Point Objects
The expression blank.x means "go to the object referenced by blank and get the value of the x attribute". In this case, we assign that value to a local variable called x. The purpose of the dot notation is to identify which variable you are referring to unambiguously.
Objects as Parameters
Objects as Return Values
Rectangles Are Mutable
Aliasing Revisited
Java Library Source
When you open (or extract) the file, you will see folders corresponding to Java packages. You should now see Point.java and Rectangle.java along with the other classes in the java.awt package.
Class Diagrams
But you can get a feel for what professional Java source code looks like by browsing through the library.
Scope Revisited
Attributes are created when an object is created and they disappear when the object is destroyed. And if they are public, they can be used in other classes via references to the box1.x object.
Garbage Collection
Parameters and local variables are created when a method is called, and they disappear when the method returns. They can be used anywhere inside the method, but not in other methods and not in other classes.
Mutable vs Immutable
Because both strings are specified at compile time, the compiler can tell that they are equivalent. And because strings are immutable, there is no need to make two copies; the compiler can create oneString and have both variables refer to it.
StringBuilder Objects