Contents | Prev | Next | Index

The Java Language Specification

Pre-Release Version 1.0, Draft 5.2 - July 3, 1996

James Gosling
Bill Joy
Guy Steele


Series Foreword

Preface

1 Introduction

1.1 Example Programs
1.2 References

2 Grammars

2.1 Context-Free Grammars
2.2 The Lexical Grammar
2.3 The Syntactic Grammar
2.4 Grammar Notation

3 Lexical Structure

3.1 Unicode
3.2 Lexical Translations
3.3 Unicode Escapes
3.4 Line Terminators
3.5 Input Elements and Tokens
3.6 White Space
3.7 Comments
3.8 Identifiers
3.9 Keywords
3.10 Literals
3.10.1 Integer Literals
3.10.2 Floating-Point Literals
3.10.3 Boolean Literals
3.10.4 Character Literals
3.10.5 String Literals
3.10.6 Escape Sequences for Character and String Literals
3.10.7 The Null Literal
3.11 Separators
3.12 Operators

4 Types, Values, and Variables

4.1 Primitive Types, Reference Types, and the Null Type
4.2 Primitive Types and Values
4.2.1 Integral Types and Values
4.2.2 Integer Operations
4.2.3 Floating-Point Types and Values
4.2.4 Floating-Point Operations
4.2.5 The boolean Type and boolean Values
4.3 Reference Types, Objects, and Reference Values
4.3.1 Objects
4.3.2 The Class Object
4.3.3 The Class String
4.3.4 When Reference Types Are the Same
4.4 Where Types Are Used
4.5 Variables
4.5.1 Variables of Primitive Type
4.5.2 Variables of Reference Type
4.5.3 Kinds of Variables
4.5.4 Initial Values of Variables
4.5.5 Variables Have Types, Objects Have Classes

5 Conversions and Promotions

5.1 Kinds of Conversion
5.1.1 Identity Conversions
5.1.2 Widening Primitive Conversions
5.1.3 Narrowing Primitive Conversions
5.1.4 Widening Reference Conversions
5.1.5 Narrowing Reference Conversions
5.1.6 String Conversions
5.1.7 Forbidden Conversions
5.2 Assignment Conversion
5.3 Method Invocation Conversion
5.4 String Conversion
5.5 Casting Conversion
5.6 Numeric Promotions
5.6.1 Unary Numeric Promotion
5.6.2 Binary Numeric Promotion

6 Names

6.1 Declarations
6.2 Names
6.3 Scope of a Simple Name
6.3.1 Hiding Names
6.4 Members and Inheritance
6.4.1 The Members of a Package
6.4.2 The Members of a Class Type
6.4.3 The Members of an Interface Type
6.4.4 The Members of an Array Type
6.5 Determining the Meaning of a Name
6.5.1 Syntactic Classification of a Name According to Context
6.5.2 Reclassification of Contextually Ambiguous Names
6.5.3 Meaning of Package Names
6.5.3.1 Simple Package Names
6.5.3.2 Qualified Package Names
6.5.4 Meaning of Type Names
6.5.4.1 Simple Type Names
6.5.4.2 Qualified Type Names
6.5.5 Meaning of Expression Names
6.5.5.1 Simple Expression Names
6.5.5.2 Qualified Expression Names
6.5.6 Meaning of Method Names
6.5.6.1 Simple Method Names
6.5.6.2 Qualified Method Names
6.6 Qualified Names and Access Control
6.6.1 Determining Accessibility
6.6.2 Details on protected Access
6.6.3 An Example of Access Control
6.6.4 Example: Access to public and Non-public Classes
6.6.5 Example: Default-Access Fields, Methods, and Constructors
6.6.6 Example: public Fields, Methods, and Constructors
6.6.7 Example: protected Fields, Methods, and Constructors
6.6.8 Example: private Fields, Methods, and Constructors
6.7 Fully Qualified Names
6.8 Naming Conventions
6.8.1 Package Names
6.8.2 Class and Interface Type Names
6.8.3 Method Names
6.8.4 Field Names
6.8.5 Constant Names
6.8.6 Local Variable and Parameter Names

