Java的基本符号(token)
Java的单词符号有五种:关键字、标识符、常量、分隔符和操作符。
Java的字符集
Java 采用一种称为unicode的字符集,该字符集合是一种新的编码标准,与常见的ASCII码的区别在于:
unicode使用16位二进制而不是8位来表示一个字符。
unicode字符集中增加了许多非拉丁语字符。
标识符
Java标识符必须以字母,数字,美元符号"$",下划线"_"组成,标识符第一个字符不可用数字。
Java语言对字母的大小写是敏感的,在语法中严格区分大小写。
关键字
关键字是为特定目的而保留的保留字,程序员不要将关键字作为自己的标识符。 Java的关键字有:
abstract boolean break byte case catch char class continue do double else extends false
find finally float for implements import instanceof int interface long native new null
package private public return short static super switch synchronized this throw true try void while
常量
常量可分为整型常量,浮点数常量,字符常量,字符串常量和布尔常量。
整型常量:可分为int型和long型两种,缺省为int型,long型数值后加L。 整型常量可用10、8和16进制表示。
如:123(十进制) 052(八进制) 0x3c(十六进制)
浮点数常量:有单精度和双精度之分,缺省为双精度,单精度在数值后加f。另外,浮点数常量也可用普通计数法和科学计数法来表示。
如:1.23f 1.1E-2
字符常量:用' '括起来的一个字符。如'a','H'。
使用16位的unicode字符集。
Java 语言可使用转义字符'\'来标记特殊字符。如'\n'表示换行符。
字符串常量用" "包括,如"Hello World"。
布尔常量只有两个值,true和false。
分隔符
分隔符起分隔单词符号的作用。包括分号";"、花括号"{}"和空白符号。
Java的注释
Java的注释有三种形式:
单行注释
如://Comment on one line
多行注释
如:/* Comment on one
or more lines */
文档注释
如:/** Document
Comment */
Java的数据类型和变量
Java的基本数据类型
Java的基本数据类型有8种,见下表:
数据类型 类别 宽度(位) 取值范围
boolean 逻辑型 1 true/false
char 文字型 16
byte 整数类型 8 -27 ~ 27-1
short 整数类型 16 -215 ~ 215-1
int 整数类型 32 -231 ~ 231-1
long 整数类型 64 -263 ~ 263-1
float 浮点型 32
double 浮点型 64
Java的变量
Java的变量在使用前必须声明。如 int radios, color;
Java为所有基本数据类型的变量作了预定义(预设置的值)。如
类型名 boolean char byte short int long float double
预置值 false '\u0000' (byte)0 (short)0 0 0L 0.0f 0.0
数据类型的转换
Java是一种强类型的语言,在赋值和参数传递时,都要求类型的匹配。类型转换有三种情况:自动转换、强制转换和使用类的方法转换。
自动转换:往往低精度类型到高精度类型能自动转换。
如: byte b1=10, b2=20;
int b3=b1+b2;
强制转换:高精度类型到低精度类型必须强制转换。这时数据可能会丢失部分信息。
如:char key=(char)(12+55) //变量key被赋值为unicode值为67的字符'c'
方法转换:如
String str = "123";
int a = Integer.parseInt(str);
使用Integer类的方法parseInt将String转换为对应的整数。
Java编程的习惯约定
为了提高程序的可读性,Sun公司推荐在Java编程时使用以下的习惯约定:
类名(classes):有一个或若干个名词组成,开头大写,名词间的区分也用大写,其他小写。
如:class AccountBook
class ComplexVariable
接口(Interfaces):规则同类名。
如:Interface Account
方法(methods): 由一个或多个动词组成,开头小写,动词间区分用大写,其他小写。
如:balanceAccount()
变量:小写字母开头,单词间用大写字母分隔
如:currentCustomer
常量:所有字母大写,单词间用下划线区分
如:MAXIMUM_SIZE
Java的操作符
根据操作对象的个数操作符可分为一元、二元或三元操作符。根据操作符的功能,又可分为算术、逻辑、关系等操作符。
算术操作符
一元: + - ++ --
二元: + - * / %
值得注意的是 ++ 和-- 操作符,
如:int a,x=1,y=5;
a = ++x;b=y++;
此时a的值为2(先加1,后赋值),b的值为5(先赋值,后加1)。
二元操作符两侧的操作对象数据类型不同时,先自动进行类型转换,再进行操作。
赋值操作符与复合赋值操作符
可将 变量 = 变量 op 表达式
写成 变量 op = 表达式
如:x+=20 与 x=x+20 结果一致,但更简洁。
注意:= 与 = = 的不同。
位操作符和移位操作符
位操作符
&(按位与) |(按位或) ^(按位异或)
移位操作符
E<E>>n 右移n位,空位用原最高位的位值补足,相当于E/2
E>>>n 右移n位,空位补0
关系操作符
关系操作符共六个:
>(大于) >=(大于等于) <(小于)<=(小于等于) !=(不等于) = =(相等)
关系操作符的结果为boolean型数据(true或false)。
注:= = 操作符只有在比较双方均完全一致时,其值为true,如比较的是两个对象,即使两个对象的内容相同,结果也为false,
只有这两个对象为同一对象时才为true。
逻辑操作符
逻辑操作符的操作对象和结果均为boolean型,共六个:
!(逻辑非) && (逻辑与) ||(逻辑或)
^(逻辑并或) & (逻辑与) | (逻辑或)
按位与'&'也可作为逻辑与使用,但未作优化,而'&&'操作符是经过优化的。对'|'操作符也类似。
其他操作符
条件操作符 E1?E2:E3
表达式E1若成立,执行表达式E2,否则执行E3。
逗号操作符
","可用于分隔语句。
如 int x,y;
for (x=0,y=0;x<10;x++) {...};
操作符的优先级和结合规则
优先级:
一元 〉算术 〉移位 〉关系 〉按位 〉逻辑 〉三元 〉(复合)赋值 〉逗号
结合规则:
除一元、三元和赋值操作符是自右至左结合外,其他均自左至右结合。
语句的分类
Java语句按是否改变运行的状态可分为执行语句(如表达式语句)和非执行语句(如声明语句)。任何语句的末尾都以“;”结束。
执行语句按其组成可分三类:
空语句
只有一个语句结束符“;” ,无任何内容。
基本语句(单语句)
独立的、完整的不能再分割为更小的可执行单元。
复合语句(块语句)
包含在{ }内的一条或若干条语句。
Java的基本语句的结构可分为4类:
(1)顺序结构语句 (2)分支语句 (3)循环语句 (4)例外处理语句
后三种语句又称为流控制语句,我们将主要介绍分支语句和循环语句,而例外处理语句包括try、catch、finally以及throw语句。
这些语句是Java所特有的。我们将在后面作专门的介绍。
分支语句
分支语句包括if-else, break, switch, return等语句。分支语句提供了一种控制机制,使得程序可以跳过一些语句,转去执行特定的语句。
条件语句 if-else.
if-else语句根据判定条件的真假来执行两种操作中的一种,其格式为:
if (boolean-expression)
statement1;
else
statement2;
其中,要注意的有:
布尔表达式boolean-expression是任意一个返回布尔型数据的表达式(这比C、C++的限制要严格)。
每个单一的语句后都必须有分号。
语句statement1, statement2可以是复合语句,这时要用花括号{}。{}外面不加分号。
else子句是任选的。
若布尔表达式的值为true,则程序执行statement1,否则执行statement2。
if-else语句的一种特殊形式为:
if (expression1){
statement1
} else if (expression2){
statement2
}……
}else if (expressionN){
statementN
}
else子句不能单独作为语句使用,它必须和if配对使用。else总是与离它最近的if配对。可以通过使用花括号{}来改变配对关系。
例3.1: 比较两个数的大小,并按从小到大的次序输出。
public class CompareTwo{
public static void main (String args[]){
double d1=23.4;
double d2=35.1;
if (d2>=d1)
System.out.println(d2+">="+d1);
else
System.out.println(d1+">="+d2);
}
}
例3.2:判断某一年是否为闰年。
闰年的条件是符合下面二者之一: ①能被4整除,但不能被100整除; ②能被400整除。
public class LeapYear{
public static void main (String args[]){
int year=1989; //method1
if ((year%4==0 && year%100!=0) || (year%400==0))
System.out.println(year+"is a leap year.");
else
System.out.println(year+"is not a leap year.");
year=2000; //method2
boolean leap;
if (year%4 != 0)
leap=false;
else if (year%100 != 0)
leap=true;
else if (year%400 != 0)
leap=false;
else
leap=true;
if(leap==true)
System.out.println(year+" is a leap year.");
else
System.out.println(year+"is not a leap year.");
}
}
该例中,方法1用一个逻辑表达式包含了所有的闰年条件,方法2使用了if-else语句的特殊形式。
多分支语句switch
switch语句是一种多分支选择语句,它可根据switch中表达式的值,来执行多个操作中的一个,它的一般格式如下:
switch (expression){
case value1: statement1;
break;
case value2: statement2;
break;
…………
case valueN: statemendN;
break;
[default: defaultStatement;]
}
表达式expression可以返回任一简单类型的值(如整型、字符型),多分支语句把表达式返回的值与每个case子句中的值(一个常量)相比。
如果匹配成功,则执行该case子句后的语句序列。
default子句是任选的。当表达式的值与任一case子句中的值都不匹配时,程序执行default后面的语句。如果表达式的值与任一case子句
中的值都不匹配且没有default子句,则程序不做任何操作,直接跳出switch语句。
break语句用来在执行完一个case分支后,使程序跳出switch语句,即终止switch语句的执行。
switch语句的功能可以用if-else来实现,但在某些情况下,使用switch语句更简炼,且程序的执行效率提高。
例3.3 根据考试成绩的等级打印出百分制分数段。
public class GradeLevel {
public static void main(String args[]){
System.out.println("\nOutPut is:");
char grade='C'; //normal use
switch (grade){
case 'A': System.out.println(grade+"is 85~100");
break;
case 'B': System.out.println(grade+"is 70~84");
break;
case 'C': System.out.println(grade+"is 60~69");
break;
case 'D': System.out.println(grade+"is <60");
break;
default: System.out.println("inputerror");
}
}
}
break语句
在switch语中,break语句用来终止switch语句的执行。使程序在switch语句后的第一个语句开始执行。
在Java中,可以为每个代码块加一个括号。一个代码块通常是用花括号{}括起来的一段代码。加标号的格式如下:
BlockLabel: {codeBlock}
break语句的第二种使用情况就是跳出它所指定的块,并从紧跟该块的第一条语句处执行。其格式为: break BlockLabel;
例如:
a: {…… //标记代码块a
b: {…… //标记代码块b
c: {…… //标记代码块c
break a;
……//will not be executed
}
……//will not be executed
}
……//will not be executed
}
…… //execute from here
与C、C++不同, Java中没有goto语句来实现任意的跳转, 因为goto语句破坏程序的可读性, 而且影响编译的优化。Java用break来实
现goto语句所特有的一些功能。
返回语句return
return语句用于从当前执行的方法中退出, 并返回到调用该方法的语句处继续程序的执行。返回语句有两种格式:
return expression
返回一个值给调用该方法的语句, 返回值的数据类型必须与方法声明中的返回值类型一致。可以使用强制类型转换来使类型一致。
return
当方法说明中用void声明返回类型为空时, 可以使用这种格式, 它不返回任何值。不带参数的return语句有时可省略。
return语句通常用在一个方法体的最后。
循环语句
循环语句包括 while, do-while, for, continue 等语句。循环语句的作用是反复执行一段代码,直到满足循环终止条件为止,
一个循环一般应包括四部分内容:
初始化部分(initialization): 用来设置循环的一些初始条件,计数器清零等。
循环体部分(body): 这是反复循环的一段代码,可以是单一的一条语句,也可以是复合语句。
迭代部分(iteration): 这是在当前循环结束,下一次循环开始前执行的语句,常常用来使计数器加1或减1。
终止部分(termination): 通常是一个布尔表达式,每一次循环要对该表达式求值,以验证是否满足循环终止条件。
下面分别介绍Java中的while语句,do-while语句和for语句。
while语句
while语句的一般格式为:
[初始化]
while (条件表达式E){
语句S; //循环体
}
当条件表达式E的值为true时,循环执行花括号中的语句S。S中包括迭代部分。
while语句首先计算条件表达式E是否成立,当条件成立(true)时,才去执行循环中的语句。所以有可能循环体一次也不执行。
do-while语句
do-while语句的一般格式为:
[初始化]
do {
语句S; //循环体
} while (条件表达式E);
do-while语句首先执行循环体, 然后再计算终止条件, 若结果为true, 则循环执行语句S, 直到条件表达式E的结果为false。
与while语句不同的是, do-while语句的循环体至少执行一次。
for语句
for语句的一般格式为:
for (初始表达式; 条件表达式; 迭代表达式) {
语句S; //循环体
}
for语句执行时,首先执行初始化操作,然后判断终止条件是否满足,如果满足,则执行循环体中的语句,最后执行迭代部分。
完成一次循环后,重新判断终止条件。
可以在for语句的初始化部分声明变量,它的作用域为整个for语句。
for语句通常用来执行循环次数确定的情况(如对数组元素进行操作)。
在初始化部分和迭代部分可以使用逗号语句来分隔多个操作。例如:
for (i=0,j=10; i<j; i++,j--) {
……
}
continue语句
continue语句用来结束本次循环, 跳过循环体中下面尚未执行的语句, 接着进行终止条件的判断, 以决定是否继续循环。
也可以用continue跳转到括号指明的外层循环中,这时的格式为
continue outerLable;
例3.4:下例分别用while、do-while和for语句实现累计求和。
public class Sum{
public static void main(String args[]){
System.out.println("\n**while statement**");
int n=10,sum=0; ∥initialization
while (n>0){ ∥termination
sum+=n; ∥body
n--; ∥iteration
}
System.out.println("sum is"+sum);
System.out.println("\n**do_while statement**");
n=0; ∥initialization
sum=0;
do{
sum+=n; ∥body
n++; ∥iteration
} while(n<=10); ∥termination
System.out.println("sum is"+sum);
System.out.println("\n**for statement**");
sum=0;
for (int i=1;i<=10;i++){
sum+=i;
}
System.out.println("sum is"+sum);
}
}
可以从中来比较这三种循环语句,从而在不同的场合选择合适的语句。
数组
数组是有序数据的集合, 数组中的每个元素具有相同的类型。数组名和下标可唯一地确定数组中的元素。数组可分为一维数组和多维数组。
一维数组
声明方式:
type arrayName[];
或 type[] arrayName;
type可以是Java中任意的数据类型, arrayName为数组名。
如: int intArray[];
声明了一个名为intArray的整型数组, 数组中的每个元素为int型数据。
Java在数组的声明中并不为数组元素分配内存, 因此 [ ] 中不用指出数组中元素个数, 即数组长度。
在访问数组的任何元素之前,我们必须为它分配内存空间, 这可用new操作符, 其格式如下:
arrayName = new type[arraySize];
其中,arraySize指明数组的长度。
如: intArray = new int[3]; 为该数组分配了3个int型整数所需的内存空间。
通常, 这两部分可以合在一起, 格式如下:
type arrayName[] = new type[arraySize];
如: int intArray[] = new int[3];
用new操作符为数组分配内存空间后,就可以引用数组中的每一个元素。数组元素的引用方式为: arrayName[index]
其中: index为数组下标,它可以为整型常数或表达式。如a[3], b(i为整型), c[6*I]等。下标从0开始, 一直到数组的长度减1。
对于上面例子中的intArray数组来说,它有3个元素,分别为:
intArray[0], intArray[1], intArray[2]。(注意: 没有intArray[3]。)
另外,与C、C++中不同,Java对数组元素要进行越界检查以保证安全性。同时,对于每个数组都有一个属性length指明它的长度。
例如: intArray.length指明数组intArray的长度。
数组的初始化
对数组元素可以按照上述的例子进行赋值。也可以在定义数组的同时进行初始化。
如: int a[]={1,2,3,4,5};
用逗号(,)分隔数组的各个元素,系统自动为数组分配一定的内存空间。
例3.5:数组的使用:
public class ArrayTest{
public static void main(String args[]){
int i;
int a[]=new int[5];
for (i=0;i<5;i++)
a=i;
for (i=a.length-1;i>=0;i--)
System.out.println("a["+i+"]="+a);
}
}
多维数组
与C、C++一样, Java中多维数组可被看作数组的数组。例如二维数组就可看成是一个特殊的一维数组, 该数组的每个元素又
是一个一维数组。下面我们主要以二维数组为例来说明多维数组。
二维数组的声明方式如下:
type arrayName[][];
如: int intArray[][];
与一维数组一样,这时对数组元素也没有分配内存空间,同要使用运算符new来分配内存,然后才可以访问每个元素。
对二维数组中每个元素,引用方式为:
arrayName[index1][index2]
其中index1、index2为下标, 可为整型常数或表达式, 如a[2][3]等。数组每一维的下标也都从0开始。
在声明二维数组的同时也可对它进行初始化。
如:int a[][]={{2,3},{1,5},{3,4}};
定义了一个3×2的数组,并对每个元素赋值。
数组的越界
如果使用数组分量时,其下标超过规定的值,则会发生数组的越界。这时,虽然程序能通过编译,但在运行时会产生一个
名为ArrayIndexOutOfBoundsException 的例外,所以编程时要注意检查数组下标。
阅读(917) | 评论(0) | 转发(0) |