Java里面会用到很多运算符,例如:+、-、*、/等。
/运算符用于计算除法。整型直接相除会得到一个整型,余数直接舍去了:15/2 = 7;如果想要得到余数,用%运算符15%2=1;如果/两边至少有一个是浮点型,那么计算结果也是浮点型,就会有小数啦:15.0/2 = 7.5。
整型除以0会爆出一个异常;浮点数除以0会得到NaN或者无穷大。
注意:在使用staticfp关键字声明的方法中,该方法内部的运算会采用严格浮点进行计算,就是比较精确而已。如果声明了一个类,则这个类内部所有的方法计算都采用严格浮点进行计算。
public static staticfp void main(String[] args)
不知道为什么不介绍=这个操作符。=学名叫赋值,实际上是,左边的变量指向右边的运算结果。
1 数学函数和数学常量
Math类包含大量的数学函数方法,你肯定会用到的。例如:
double x = 4;
double y = Math.sqrt(x);//开方计算
System.out.println(t);//会输出 2.0
//下面方法只加了括号,具体参数没有写,还是比较多的
Math.sqrt() //计算开方
Math.pow() //指数运算
Math.floorMod() //取余数,适用于24小时、月份这种除法,用负的被除数也可以算出正确的余数,而不是负余数
Math.sin()//正弦函数
Math.cos()//余弦函数
Math.tan()//正切函数
Math.atan()//反正切函数
Math.atan2()//反正切函数,输入坐标计算
Math.exp()//指数函数,e为底
Math.log()//对数函数,e为底
Math.log10()//对数函数,10为底
Math.random()//随机函数,返回一个[0,1)之间的随机浮点数
Math.PI//常量,圆周率
Math.E//常量,自然常数e
注意:Math类属于系统提供的类,但是需要引入import才能使用,所以在类名前一行应该加入下面引入语法才能使用Math类。
import java.lang.Math;//这是一种
import java.long.Math.*;//这是另外一种,属于静态导入,在用的时候,就可以省略Math.
注意:Math类使用的是尽可能快的运算方法,也就可能在其他平台系统上会得到不一样的速度和精度。如果你想让所有平台都得到一样的运算结果(包括精度)而不在意速度问题的话,应该采用StrictMath类进行运算。
2 数值类型直接进行转换
不可避免的,我们需要在不同数值类型间进行转换。下图显示的是直接转换的情况:
图中,实线表明这种类型之间的转换,不会损失精度,虚线表示会损失精度。
例如:
int n = 123456789;
float f = n;//f = 1.23456792E8
注意:Java会默认对计算结果使用较高精度的那个结果
- 有double类型会得到一个double结果。
- 没有double类型,但是有float类型会得到float结果。
- 没有浮点型,有long类型则会得到一个long结果。
- 就照上面情况类似啦,其实强类型语言的好处就是,上面这类的运算结果IDE一般会给你提醒,如果你用错的话。
3 强制类型转换
如果你明确的可以接受精度损失,就必须进行强制类型转换,来告诉Java你就是要转换类型。
比如:如果你想得到1~12之间的随机整数,但是Math.random()函数会得到一个随机的[0,1)之间的浮点数,那么只好这样进行运算了:
double r1 = Math.random() * (13 - 1);//得到[0,12)之间的随机浮点数
double r2 = r1 + 1;//加上基数1,变成[1,13)之间的随机浮点数
int randomNumber = (int)r2;//截断小数部分,只去整数部分化作整型,则是[1,12]之间的随机整数了
在上面的例子中,把一个double类型的变量r2强制转换成为了int类型,失去了原本的小数部分,语法是前面加上(),括号里面写上你要转换的类型。
注意:如果你的强制转换超过了目标类型的范围,就会出错了。各种错误啊。
4 合并的运算符
x = x + 4;//一般的写法
x += 4;//简化写法,其实效果都是一样的
//类似的还有
x -= 4;
x *= 4;
x /= 4;
x %= 4;
注意:使用合并的运算符,得关注两边的类型问题,用不好可能出错哈。
5 自增和自减运算符(针对变量的哦)
自增运算符
x = x + 1;//一般写法
x++;//简化写法1
++x;//简化写法2
自减运算符
x = x - 1;//一般写法
x--;//简化写法1
--x;//简化写法1
注意:自增和自减运算符本身也可加入到别的计算式中,例如:
y = x++ * 5;
等同于
int z = x;
x = x + 1;
y = z * 5;
而
y = ++x * 5;
等同于
x = x + 1;
y = x * 5;
规则是:++x会把加1后的结果代入计算,x++也会自增1,不过代入计算的是之前的x。自减运算符类似。
6 关系运算符和逻辑运算符
| 关系运算符 | 作用 | 举例 | 结果 |
|---|---|---|---|
| ‘==’ | 检测两边是否相等 | 3 == 7 | false |
| ‘!=’ | 检测两边是否不等 | 4 != 7 | true |
| ‘<’ | 检测左边是否小于右边 | 5 < 7 | true |
| ‘>’ | 检测左边是否大于右边 | 6 > 7 | false |
| ‘<=’ | 检测左边是否小于或等于右边 | 7 <= 7 | true |
| ‘>=’ | 检测左边是否大于或等于右边 | 8 >= 7 | true |
| 逻辑运算符 | 作用 | 举例 | 结果 |
|---|---|---|---|
| ‘&&’ | 两边都为true,才为true,如果左边已经是false了,则不计算右边 | false && true | false |
| ‘&’ | 两边都为true,才为true,两边都计算 | 3 > 4 & 3 < 4 | false |
| ‘丨丨’ | 两边都为false,才为false,如果左边已经是true了,则不计算右边 | false 丨丨 true | true |
| ‘丨’ | 两边都为false,才为false,两边都计算 | 3 > 4 丨 3 < 4 | true |
| ‘!’ | 取反 | !false | true |
注意:上述符号应该都是英文状态下的输入,上面表格里面不全是哦,因为这个文档的问题,我不能输入正确的,天坑。
三元运算符 ?:
//问号前面是个逻辑表达式,如果是true,则返回冒号前面的式子,否则返回冒号后面的式子
int a = x < y ? x : y;
7 位运算符
| 位运算符 | 作用 | 举例 | 结果 |
|---|---|---|---|
| ‘&’ | 二进制运算,每一位对应进行与运算 | 1100 & 0101 | 0100 |
| ‘丨’ | 二进制运算,每一位对应进行或运算 | 1100 丨 0101 | 1101 |
| ‘^’ | 二进制运算,每一位对应进行异或运算 | 1100 ^ 0101 | 1010 |
| ‘~’ | 二进制运算,对每一位应进行取反运算 | ~0101 | 1010 |
| ‘>>’ | 二进制运算,右移运算,符号位填充高位 | 0b111100 >> 2 | 0b1111 |
| ‘>>>’ | 二进制运算,右移运算,0填充高位 | 0b111100 >>> 2 | 0b000001111 |
| ‘<<’ | 二进制运算,左移运算 | 0b10010001 << 2 | 0b01000100 |
8 小括号和运算符优先级
| 运算符 | 结合性 |
|---|---|
| [] . () | 从左至右 |
| ! ~ ++ – +(一元运算) -(一元运算) () (强制类型转换) new | 从右至左 |
| ‘*’(打不出来只好加单引号了) / % | 从左至右 |
| ‘+’(打不出来只好加单引号了) - | 从左至右 |
| << >> >>> | 从左至右 |
| < <= > >= instanceof | 从左至右 |
| == != | 从左至右 |
| & | 从左至右 |
| ^ | 从左至右 |
| 丨 | 从左至右 |
| && | 从左至右 |
| 丨丨 | 从左至右 |
| ?: | 从右至左 |
| = += -= *= %= &= ‘丨=’ ^= <<= >>= >>>= | 从右至左 |
在实际应用过程中,只要你想让某个运算先算,直接加上小括号就是了,不用记这些运算优先级的。
9 枚举类型
Java里面有一个和class同等级的叫做枚举enum。
也可以说枚举是特别的类。
enum Size
{
SMALL,
MEDIUM,
LARGE,
EXTRA_LARGE
}
这样使用:
Size s = Size.MEDIUM;
为什么要用枚举?因为某些情况下,我们定义变量会变的,万一用错了,很麻烦的,所以像这类表示有限个状态的情况下,可以定义枚举类区分状态。
550

被折叠的 条评论
为什么被折叠?