7 Packages

7.1 Package Members
7.2 Host Support for Packages
7.2.1 Storing Packages in a File System
7.2.2 Storing Packages in a Database
7.3 Compilation Units
7.4 Package Declarations
7.4.1 Named Packages
7.4.2 Unnamed Packages
7.4.3 Scope and Hiding of a Package Name
7.4.4 Access to Members of a Package
7.5 Import Declarations
7.5.1 Single-Type-Import Declaration
7.5.2 Type-Import-on-Demand Declaration
7.5.3 Automatic Imports
7.5.4 A Strange Example
7.6 Type Declarations
7.7 Unique Package Names

8 Class Declarations

8.1 Class Declaration
8.1.1 Scope of a Class Type Name
8.1.2 Class Modifiers
8.1.2.1 abstract Classes
8.1.2.2 final Classes
8.1.3 Superclasses and Subclasses
8.1.4 Superinterfaces
8.1.5 Class Body and Member Declarations
8.2 Class Members
8.2.1 Examples of Inheritance
8.2.1.1 Example: Inheritance with Default Access
8.2.1.2 Inheritance with public and protected
8.2.1.3 Inheritance with private
8.2.1.4 Accessing Members of Inaccessible Classes
8.3 Field Declarations
8.3.1 Field Modifiers
8.3.1.1 static Fields
8.3.1.2 final Fields
8.3.1.3 transient Fields
8.3.1.4 volatile Fields
8.3.2 Initialization of Fields
8.3.2.1 Initializers for Class Variables
8.3.2.2 Initializers for Instance Variables
8.3.3 Examples of Field Declarations
8.3.3.1 Example: Hiding of Class Variables
8.3.3.2 Example: Hiding of Instance Variables
8.3.3.3 Example: Multiply Inherited Fields
8.3.3.4 Example: Re-inheritance of Fields
8.4 Method Declarations
8.4.1 Formal Parameters
8.4.2 Method Signature
8.4.3 Method Modifiers
8.4.3.1 abstract Methods
8.4.3.2 static Methods
8.4.3.3 final Methods
8.4.3.4 native Methods
8.4.3.5 synchronized Methods
8.4.4 Throws
8.4.5 Method Body
8.4.6 Inheritance, Overriding, and Hiding
8.4.6.1 Overriding (By Instance Methods)
8.4.6.2 Hiding (By Class Methods)
8.4.6.3 Requirements in Overriding and Hiding
8.4.6.4 Inheriting Methods with the Same Signature
8.4.7 Overloading
8.4.8 Examples of Method Declarations
8.4.8.1 Example: Overriding
8.4.8.2 Example: Overloading, Overriding, and Hiding
8.4.8.3 Example: Incorrect Overriding
8.4.8.4 Example: Overriding versus Hiding
8.4.8.5 Example: Invocation of Hidden Class Methods
8.4.8.6 Large Example of Overriding
8.4.8.7 Example: Incorrect Overriding because of Throws
8.5 Static Initializers
8.6 Constructor Declarations
8.6.1 Formal Parameters
8.6.2 Constructor Signature
8.6.3 Constructor Modifiers
8.6.4 Throws
8.6.5 Constructor Body
8.6.6 Constructor Overloading
8.6.7 Default Constructor
8.6.8 Preventing Instantiation of a Class

9 Interface Declarations

9.1 Interface Declarations
9.1.1 Scope of an Interface Type Name
9.1.2 Interface Modifiers
9.1.2.1 abstract Interfaces
9.1.3 Superinterfaces
9.1.4 Interface Body and Member Declarations
9.1.5 Access to Interface Member Names
9.2 Interface Members
9.3 Field (Constant) Declarations
9.3.1 Initialization of Fields in Interfaces
9.3.2 Examples of Field Declarations
9.3.2.1 Ambiguous Inherited Fields
9.3.2.2 Multiply Inherited Fields
9.4 Abstract Method Declarations
9.4.1 Inheritance and Overriding
9.4.2 Overloading
9.4.3 Examples of Abstract Method Declarations
9.4.3.1 Example: Overriding
9.4.3.2 Example: Overloading

