表达式
表达式由操作数和运算符组成,对操作数进行运算符指定的操作,并得出运算结果。
Java运算符按功能可分为:算术运算符、关系运算符、逻辑运算符、位运算符、赋值运算符和条件运算符,除此之外,还有几个特殊用途的运算符,如数组下标运算符等。操作数可以是变量、常量或方法调用等。
操作数——常量
常量操作数很简单,只有简单数据类型和String类型才有相应的常量形式。
例如:
常量 | 含义 |
23.59 | double型常量 |
-1247.1f | float型常量 |
true | boolean型常量 |
“This is a String” | String型常量 |
‘a’ | char型常量 |
- 变量的声明及初始化
变量是存储数据的基本单元,它可以用作表达式中的操作数。变量在使用之前要先声明。变量声明的基本格式为:
类型 变量名1 [=初值1] [,变量名2 [=初值2]]....;
其中,类型是变量所属的类型,既可以是简单数据类型,如int和float等,又可以是类类型。有时也把类类型的变量称为引用。方括号中的初值是可选的。如果没有,则表明仅是声明了一个变量,否则是在声明变量的同时,给变量赋了初值,称为对变量进行了初始化。声明变量的地方有两处,一处是在方法内,另一处是在类定义内。方法内定义的变量称为自动变量,也称为局部变量、临时变量或栈变量。这里所说的方法,包括程序员定义的各个方法。类中定义的变量就是类的成员变量。 -
默认初始值
- 简单数据类型的变量在说明之后,系统自动在内存分配相应的存储空间。说明引用后,系统只分配引用空间,程序员要调用new来创建对象实例,然后才分配相应的存储空间。Java程序中不允许将未经初始化的变量用作操作数。对于自动变量,如果变量声明时没有进行初始化,则在变量使用之前必须使用赋值语句进行赋值。如果编译器发现某个变量没有初始化,编译时会出现错误。创建一个对象引用后,需要使用new运算符为其分配存储空间。对于其中的成员变量,程序员可以显式进行初始化,也可以由系统自动进行初始化。
类型 | 初始值 | 类型 | 初始值 |
byte | (byte)0 | double | 0.0 |
short | (short)0 | char | ‘\u0000’(null) |
int | 0 | boolean | false |
long | 0L | 所有引用类型 | null |
float | 0.0f |
|
|
- 初始值错误示例
因为b没有初始化,没有赋初始值,所以程序报错。
- 变量定义错误示例
因为name在主方法中已经定义,方法中定义的变量作用于整个方法,同时覆盖了同名的类变量也叫成员变量。
-
数学函数
进行科学计算时,可能会经常用到数学函数,数学函数往往得到一个数值结果,这也属于操作数。Java语言提供了数学函数类Math,其中包含了常用的数学函数。
Math.sin(0) | 正弦函数,返回0.0,这是double类型的值 |
Math.cos(0) | 余弦函数,返回1.0 |
Math.round(6.6) | 四舍五入取整,返回7 |
Math.sqrt(144) | 开平方函数,返回12.0 |
Math.pow(5,2) | 计算乘方,返回25.0 |
Math.max(560,289) | 求最大值函数,返回560 |
Math.min(560,289) | 求最小值函数,返回289 |
Math.random() | 返回0.0~1.0之间双精度的一个随机数值 |
-
运算符
算术 | 算术运算符包括通常的加(+)、减(-)、乘(*)、除(/)、取模(%),(++),(--)加1减1运算符完成整型和浮点型数据的算术运算。许多语言中的取模运算只能用于整型数,Java对此有所扩展,它允许对浮点数进行取模操作。例如,3%2的结果是1,15.2%5的结果是0.2。取模操作还可以用于负数,结果的符号与第一个操作数的符号相同,例如,5%-3的结果是2,-5%-3的结果是-2,-5%3的结果是-2。 |
关系 | 关系运算符用来比较两个值,包括大于(>)、大于等于(>=)、小于(<)、小于等于(<=)、等于(==)和不等于(!=)6种。关系运算符都是二元运算符,也就是每个运算符都带有两个操作数。运算的结果是一个逻辑值。Java允许“==”和“!=”两种运算用于任何数据类型。 |
-
自增运算符
int a = 5;
int j = a++;
int k = ++a;
System.out.println(j); //j的值为5
System.out.println(k);//k的值为7
a++ 先赋值再++
++a 先++再赋值
-
逻辑运算符
- &&:true&&true表达式全部为真时执行程序
||:true||false表示有一个为真时执行程序
!:非
逻辑 | 逻辑运算符包括逻辑与(&&)、逻辑或(||)和逻辑非(!)。前两个是二元运算符,后一个是一元运算符。Java对逻辑与和逻辑或提供“短路”操作功能。进行运算时,先计算运算符左侧表达式的值,如果使用该值能得到整个表达式的值,则跳过运算符右侧表达式的计算,否则计算运算符右侧表达式,并得到整个表达式的值。 |
- 短路
*因为a>b为false,所以发生短路,跳过第二个表达式
- 运算符
-
-
位运算符
位运算符 | 位运算符用来对二进制位进行操作,包括按位取反(~)、按位与(&)、按位或(|)、异或(^)、右移(>>)、左移(<<)及无符号右移(>>>)。位运算符只能对整型和字符型数据进行操作。 |
- & :如果两个相应的二进制形式的对应的位数都为1,则结果为1,记为同1为1,否则为0,转换为2进制数计算
00000100 4
00000101 5
00000100 4
除2没余数记0有余数记1,最后除尽的一位记1
- & :如果两个数为负数,先求补码再进行运算
补码:反码+1等补码
反码:除符号位,按位取反
- | :有1为1,否则为0
- | :有1为1,否则为0,计算负数时,结果符号为1需要进行逆操作转为源码输出结果
比如:-4|5
- ^:相同为0,不同为1
-
移位运算符
- 左移:右边空出的位用0填补高位左移溢出则舍弃该高位。计算机中常用补码表示数据,注,用补码计算
00001000 8
00100000 32整体左移后
10001000 -8
11110111 -8的反码
11111000 -8的补码
11100000 整体左移后
11011111 逆运算,-1得反码
10100000 按位取反最后结果-32
移位运算符 | 右移(>>)、左移(<<)及无符号右移(>>>)。 |
- 右移:左边空出的位用0或者1填补。正数用0填补,负数用1填补。注:不同的环境填补方式可能不同;低位右移溢出则舍弃该位。
00001000 8
00000010 2整体右移后
10001000 -8
11110111 -8的反码
11111000 -8的补码
11111110 整体右移后
11111101 逆运算,-1得反码
10000010 按位取反最后结果-2
- 无符号右移:正数与右移规则一样,负数的无符号右移,就是相应的补码移位所得,在高位补0即可
10000000000000000000000000001000 -8
11111111111111111111111111110111 -8的反码
11111111111111111111111111111000 -8的补码
00111111111111111111111111111110 无符号移两位,不取原码,直接输出
- int x=3;
x=x*3;
等价于
int x=3;
x*=3;
运算符的优先顺序结合实例在以后的程序讲
其他运算符 | Java中的运算符还包括扩展赋值运算符(+=、-=、*=、/=、%=、&=、|=、^=、>>=、<<=和>>>=)、条件运算符(?:)、点运算符(.)、实例运算符(instanceof)、new运算符及数组下标运算符([])等。扩展赋值运算符是在赋值号(=)前再加上其他运算符,是对表达式的一种简写形式,。 |
-
类型转换
- Java是一种强类型语言,不支持变量类型间的自动任意转换,有时必须显式地进行变量类型的转换。每个数据都与特定的类型相关,允许整型、浮点型、字符型数据进行混合运算。运算时,不同类型的数据先转换为同一种类型,然后再进行运算。转换的一般原则是位数少的类型转换为位数多的类型,这称作自动类型转换这样做的目的是保证转换时不丢失有用信息。
操作数之一类型 | 操作数之二类型 | 转换后的类型 |
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 |
- 类型转换示例
*两个操作数,级别低的会自动类型转换成级别高的,这是自动类型转换
当级别(精度)变低时,则需要强转,这是强制类型转换