这一节我们来学习java语言中的运算符。
Java语言支持如下运算符:
算术运算符:+,-,*,/,%,++,--
关系运算符:>,<,>=,<=,==,!=
逻辑运算符:!,&,|,^,&&,||
位运算符:&,|,^,~,>>,<<,>>>
赋值运算符:=
扩展赋值运算符:+=,-=,*=,/=
字符串连接运算符:+
我们直接看例子吧:
先看一下算术运算符。
~~~
class OperateDemo
{
public static void main(String[] args)
{
//算术运算符 + - * / %(取余,模运算) +(连接符)
// ++ (自增:就是在原有基础上加一,再赋给原有数据) --
int x = 6370;
x = x / 1000 * 1000;//结果是6000,也就是说java是强制运算语言
System.out.println(x);
//取模运算主要用于开关算法的定义
System.out.println(3 + 2);//加法
System.out.println("3" + 2);//String连接符
System.out.println("5 + 5 =" + 5 + 5);//5 + 5 =55
System.out.println("5 + 5 =" + (5 + 5));//5 + 5 =10
int a = 4,b = 5;
System.out.println("a:" + a + ",b:" + b);//a:4,b:5
int a1 = 3,b1;
//a1 ++;//相当于a1=a1+1;
//b1 = a1++;//a1=4,b1=3 这个过程是先把a的值留存在一个临时空间内,然后在原空间进行++运算并将结果存进去,然后把临时空间的值赋给b
b1 = ++a1;//a1=4,b1=4 这个过程中先进行++运算,并把结果赋给a,再把a的值赋给b
System.out.println("a1="+a1+",b1="+b1);//a1=4,b1=4
int i = 3;//更加清晰的反映了这个过程
i = i++;
System.out.println("i="+i);//i=3
int j = 3;
j = ++j;
System.out.println("j="+j);//j=4
}
}
~~~
结果:
![](https://box.kancloud.cn/2016-05-18_573c417080c1d.jpg)
再看符值运算符
~~~
class OperateDemo2
{
public static void main(String[] args)
{
//赋值运算符 = += -= *= /= %=
int a,b,c;
a = b = c = 4;
int a1 = 4;
a1 += 2;//a1 = a1 + 2;
short s = 3;//赋值,s是两个字节,3是四个字节,自行检测
//s += 4;//这个在底层做了自动转换
//s = s + 4;//这个报错,缺失精度,不能自动转换,把int类型存入short中
s = (short)(s + 4);//等价于s += 4;
System.out.println("s="+s);
}
}
~~~
结果:
![](https://box.kancloud.cn/2016-05-18_573c417097151.jpg)
比较运算符
~~~
class OperateDemo3
{
public static void main(String[] args)
{
//比较运算符 > < == >= <= != instanceof(是不是实例)
//比较运算符,运算要么为真,要么为假,true or false
System.out.println(3>2);//true
/*逻辑去处符 &(与) |(或) ^(异或) !(非) &&(双与) ||(双或)
x > 2 && x < 5 等价于 2<x<5
逻辑运算符是用于连接两个boolean类型的表达式
&:符号的去处特点:
true & true = true;
true & false = false;
false & false = false;
false & true = false;
&:运算规律:
运算的两边只要有一个是false,结果一定为false;只有两边同为true,结果才为true
|:运算特点:
true | true = true;
true | false = true;
false | false = false;
false | true = true;
|:运算规律:
去处两过只要有一个是true,结果为true;只有两边都为false,结果才为false
^:异或:和或有点不一样.
^:运算特点:
true | true = false;
true | false = true;
false | false = false;
false | true = true;
^:运算规律:
两边的结果相同,结果为false;两边的结果不同,结果为true.
!:运算特点:!true = false; !false = true;
&&和||可以短路运算
&&:当左边为false时,右边不再参与运算
||:当左边为true时,右边不再参与运算
*/
int x = 3;
System.out.println(x>2&x<5);
System.out.println(x<2|x>5);
}
}
~~~
结果:
![](https://box.kancloud.cn/2016-05-18_573c4170ace00.jpg)
位运算符
~~~
class OperateDemo4
{
public static void main(String[] args)
{
/*
位运算符:二进制
&(与) |(或) ^(异或) ~(去反) <<(左移) >>(右移) >>>(无符号右移)
6 & 3 = 2
0000-0000 0000-0000 0000-0000 0000-0110 6
&0000-0000 0000-0000 0000-0000 0000-0011 3
-----------------------------------------
0000-0000 0000-0000 0000-0000 0000-0010 2
6 | 3 = 7
0000-0000 0000-0000 0000-0000 0000-0110 6
|0000-0000 0000-0000 0000-0000 0000-0011 3
-----------------------------------------
0000-0000 0000-0000 0000-0000 0000-0111 7
6 ^ 3 = 5
0000-0000 0000-0000 0000-0000 0000-0110 6
^0000-0000 0000-0000 0000-0000 0000-0011 3
-----------------------------------------
0000-0000 0000-0000 0000-0000 0000-0101 5
6 ^ 3 ^ 3 = 6:一个数异或同一个数两次,结果还是这个数.
3 << 2 = 12 3 << 3 = 24 //向左移几位,左边的几位就被舍取,右边加几个0
0000000000000000000000000000011 3
0000000000000000000000000001100 12
@左移几位,其实就是该数乘以2的几次方,可以完成2的次幂运算
6 >> 1 =
对于高位出现的高位,原来最高位为0,就用0补位,原来最高位为1,就用1补位
右移几位其实就是该数据除以2的几次方
>>>:无符号右移:数据进行右移时,高位出现的空位,无论原高位是什么,空位都用0补.
*/
System.out.println(6 & 3);//6在计算中:0000-0000 0000-0000 0000-0000 0000-0110
System.out.println(6 | 3);
System.out.println(6 ^ 3);
System.out.println(~6);//-7
System.out.println(3 << 2);//左移两位,相当于乘以2的2次方
}
}
~~~
结果:
![](https://box.kancloud.cn/2016-05-18_573c4170be7b4.jpg)
三元运算符
~~~
class OperateDemo5
{
public static void main(String[] args)
{
/*
三元运算符:
格式:(条件表达式)?表达式1:表达式2
如果条件为true,运算表达式1
如果条件为false,去处表达式2
*/
int x = 3,y;
y = (x > 1) ? 100 : 200;
System.out.println("y="+y);
//三元运算符的一个小应用
//获取两个整数中的较大的整数
int x1 = 3;
int y1 = 4;
int max = (x1>y1)?x1:y1;
System.out.println(max);
//获取三个整数中的最大的整数
int o,p,q;
o = 5;
p = 6;
q = 4;
int temp = (o>p)?o:p;
int max1 = (temp>q)?temp:q;
}
}
~~~
结果:
![](https://box.kancloud.cn/2016-05-18_573c4170cfb37.jpg)
最后看一个简单的测试就过吧
~~~
class OperateTest
{
public static void main(String[] args)
{
//最有效率的方式算出2乘以8等于几?
System.out.println(2 << 3);
System.out.println(8 << 1);
//对两个整数变量直接互换(不需要第三方变量)
int a = 3,b = 5;
/*
阅读性好,开发时用
int c;
c = a;
a = b;
b = c;
*/
/*
这种方式一般不要用,如果两个整数的数值过大,会超出int范围,会强制转换,数据会变化.
a = a + b;
b = a - b;
a = a - b;
*/
/*
面试时用,可读性差
a = a ^ b;//a = 3 ^ 5;
b = a ^ b;//(3 ^ 5) ^ 5;
a = a ^ b;//(3 ^ 5) ^ 3;
*/
System.out.println("a="+a+",b="+b);
}
}
~~~
结果:
![](https://box.kancloud.cn/2016-05-18_573c4170e0aaa.jpg)
这一节就到这里吧,下节再说。
- 前言
- 1.1 基本常识
- 1.2 Java语言概述
- 1.3 Java语言的环境搭建
- 1.4 Java程序开发之初体验--Hello World
- 2.1 关键字
- 2.2 标识符
- 2.3 注释
- 2.4 常量
- 2.5 进制扫盲
- 2.6 变量和数据类型(1)
- 2.7 变量和数据类型(2)
- 2.8 运算符
- 3.1 if语句
- 3.2 switch语句
- 3.3 while和do-while语句
- 3.4 for语句
- 3.5 for循环的嵌套
- 3.6 break语句与continue语句
- 4.1 函数的定义
- 4.2 定义函数的两个明确
- 4.3 函数的内存加载过程
- 4.4 函数的重载
- 5.1 数组的定义
- 5.2 数组的内存分配及特点
- 5.3 数组操作中常见问题
- 5.4 数组常用操作(1)
- 5.5 数组常用操作(2)
- 5.6 二维数组
- 6.1 面向对象的概述
- 6.2 类与对象的关系
- 6.3 对象的内存体现
- 6.4 成员变量与局部变量
- 6.5 类类型参数与匿名对象
- 6.6 基本数据类型参数与引用数据类型参数的传递过程
- 6.7 封装
- 7.1 构造函数概述与默认构造函数
- 7.2 构造函数与一般函数的区别
- 7.3 构造函数的重载
- 7.4 构造函数的内存加载
- 7.5 构造函数需要注意的几个细节
- 7.6 this关键字的原理
- 7.7 this关键字的细节与应用
- 8.1 static关键字之特点
- 8.2 成员变量与静态变量的区别
- 8.3 static关键字使用的注意细节
- 8.4 main函数的解析与细节
- 8.5 static关键字的使用场景
- 8.6 静态的内存加载
- 8.7 静态代码块
- 8.8 构造代码块
- 9.1 继承
- 9.2 单继承与多重继承
- 9.3 子父类中成员变量特征体现