10 Arrays

10.1 Array Types
10.2 Array Variables
10.3 Array Creation
10.4 Array Access
10.5 A Simple Example
10.6 Arrays Initializers
10.7 Array Members
10.8 Array Class Objects
10.9 An Array of Characters is Not a String
10.10 Array Store Exception

11 Exceptions

11.1 The Causes of Exceptions
11.2 Compile-Time Checking of Exceptions
11.2.1 Why Errors are Not Checked
11.2.2 Why Runtime Exceptions are Not Checked
11.3 Handling of an Exception
11.3.1 Exceptions are Precise
11.3.2 Handling Asynchronous Exceptions
11.4 An Example of Exceptions
11.5 The Exception Hierarchy
11.5.1 The Classes Exception and RuntimeException
11.5.1.1 Standard Runtime Exceptions
11.5.1.2 Standard Checked Exceptions
11.5.2 The Class Error
11.5.2.1 Loading and Linkage Errors
11.5.2.2 Virtual Machine Errors

12 Execution

12.1 Virtual Machine Start-Up
12.1.1 Load the Class Test
12.1.2 Link Test: Verify, Prepare, (Optionally) Resolve
12.1.3 Initialize Test: Execute Initializers
12.1.4 Invoke Test.main
12.2 Loading of Classes and Interfaces
12.2.1 The Loading Process
12.2.2 Implications for Code Generation
12.3 Linking of Classes and Interfaces
12.3.1 Verification of the Binary Representation
12.3.2 Preparation of a Class or Interface Type
12.3.3 Resolution of Symbolic References
12.3.4 Implications for Code Generation
12.4 Initialization of Classes and Interfaces
12.4.1 When Initialization Occurs
12.4.2 Detailed Initialization Procedure
12.4.3 Implications for Code Generation
12.5 Creation of New Class Instances
12.6 Finalization of Class Instances
12.6.1 Implementing Finalization
12.6.2 Finalizer Invocations are Not Ordered
12.7 Finalization of Classes
12.8 Unloading of Classes and Interfaces
12.9 Virtual Machine Exit

13 Binary Compatibility

13.1 The Form of a Java Binary
13.2 What Binary Compatibility Is and Is Not
13.3 Evolution of Packages
13.4 Evolution of Classes
13.4.1 abstract Classes
13.4.2 final Classes
13.4.3 public Classes
13.4.4 Superclasses and Superinterfaces
13.4.5 Class Body and Member Declarations
13.4.6 Access to Members and Constructors
13.4.7 Field Declarations
13.4.8 final Fields and Constants
13.4.9 static Fields
13.4.10 transient Fields
13.4.11 volatile Fields
13.4.12 Method and Constructor Declarations
13.4.13 Method and Constructor Parameters
13.4.14 Method Result Type
13.4.15 abstract Methods
13.4.16 final Methods
13.4.17 native Methods
13.4.18 static Methods
13.4.19 synchronized Methods
13.4.20 Method and Constructor Throws
13.4.21 Method and Constructor Body
13.4.22 Method and Constructor Overloading
13.4.23 Method Overriding
13.4.24 Static Initializers
13.5 Evolution of Interfaces
13.5.1 public Interfaces
13.5.2 Superinterfaces
13.5.3 The Interface Members
13.5.4 Field Declarations
13.5.5 Abstract Method Declarations

14 Blocks and Statements

