Sponsored Link •
The Java virtual machine computes by performing operations on certain types of data. Both the data types and operations are strictly defined by the Java virtual machine specification. The data types can be divided into a set of primitive types and a reference type. Variables of the primitive types hold primitive values, and variables of the reference type hold reference values. Reference values refer to objects, but are not objects themselves. Primitive values, by contrast, do not refer to anything. They are the actual data themselves. You can see a graphical depiction of the Java virtual machine's families of data types in Figure 5-4.
All the primitive types of the Java programming language are primitive types of the Java virtual machine.
boolean qualifies as a primitive type of the Java virtual machine, the
instruction set has very limited support for it. When a compiler translates Java source code into bytecodes, it
bytes to represent
In the Java virtual machine,
false is represented by integer zero and
true by any non-zero integer. Operations involving
ints. Arrays of
boolean are accessed as arrays of
byte, though they may be represented on the heap as arrays of
byte or as bit fields.
The primitive types of the Java programming language other than
the numeric types of the Java virtual machine. The numeric types are divided between the
char, and the floating-
double. As with the Java
programming language, the primitive types of the Java virtual machine have the same range everywhere. A
long in the Java virtual machine always acts like a 64-bit signed twos complement
number, independent of the underlying host platform.
The Java virtual machine works with one other primitive type that is unavailable to the Java
returnAddress type. This primitive type is used to implement
finally clauses of Java programs. The use of the
returnAddress type is described in detail in Chapter 18, "Finally Clauses."
The reference type of the Java virtual machine is cleverly named
Values of type
reference come in three flavors: the class type, the
interface type, and the array type. All three types have values that are references
to dynamically created objects. The class type's values are references to class instances. The array type's
values are references to arrays, which are full-fledged objects in the Java virtual machine. The interface
type's values are references to class instances that implement an interface. One other reference value is the
null value, which indicates the
reference variable doesn't refer
to any object.
The Java virtual machine specification defines the range of values for each of the data types, but does not define their sizes. The number of bits used to store each data type value is a decision of the designers of individual implementations. The ranges of the Java virtual machines data type's are shown in Table 5-1. More information on the floating point ranges is given in Chapter 14, "Floating Point Arithmetic."
||8-bit signed two's complement integer (-27 to 27 - 1, inclusive)|
||16-bit signed two's complement integer (-215 to 215 - 1, inclusive)|
||32-bit signed two's complement integer (-231 to 231 - 1, inclusive)|
||64-bit signed two's complement integer (-263 to 263 - 1, inclusive)|
||16-bit unsigned Unicode character (0 to 216 - 1, inclusive)|
||32-bit IEEE 754 single-precision float|
||64-bit IEEE 754 double-precision float|
||address of an opcode within the same method|
||reference to an object on the heap, or
Table 5-1. Ranges of the Java virtual machine's data types
The basic unit of size for data values in the Java virtual machine is the word--a fixed size
chosen by the designer of each Java virtual machine implementation. The word size must be large enough to
hold a value of type
reference. Two words must be large enough to hold a value of type
double. An implementation designer must therefore
choose a word size that is at least 32 bits, but otherwise can pick whatever word size will yield the most
efficient implementation. The word size is often chosen to be the size of a native pointer on the host
The specification of many of the Java virtual machine's runtime data areas are based upon this abstract concept of a word. For example, two sections of a Java stack frame--the local variables and operand stack-- are defined in terms of words. These areas can contain values of any of the virtual machine's data types. When placed into the local variables or operand stack, a value occupies either one or two words.
As they run, Java programs cannot determine the word size of their host virtual machine implementation. The word size does not affect the behavior of a program. It is only an internal attribute of a virtual machine implementation.