Java表达式和语句
1.变量
-
变量及作用域
- 局部变量
在一个方法或由一对{}表示的代码块内定义的变量称为局部变量,有时也称为自动变量、临时变量或堆栈变量。局部变量的作用域是所在的方法或代码块,当程序执行流进入所在方法(或代码块)时创建,在方法(或代码块)退出时消亡,因此也称为自动变量或临时变量。 - 类成员变量
在方法外进行声明且属于一个类的定义体的变量称为类成员变量。类成员变量的作用域是整个类,具体可以有两种类型:一种是用static关键字声明的类变量,该变量在类加载时创建并且只要所属的类存在,该变量就将一直存在;另一种是声明中没有static关键的变量,称为实例变量。实例变量在调用类的构造方法(new XXX())创建实例对象时创建,并且只要有引用指向变量所属的对象,该变量就将存在。 - 方法参数
方法参数定义了方法调用时传递的参数,其作用域就是所在的方法。当方法被调用时创建方法参数变量,而在方法运行结束时,这些变量就消亡了。 - 异常处理器(catch语句块)参数
异常处理器参数是catch语句块的入口参数。这种参数的作用域是catch语句后由{}表示的语句块
//各个变量及其作用域 class MyClass{ ... //类成员变量作用域 member variable declarations ... public void aMethod(method parameters){//方法参数作用域 ... //局部变量作用域 local variable declarations ... catch(exception handler parameters){ //异常处理器参数作用域 ... } } }
- 局部变量
-
变量的初始化
在Java程序中,变量在使用前必须经过初始化。当创建一个对象时,对象包含的实例变量在存储空间分配后,按下表列出的值进行初始化。变量类型 初始值 变量类型 初始值 byte 0 double 0.0D short 0 cahr ‘\u0000’ int 0 boolean false long 0L 所有引用型(类,接口,数组) null float 0.0F
2.运算符与表达式
Java的运算符与标准C基本相同,C语言中提供的运算符几乎完全适合Java,但有两方面不同,首先,Java时强类型语言,其类型限制比C语言严格,表现在表达式上就是运算符的操作对象类型会受到更多的限制。其次,C语言提供的指针运算符等,在Java中不再提供,而Java增加了对象操作符instanceof,字符串运算符"+“和零填充的右移”>>>"等
-
概述
- 算数运算符: +,-,*,/,%,++,–。
- 关系运算符: >,>=,<,<=,==,!=。
- 逻辑运算符: &,|,!,^,&&,||。
- 位操作符: >>,<<,>>>,&,|,^,~。
- 赋值操作符: =,+=,-=,*=,/=,%=,&=,|=,^=,<<=,>>=,>>>=。
-
算数运算符和算数表达式
算术表达式由操作数和算术运算符组成。在算术表达式中,操作数只能是整型或浮点型。Java的算术运算符有两种:二元算术运算符和一元算术运算符。
二元算术运算符涉及两个操作数,共有5种:十,一,*,/,%,如表所示。这些算术运算符适用于所有数值型数据类型。运算符 表达式 名称及功能 + op1+op2 加 - op1-op2 减 * op1*op2 乘 / op1/op2 除 % op1%op2 模数除(求余) 整型、浮点型经常进行混合运算。运算中,不同类型的数据先转换为同一类型,然后进行运算。这种转换是按照如下优先关系自动进行的。
低-------------------------------------------------------->高
byte–>short–>char–>int–>long–>float–>double
按照这种优先级关系,在混合运算中低级数据转换为高级数据时,自动进行类型转换转换规则如表所示。
操作数1类型 操作数2类型 转换后类型 byte或short int int byte,short或int long long byte,short,int或long float float byte,short,int,long或float double double char int int 注意:
(1)即使两个操作数全是 byte 型或 short型,表达式的结果也是 int 型。
(2)/运算和%运算中除数为0时,会产生异常。
(3)与C和C++不同,取模运算符%的操作数可以为浮点数,如9.5%3=0.5。
(4)+运算符可以用来连接字符串。例如,
String salutation="Dr. "; String name= "Peter" + "Symour"; String title=salutation + name; //则title值为:Dr. Peter Symour
一元算术运算符所涉及的操作数只有一个,共有4种:+,-,++,–。各种一元算术运算符用法以及功能如表所示。
运算符 用法 功能描述 + +op 如果op是byte,short或char类型,则将op类型提升为int型 - -op 取op负值 ++ op++ op加1,先求op的值再把op加1 ++ ++op op加1,先把op加1再求op的值 – op– op减1,先求op的值再把op减1 – –op op减1,先把op减1再求op的值 另外,Java中没有幂运算符,必须采用Java.lang.Math类的pow()方法。该方法的定义如下:
public static double pow(double a,double b);//返回值是 a
Java.lang.Math类提供了大量数学和工程函数。例如,和e均由常数表示,而且为精度类型,所以非常精确。Math类包含了平方根、自然对数、乘幂、三角函数等数学函数另外,它也包含了一些基本函数,如可对浮点数进行四舍五人运算,计算同样类型两个数字的最大值和最小值,计算绝对值等。
-
关系运算符与关系表达式
关系运算符用来比较两个操作数,由两个操作数和关系运算符构成一个关系表达式,关系运算符的操作结果是布尔类型的,即如果运算符对应的关系成立,则关系表达式结果为true,否则为false。关系运算符都是二元运算符,共有6种,如表所示。运算符 表达式 返回true值时的情况 > op1>op2 op1大于op2 < op1<op2 op1小于op2 >= op1>=op2 op1大于等于op2 <= op1<=op2 op1小于等于op2 == op1==op2 op1等于op2 != op1!=op2 op1不等于op2 Java中,任何类型的数据(包括基本数据类型和复合类型)都可以通过==或!=来比较是否相等(这与C和C++不同)。
-
逻辑运算符与逻辑表达式
逻辑表达式由逻辑型操作数和逻辑运算符组成。一个或多个关系表达式可以进行逻辑运算。Java中逻辑运算符共有6种,即5个二元运算符和1个一元运算符。这些运算符及其使用方法、功能与含义,如表所示。运算符 用法 返回true时的情况 && op1&&op2 op1和op2都为true,并且在op1为true时才求op2的值 || op1||op2 op1或op2为true,并且在op1为false 时才求 op2的值 ! !op op 为 false & op1&op2 op1和op2都为true,并且总是计算op1和op2的值 | op1|op2 op1或op2为true,并且总是计算op1和op2的值 ^ op1^op2 op1和op2的值不同,即一个取 true,另一个取 false 注意:
表中,有两种“与”和“或”的运算符:&&、||以及&、|。这两种运算符的运算过程有所差别,如下所述。
&&,||:称为短路与、或运算。表达式求值过程中先求出运算符左边的表达式的值,对于或运算如果为true,则整个布尔逻辑表达式的结果确定为true,从而不再对运算符右边的表达式进行运算;同样对于与运算,如果左边表达式的值为false,则不再对运算符右边的表达式求值,整个布尔逻辑表达式的结果已确定为false。
&,|:称为不短路与、或运算,即不管第一个操作数的值是true还是false,仍然要把第二个操作数的值求出,然后再做逻辑运算求出逻辑表达式的值。 -
位运算
对于任何一种整数类型的数值,可以直接使用位运算符对这些组成整型的二进制位进行操作。这意味着可以利用屏蔽和置位技术来设置或获得一个数字中的单个位或几位,或者将一个位模式向右或向左移动。由位运算符和整型操作数组成位运算表达式。
位运算符分为位逻辑运算符和位移位运算符。
(1)位逻辑运算符
位逻辑运算符有3个二元运算符和1个一元运算符。二元运算中,是在两个操作数的每个对应位上进行相应的逻辑运算。一元运算符是对操作数按位进行相应的运算。位逻辑运算符以及操作描述如表所示。表 给出了位逻辑运算&、|、^、~的表达式取值。运算符 位运算表达式 操作描述 & op1&op2 按位与 | op1|op2 按位或 ^ op1^op2 按位异或 ~ ~op2 按位取反 //按位取反运算符~对数据的每个二进制位取反,即把1变为0,把0变为1。 //下面是几个位逻辑运算的例子: 00101101&01001111=00001101;00101101|01001111=01101111; 00101101^01001111-01100010; ~01001111=10110000。
(2)位移运算符Java使用补码来表示二进制数。因此移位运算都是针对整型数的二进制补码进行在补码表示中,最高位为符号位,正数的符号位为0,负数为1。补码的规定如下。
- 对正数来说,最高位为0,其余各位代表数值本身(以二进制表示),如+42的补码为 00101010。
- 对负数来说,把该数绝对值的补码按位取反,然后对整个数加1,即得该数的补码。如-1的补码为11111111(一1绝对值的补码为00000001,按位取反再加1为11111110十1=11111111)。用补码来表示数,0的补码是唯一的,为00000000。
移位运算符把它的第一个操作数向左或向右移动一定的位数。Java中的位运算符及其操作的描述,如表所示。
运算符 用法 操作描述 >> op1>>op2 将op向右移动op2个位 << op1<<op2 将op1向左移动op2个位 >>> op1>>>op2 将op向右移动op2个位(无符号) -
赋值运算符和赋值表达式
赋值表达式由变量、赋值运算符和表达式组成。赋值运算符把一个表达式的值赋给一个变量。赋值运算符分为赋值运算符“=”和扩展赋值运算符两种。在赋值运算符两侧的类型不一致的情况下,如果左侧变量类型的级别高,则右侧的数据被转化为与左侧相同的高级数据类型后赋给左侧变量;否则,需要使用强制类型转换运算符。例如:byte b=121; int i=b; //自动类型转换 byte c=13; byte d=(byte)(b+ c); //强制类型转换
在赋值运算符“=”前加上其他运算符,则构成扩展赋值运算符。表列出了Java中的扩展赋值运算符及等价的表达式。扩展赋值运算符的特点是可以使程序表达简练,并且还能提高程序的编译速度。例如:
- b %=6 等价于 b=b%6;
- a+=3 等价于 a=a+3;
运算符 表达式 等效表达式 += op1+=op2 op1=op1+op2 -= op1-=op2 op1=op1-op2 *= op1*=op2 op1=op1*op2 /= op1/=op2 op1=op1/op2 %= op1%=op2 op1=op1%op2 &= op1&=op2 op1=op1&op2 |= op1|=op2 op1=op1|op2 ^= op1^=op2 op1=op1^op2 >>= op1>>=op2 op1=op1>>op2 <<= op1<<=op2 op1=op1<<op2 >>>= op1>>>=op2 op1=op1>>>op2 -
其他运算符
Java支持的其他运算符的使用方法与功能描述如表所示。运算符 格式 操作描述 ?: op1?op2:op3 条件运算符。如果op1时true,返回op2,否则返回op3 [] type[] 声明类型为type的数组 [] type[op1] 创建op1个元素的数组 [] type[op2] 访问op1数组的索引为op2的元素 . op1.op2 引用op1对象的成员op2 () op1(params) 方法的调用 (type) (type)op1 将op1强制类型转换为type类型 new new op1 创建对象或数组。op1可以是构造方法的调用,也可以是数组的类型和长度 instanceof op1 instanceof op2 如果op1是op2的实例,则返回true -
运算符的优先级
具有两个或两个以上运算符的复合表达式在进行运算时,要按表所示的运算符的优先级顺序从高到低进行,同级的运算符则按从左到右的方向进行.优先级顺序 运算符类别 运算符 1 后缀表达式 [],.,(params)expr++,expr– ,2 一元表达式 ++expr,–expr,+expr,-expr,~,! 3 创建或强制类型转换 new(type)expr 4 乘,除,求余 *,/,% 5 加,减 +,- 6 移位 <<,>>,>>> 7 关系运算 <,>,<=,>=,instanceof 8 相等性判定 ==,!,= 9 按位与 & 10 按位异或 ^ 11 按位或 | 12 逻辑与 && 13 逻辑或 || 14 条件运算 ?: 15 赋值 =,+=,-=,*=,/=,%=,&=,^=,|=,<<=,>>=,>>>= -
Java强制类型转换
造型(casting)的含义是把一种类型的值赋给另外一种类型的变量。如果这两种类型是兼容的,则是低优先级类型的值赋给高优先级类型的变量,例如一个int型值可以赋值给-个long型的变量,则Java自动执行转换。如果将高优先级类型的值赋给低优先级的变量例如将一个 long 型值赋给一个int型变量,则可能造成信息的丢失。这时,Java不能执行自动转换,编译器需要程序员通过强制类型转换方式确定这种转换。例如:long bigValue = 99L; int squashed =(int)bigvalue; /**Java通过强制类型转换将一表达式类型强制为某一指定类型,其一般形式为: (type) expression */
==注意:==基本类型和数组或对象等引用型变量之间不能相互转换。
3.语句
Java语言中语句以“;”为终结符,一条语句构成了一个执行单元。Java中有如下3类语句。
-
表达式语句
下列表达式以语句分隔符“;”终结,则构成了语句,称为表达式语句。- 赋值表达式
- 增量表达式(使用++或–)
- 方法调用表达式
- 对象创建表达式
aValue = 8933.234; //赋值语句 aValue ++ ; //增量语句 System.out.println(aValue); //方法调用语句 Integer integerObject = new Integer(4); //对象创建语句
-
声明语句
声明变量和方法:double aValue = 8933.234; //声明语句
-
程序流控制语句
程序流控制语句控制程序中语句的执行顺序。例如,for循环和if语句都是程序流控制语句
语句块由”{}”括起来的0个或多个语句组成,可以出现在任何单个语句可以出现的位置。if (Character, isUpperCase(aChar)){ System.out.println("The character " + aChar + " is upper case."); }else { System.out.println("The character " + aChar + " is lower case." ); }
在程序流控制语句中,即使只有一条语句也最好使用语句块,能够增强程序可读性并且在以后对代码进行增删时不易发生语法错误。