14.1 Normal and Abrupt Completion of Statements
14.2 Blocks
14.3 Local Variable Declaration Statements
14.3.1 Local Variable Declarators and Types
14.3.2 Scope of Local Variable Declarations
14.3.3 Hiding of Names by Local Variables
14.3.4 Execution of Local Variable Declarations
14.4 Statements
14.5 The Empty Statement
14.6 Labeled Statements
14.7 Expression Statements
14.8 The if Statement
14.8.1 The if-then Statement
14.8.2 The if-then-else Statement
14.9 The switch Statement
14.10 The while Statement
14.10.1 Abrupt Completion
14.11 The do Statement
14.11.1 Abrupt Completion
14.11.2 Example
14.12 The for Statement
14.12.1 Initialization
14.12.2 Iteration
14.12.3 Abrupt Completion
14.13 The break Statement
14.14 The continue Statement
14.15 The return Statement
14.16 The throw Statement
14.17 The synchronized Statement
14.18 The try statement
14.18.1 Execution of try-catch
14.18.2 Execution of try-catch-finally
14.19 Unreachable Statements

15 Expressions

15.1 Evaluation, Denotation, and Result
15.2 Variables as Values
15.3 Type of an Expression
15.4 Expressions and Run-Time Checks
15.5 Normal and Abrupt Completion of Evaluation
15.6 Evaluation Order
15.6.1 Left-Hand Operand First
15.6.2 Operands before Operation
15.6.3 Parentheses and Precedence Respected
15.6.4 Argument Lists Evaluated Left-to-Right
15.6.5 Ordering of Other Expressions
15.7 Primary Expressions
15.7.1 Literals
15.7.2 this
15.7.3 Parenthesized Expressions
15.8 Class Instance Creation Expressions
15.8.1 Run-time Evaluation of Class Instance Creation Expressions
15.8.2 Example: Evaluation Order and Out-of-Memory Detection
15.9 Array Creation Expressions
15.9.1 Run-time Evaluation of Array Creation Expressions
15.9.2 Example: Evaluation Order
15.9.3 Example: Evaluation Order and Out-of-Memory Detection
15.10 Field Access Expressions
15.10.1 Field Access Using a Primary
15.10.2 Accessing Superclass Members using super
15.11 Method Invocation Expressions
15.11.1 Compile-Time Step 1: Determine Class or Interface to Search
15.11.2 Compile-Time Step 2: Determine Method Signature
15.11.2.1 Find Methods that are Applicable and Accessible
15.11.2.2 Choose the Most Specific Method
15.11.2.3 Example: Overloading Ambiguity
15.11.2.4 Example: Return Type Not Considered
15.11.2.5 Example: Compile-Time Resolution
15.11.3 Compile-Time Step 3: Is the Chosen Method Appropriate?
15.11.4 Runtime Evaluation of Method Invocation
15.11.4.1 Compute Target Reference (If Necessary)
15.11.4.2 Evaluate Arguments
15.11.4.3 Check Accessibility of Type and Method
15.11.4.4 Locate Method to Invoke
15.11.4.5 Create Frame, Synchronize, Transfer Control
15.11.4.6 Implementation Note: Combining Frames
15.11.4.7 Example: Target Reference and Static Methods
15.11.4.8 Example: Evaluation Order
15.11.4.9 Example: Overriding
15.11.4.10 Example: Method Invocation using super
15.12 Array Access Expressions
15.12.1 Run-time Evaluation
15.12.2 Examples: Array Access Evaluation Order
15.13 Postfix Expressions
15.13.1 Names
15.13.2 Postfix Increment Operator ++
15.13.3 Postfix Decrement Operator --
15.14 Unary Operators
15.14.1 Prefix Increment Operator ++
15.14.2 Prefix Decrement Operator --
15.14.3 Unary Plus Operator +
15.14.4 Unary Minus Operator -
15.14.5 Bitwise Complement Operator ~
15.14.6 Logical Complement Operator !
15.15 Cast Expressions
15.16 Multiplicative Operators
15.16.1 Multiplication Operator *
15.16.2 Division Operator /
15.16.3 Remainder Operator %
15.17 Additive Operators
15.17.1 String Concatenation Operator +
15.17.1.1 String Conversion
15.17.1.2 Optimization of String Concatenation
15.17.1.3 Examples of String Concatenation
15.17.2 Additive Operators (+ and -) for Numeric Types
15.18 Shift Operators
15.19 Relational Operators
15.19.1 Numerical Comparison Operators <, <=, >, and >=
15.19.2 Type Comparison Operator instanceof
15.20 Equality Operators
15.20.1 Numerical Equality Operators == and !=
15.20.2 Boolean Equality Operators == and !=
15.20.3 Reference Equality Operators == and !=
15.21 Bitwise and Logical Operators
15.21.1 Integer Bitwise Operators &, ^, and |
15.21.2 Boolean Logical Operators &, ^, and |
15.22 Conditional-And Operator &&
15.23 Conditional-Or Operator ||
15.24 Conditional Operator ? :
15.25 Assignment Operators
15.25.1 Simple Assignment Operator =
15.25.2 Compound Assignment Operators
15.26 Expression
15.27 Constant Expression

