Java语言规格说明1程序结构Java语言的源程序代码由一个或多个编译单元.docx
《Java语言规格说明1程序结构Java语言的源程序代码由一个或多个编译单元.docx》由会员分享,可在线阅读,更多相关《Java语言规格说明1程序结构Java语言的源程序代码由一个或多个编译单元.docx(18页珍藏版)》请在冰豆网上搜索。
Java语言规格说明1程序结构Java语言的源程序代码由一个或多个编译单元
Java语言规格说明
1.程序结构
Java语言的源程序代码由一个或多个编译单元(compilationunit)组成,每个编译单元只能包含下列内容(空格和注释除外):
*一个程序包语句(packagestatement)
*引入语句(importstatements)
*类的声明(classdeclarations)
*界面声明(interfacedeclarations)
每个Java的编译单元可包含多个类或界面,但是每个编译单元却至多有一个类或者界面是公共的。
Java的源程序代码被编译之后,便产生了Java字节代码(bytecode)。
Java的字节代码由一些不依赖于机器的指令组成,这些指令能被Java的运行系(runtimesystem)有效地解释。
Java的运行系统工作起来如同一台虚拟机。
在当前的Java实现中,每个编译单元就是一个以.java为后缀的文件。
每个编译单元有若干个类,编译后,每个类生成一个.class文件。
.class文件是Java虚机器码。
2.词法问题
在编译的过程中,Java源程序代码中的字符被划分为一系列的标记(token)。
Java编译器可以识别五种标记:
标识符、关键字、字面量、运算符以及特殊分隔符。
注释以及诸如空格、制表符、换行符等字符,都不属于标识之列,但他们却常被用来分隔标记。
Java程序的编写采用泛代码Unicode字符集,若采用其它的字符集,则需在编译前转换成Unicode。
2.1注释
Java语言提供了3种形式的注释:
//text从//到本行结束的所有字符均作为注释而被编译器忽略。
/*text*/从/*到*/间的所有字符会被编译器忽略。
/**text*/
当这类注释出现在任何声明之前时将会作特殊处理,它们不能再用在代码的任何地方。
这类注释意味着被括起来的正文部分,应该作为声明项目的描述,而被包含在自动产生的文档中。
2.2标识符
标识符的首字符必须是一个字母,下划线("_")或美元符号("$")。
后面的字符也可是数字0-9。
Java使用泛代码字符集,为了便于识别好一合法标识符,下面列出它的“字母”:
*大写字母“A”~“Z”
*小写字母“a”~“z”
*泛代码(Unicode)
中所有字符编码在十六进制数00C0之前的字符。
标识符中,首字母后的字符可以是任意的。
当然,Unicode区段中那些被保留作特殊字符的除外。
由此,“garton”及“MjΦlner”都是合法标识符,但是,包括诸如“π”的字符串却不是合法的。
2.3关键字
下面的标识符被保留用作关键字,他们不能作任何其它的用途。
abstractdefaultgoto*nullsynchronized
booleandoifpackagethis
breakdoubleimplementsprivatethreadsafe
byteelseimportprotectedthrow
byvalve*extendsinstanceofpublictransient
casefalseintreturntrue
catchfinalinterfaceshorttry
charfinallylongstaticvoid
classfloatnativesuperwhile
const*fornewswitch
continue
其中,加*标记后是被保留但当前却未使用的。
2.4字面量
字面量(literal)是某些类型值的基本表述,这些类型包括整型,浮点型,布尔量,字符及字符串。
2.4.1整型字面量
整数可有三种表示形式:
十进制,八进制和十六进制。
一个十进制整型字面量由一系列的数字组成,但它的第一个数字不能是0(有时十进制数字也可象下面讲的那样加后缀)。
整数也可表达成八进制或十六进制形式。
以0开头的整型字面量,意味着它是一个十六进制的。
十六进制整数可以包括数字0-9以及字母a-f及A-F。
八进制整数中则只能是出现数字0-7。
在超过32位所能表示的范围之前,整型字面量的类型即为int,否则为long型。
一个整型字面量可通过加后缀L或l而强迫成long型。
下面的均为合法的整型字面量。
22L0777
2.4.2浮点字面量
一个浮点字面量可包括以下部分:
一个十进制整数,一个小数点“.”,小数部分(另外一个十进制整数),指数部分,一个类型后缀。
指数部分是一个e或E后跟一个整数。
浮点字面量至少包含有一个数字,外加或者一个小数点或者一个e(或E),下面举一些浮点字面量的例子:
3.14153.1E12.1e122E12
就象在后面描述的那样,Java语言有两种浮点类型:
float及double,用户可按以下写法区分:
2.0d或2.0Ddouble型
2.0f或2.0F或2.0float型
2.4.3布尔字面量
布尔(boolean)字面量有两个值:
true及false。
2.4.4字符字面量
字符字面量是一个由单引号括起的字符(或者是由一组字符来表述一个字符)。
字符属于char类型,并且均从泛代码字符集中得来。
而下面列出的转义序列则用来描述一些非图形字符,它们以反斜杠“\”开始以作转义用。
续行符头\
换行NL(LF)\n
垂直制表符HT\t
退格BS\b
回车CR\r
走纸换页FF\f
反斜杠\\\
单引号'\'
双引号"\"
八进制数0ddd\ddd
十六进制数0xdd\xdd
泛代码字符0xdddd\udddd
2.4.5串字面量
串字面量是双引号引起的零个或多个字符的序列。
每个串字面量被看作是一个串对象,而并非是一个字符的数组,例如“abc”创建了一个新的串类的实例。
下面的都是合法的串字面量:
""\\空串
"\""\\只包含一个双引号的串
"Thisisastring"
"Thisisa\
two-linestring"
2.5运算符及特殊分隔符
下面这些字符在Java源程序中作运算符或分隔符用:
+—!
%^&*|~/><
(){}[];?
:
,·=
另外,下面这些复合字符被用作运算符:
++--==<=>=!
=<<>>
>>>+=-=*=/=&=/=
^=%=<<=>>=>>>=‖&&
后面还要在运算符一节中作详细介绍。
3.类型
任何一个变量或表达式都有一个类型,类型决定变量可能的取值范围,决定对这些值允许的操作,以及这些操作的意义是什么。
Java语言中提供了内置定义类型,程序员也可以利用类及界面(interface)机制构造新类型。
Java语言有两种类型:
简单类型和复合类型。
简单类型指那些不能再分割的原子类型。
如:
整型、浮点型、布尔型、字符型均为简单类型。
复合类型建立在简单类型的基础上。
Java语言有三种复合类型:
数组、类及界面。
3.1数值类型
3.1.1整数类型
整数与C及C++中相似,但有两点区别:
其一,所有的整数类型均是独立于机器的;其二,对某些传统的定义作出改变,以反映自C问世以来所带来的变化,四种整数类型分别具有8位、16位、32位及64位的宽度,并且均是有符号的(signed)。
如下所示:
宽度
类型名
8
byte
16
short
32
int
64
long
一个变量的类型不会直接影响它的存储的分配,类型仅仅决定变量的算术性质以及合法的取值范围。
如果把一个超出合法范围的值赋给一变量,那么这个值将是对合法值域取模后的值。
3.1.2浮点类型
关键字float表示单精度(32位),而double则表示双精度(64位),两个float型数运算的结果仍是float型,若有其中之一为double型,则结果为double型。
3.1.3字符类型
Java全部使用泛代码字符集,因此char类型数据被定义成一个16位的无符号整数。
3.2布尔类型
当一个变量的取值或为ture或为false,或者是当一个方法的返回值为ture或false时,它?
nbsp;嵌际遣级嘈偷摹A硗猓叵翟怂愕慕峁嗍遣?
nbsp;尔型的。
布尔值不是数值型,因此不能用强制类型转换把它们转化成数值。
3.3数组
数组在Java语言中属第一类对象。
由它们代替了指针运算,所有的对象(包括数组)都可通过标识来引用。
即使被当作数运算,标识的值也不应被破坏。
通过new运算符可创建一个数组。
chars[]=newchar[30];
数组第一元素的下标为0,在声明中指定维数是不允许的。
每次都必须显式地用new分配数组:
inti[]=newint[3];
Java语言不支持多维数组,但是,程序员却可以创建数组的数组。
inti[][]=newint[3][4];
至少有一维要明确给定,而其它维则可在以后再确定。
例如:
inti[][]=newint[3][]
是一个合法的声明。
除了在变量名及方法名后跟方括号这种C风格的声明之外,Java语言允许方括号跟在数组类型之后,下面两行是等价的:
intiarray[];
int[]iarray;
同样地,方法声明也一样:
bytef(intn)[];
byte[]f(intn);
运行时检查下标保证它们是合法的:
inta[]=newint[10];
a[5]=1;
a[1]=a[0]+a[2];
a[-1]=4;//运行时引发一个ArrayIndexOutOfBoundsException(数组下标越界)异常
a[10]=2;//运行时引发一个ArrayIndexOutOfBoundsException(数组下标越界)异常
数组的大小必须使用整数表达式:
intn;
floatarr[]=newfloat[n+1]
数组的长度可通过.length查找:
inta[][]=newint[10][3];
println(a.length)//打印出10
println(a[0].length)//打印出3。
3.3.1数组细节
定义的数组都是Object类的一个子类的实例,在类的层次结构中有一个被称为Array的子类,它有一个实例变量“length”。
对每一个基本类型,都有一个相应的Array的子类。
同理,每一个类也都有一个相应的Array子类存在。
例如:
newThread[n]创建一个Thread[]的实例。
如果类A是类B的超类,那么,A[]是B[]的超类,见下图:
Object
ArrayA
int[]float[]A[]B
B[]
因此,可以把数组赋给一个Object变量。
Objecto;
inta[]=newint[10];
o=a;
并且可通过强制类型转换把object变量赋给一数组变量。