16 Definite Assignment

16.1 Definite Assignment and Expressions
16.1.1 Boolean Constant Expressions
16.1.2 Boolean-valued Expressions
16.1.3 The Boolean Operator &&
16.1.4 The Boolean Operator ||
16.1.5 The Boolean Operator !
16.1.6 The Boolean Operator &
16.1.7 The Boolean Operator |
16.1.8 The Boolean Operator ^
16.1.9 The Boolean Operator ==
16.1.10 The Boolean Operator !=
16.1.11 The Boolean Operator ? :
16.1.12 The Conditional Operator ? :
16.1.13 Boolean Assignment Expressions
16.1.14 Other Assignment Expressions
16.1.15 Operators ++ and --
16.1.16 Other Expressions
16.2 Definite Assignment and Statements
16.2.1 Empty Statements
16.2.2 Blocks
16.2.3 Local Variable Declaration Statements
16.2.4 Labeled Statements
16.2.5 Expression Statements
16.2.6 if Statements
16.2.7 switch Statements
16.2.8 while Statements
16.2.9 do Statements
16.2.10 for Statements
16.2.10.1 Initialization Part
16.2.10.2 Incrementation Part
16.2.11 break, continue, return, and throw Statements
16.2.12 synchronized Statements
16.2.13 try Statements

17 Threads and Locks

17.1 Terminology and Framework
17.2 Execution Order and Consistency
17.3 Rules about Variables
17.4 Nonatomic Treatment of Double and Long Variables
17.5 Rules about Locks
17.6 Rules about the Interaction of Locks and Variables
17.7 Rules for Volatile Variables
17.8 Prescient Store Operations
17.9 Discussion
17.10 Example: Possible Swap
17.11 Example: Out-of-Order Writes
17.12 Threads
17.13 Locks and Synchronization
17.14 Wait Sets and Notification

18 Documentation Comments

18.1 The Text of a Documentation Comment
18.2 HTML in a Documentation Comment
18.3 Summary Sentence and General Description
18.4 Tagged Paragraphs
18.4.1 The @see Tag
18.4.2 The @author Tag
18.4.3 The @version Tag
18.4.4 The @param Tag
18.4.5 The @return Tag
18.4.6 The @exception Tag
18.5 Example

19 LALR(1) Java Grammar

19.1 Grammatical Difficulties
19.1.1 Problem #1: Names Too Specific
19.1.2 Problem #2: Modifiers Too Specific
19.1.3 Problem #3: Field Declaration versus Method Declaration
19.1.4 Problem #4: Array Type versus Array Access
19.1.5 Problem #5: Cast versus Parenthesized Expression
19.2 Productions from §2.3: The Syntactic Grammar
19.3 Productions from §3: Lexical Structure
19.4 Productions from §4: Types, Values, and Variables
19.5 Productions from §6: Names
19.6 Productions from §7: Packages
19.7 Productions Used Only in the LALR(1) Grammar
19.8 Productions from §8: Class Declarations
19.8.1 Productions from §8.1: Class Declaration
19.8.2 Productions from §8.3: Field Declarations
19.8.3 Productions from §8.4: Method Declarations
19.8.4 Production from §8.5: Static Initializers
19.8.5 Productions from §8.6: Constructor Declarations
19.9 Productions from §9: Interface Declarations
19.9.1 Productions from §9.1: Interface Declarations
19.10 Productions from §10: Arrays
19.11 Productions from §14: Blocks and Statements
19.12 Productions from §15: Expressions

20 The java.lang Package

20.1 The Class java.lang.Object
20.2 The Interface java.lang.Cloneable
20.3 The Class java.lang.Class
20.4 The Class java.lang.Boolean
20.5 The Class java.lang.Character
20.6 The Class java.lang.Number
20.7 The Class java.lang.Integer
20.8 The Class java.lang.Long
20.9 The Class java.lang.Float
20.10 The Class java.lang.Double
20.11 The Class java.lang.Math
20.12 The Class java.lang.String
20.13 The Class java.lang.StringBuffer
20.14 The Class java.lang.ClassLoader
20.15 The Class java.lang.Process
20.16 The Class java.lang.Runtime
20.17 The Class java.lang.SecurityManager
20.18 The Class java.lang.System
20.19 The Interface java.lang.Runnable
20.20 The Class java.lang.Thread
20.21 The Class java.lang.ThreadGroup
20.22 Classes for Exceptions and Errors
20.23 The Class java.lang.ExceptionInInitializerError

21 The java.util Package

21.1 The Interface java.util.Enumeration
21.2 The Class java.util.BitSet
21.3 The Class java.util.Date
21.4 The Class java.util.Dictionary
21.5 The Class java.util.Hashtable
21.6 The Class java.util.Properties
21.7 The Class java.util.Observable
21.8 The Interface java.util.Observer
21.9 The Class java.util.Random
21.10 The Class java.util.StringTokenizer
21.11 The Class java.util.Vector
21.12 The Class java.util.Stack
21.13 The Class java.util.EmptyStackException
21.14 The Class java.util.NoSuchElementException

22 The java.io Package

22.1 The Interface java.io.DataInput
22.2 The Interface java.io.DataOutput
22.3 The Class java.io.InputStream
22.4 The Class java.io.FileInputStream
22.5 The Class java.io.PipedInputStream
22.6 The Class java.io.ByteArrayInputStream
22.7 The Class java.io.StringBufferInputStream
22.8 The Class java.io.SequenceInputStream
22.9 The Class java.io.FilterInputStream
22.10 The Class java.io.BufferedInputStream
22.11 The Class java.io.DataInputStream
22.12 The Class java.io.LineNumberInputStream
22.13 The Class java.io.PushbackInputStream
22.14 The Class java.io.StreamTokenizer
22.15 The Class java.io.OutputStream
22.16 The Class java.io.FileOutputStream
22.17 The Class java.io.PipedOutputStream
22.18 The Class java.io.ByteArrayOutputStream
22.19 The Class java.io.FilterOutputStream
22.20 The Class java.io.BufferedOutputStream
22.21 The Class java.io.DataOutputStream
22.22 The Class java.io.PrintStream
22.23 The Class java.io.RandomAccessFile
22.24 The Class java.io.File
22.25 The Interface java.io.FilenameFilter
22.26 The Class java.io.FileDescriptor
22.27 The Class java.io.IOException
22.28 The Class java.io.EOFException
22.29 The Class java.io.FileNotFoundException
22.30 The Class java.io.InterruptedIOException
22.31 The Class java.io.UTFDataFormatException

Index

Colophon

``When I use a word," Humpty Dumpty said,
in rather a scornful tone, "it means just what I
choose it to mean-neither more nor less."
"The question is," said Alice, "whether you
can make words mean so many different things."
"The question is," said Humpty Dumpty,
"which is to be master-that's all."

-Lewis Carroll, Through the Looking Glass



Contents | Prev | Next | Index

Copyright © 1996 Sun Microsystems, Inc. All rights reserved.