Java基础语法(四)

运算符
1、运算符概述

算数运算符+ , - , * , / ,% , ++ , --
关系运算符>,<,>=,<=,==,!=
逻辑运算符!,&&,||
位运算符>>,<<,>>>,&,|,^,~
赋值运算符=,及其扩展运算符如:+=,-=,*=,/=
条件运算符?:
对象运算符.
下标运算符[]
实例运算符instanceof
内存分配运算符new
强制类型转换运算符(类型)
方法调用运算符()
2、算数运算符
算术运算符操作范例结果
+正号+33
-负号b=-4;-b-4
+5+510
-3-21
*4*3 12
/5/51
%取模10%91
++自增(前)a=2;b=++a a=3,b=3
++自增(后)a=2;b=a++ a=3,b=2
--自减(前)a=2;b=--a a=1,b=1
--自减(后)a=2;b=a-- a=1,b=2
+字符串相加“Hello”+“World” “HelloWorld“

正负号(+,-)
int i = -1;
int j = 2;
/和%
/表示除法,如果两个数是整数,则值是商;如果有一个数是浮点数,则是简单意义上的数学除法。例如:
3/2=1
3.0/2=1.5
% 表示除法中的余数。例如:
5/2=2
5%2=1
++和–
++和–用法一样,只是一个是加法,一个是减法。
第一种情况
单独使用i++和++i。在该情况下将++放在操作数(例如i)的前面或者后面效果是一样的

public class Test01 {
	public static void main(String[] args) {
		int i = 5;
		i++;
		System.out.println(i);
	}
}
public class Test02 {
	public static void main(String[] args) {
		int i = 5;
		++i;
		System.out.println(i);
	}	
}

//在Test01()i=6
//在Test02()i=6

第二种情况
i++和++i参与运算。在该情况下:
(1)、将++放在操作数(例如i)的前面,那么i会先自增然后再参与运算
(2)、将++放在操作数(例如i)的后面,那么i会先参与运算然后再自增
++i表示先执行++运算改变变量值,再计算表达式;
i++表示先执行表达式计算,最后计算++改变变量值。

public static void main(String[] args) {
		int a = 4;
		int b = 3;
		int c = (a++) + b;
		System.out.println(c);
		
		int x = 4;
		int y = 3;
		int z = (++x) +y;
		System.out.println(z);
	}

除法运算和取模运算
根据计算的封闭性,除法运算中如果两个操作数都是int数据类型,那么计算结果也一定是int类型的数据。这时就会产生精度的丢失。
实例:

public static void main(String[] args) {
		/** 
		 *整数的除法运算结果也是整数,会丢弃余数
		 */
		int num1 =19;
		int num2 = 9;
		int num3 = num1/num2;
		System.out.println(num3);
//		取模运算(取余数)
		int num4 = num1 % num2;
		System.out.println(num4);
	}

Java中的运算规则
(1)、计算的封闭性(即:同一种数据类型参与运算,计算结果也是相同的数据类型)

int a = 5;
		int b = 2;
		int c = a/b;
		//结果为2
		System.out.println(c);
		double d = a/b;
		//原本结果为int类型的2.
		//但是,将结果赋值给了double类型的变量。所以,int转换为double;故,结果为2.0
	 	System.out.println(d);//结果为2.0

(2)、当byte,char,short类型的变量参与算数运算时,JVM会首先将byte,char,short处理成32位长再进一步操作;也就是说JVM会将byte,char,short变量转换为int类型再继续运算。

public class Test01 {
	public static void main(String[] args) {
		byte b1 = 3;
		byte b2 = 4;
//		Type mismatch: cannot convert from int to byte
//		byte b3 = b1 + b2;
		byte b3 = (byte)(b1 + b2);
		System.out.println("b3 = " + b3);
		int i = b1 + b2;
		System.out.println("i="+i);
	}
	
}


public class Test02 {
	public static void main(String[] args) {
		char ch = 'a';
		int i = 9;
		int result = ch + i;
		//输出结果:106
		System.out.println(result);
		int b = ch;
		//输出结果:97
		System.out.println(b);
	}
}

(3)、两个不同类型的操作数参与运算时,系统会将两者先统一为较大范围者的数据类型再进行计算
例如:

public class Test03 {
	public static void main(String[] args) {
		int i = 5;
		byte b = 7;
		//Type mismatch: cannot convert from int to byte
		//byte result = i + b;
		int result = i + b;
		System.out.println(result);
	}
}

3、赋值运算符

常见赋值运算符格式范例结果
=变量=表达式a=3将3赋值给变量a
+=变量+=表达式a+=3,即a=a+3变量a加3,并赋值给a
-=变量-=表达式a-=3即a=a-3变量a减3,并赋值给a
*=变量*=表达式a*=3即a=a*3 变量a乘3,并赋值给a
/=变量/=表达式a/=3即a=a/3变量a除3,并赋值给a
%=变量%=表达式a%=3,即a=a%3对a取模,并赋值给a

为变量赋值
基本的赋值运算符就是赋值,例如:int i = 1;
拓展赋值运算符如+=,-=,*=,/=,%=等。例如:
int a = 1;
a+=1;这句话相当于a=a+1;
注意:在使用拓展赋值运算符时会自动完成强制类转换

public static void main(String[] args) {
		short s = 9;
		int i = 7;
		//Type mismatch: cannot convert from int to short
		//s = s + i;
		//right code
		s+=1;
		System.out.println(s);
	}

变量赋值示例

public static void main(String[] args) {
		int x = 1;//声明int变量x,赋值1给变量x
		int y = 0;//声明int变量y,赋值0给变量y
		double area;//声明double变量area
		double radius = 1.0;//声明double变量radius,并赋值1.0给变量radius
		x = 5 * (3/2)+3*2;//将=右半部分表达式的计算结果赋值给变量x
		x = y + 1;//将变量y和1的求和的值赋值给变量x
		area = radius * radius * 3.14159;//将计算面积的值赋值给变量area
	}

练习:对两个变量的值进行互换

public static void main(String[] args) {
		int x = 3,y=6;
		int z;
		z = x;
		x = y;
		y = z;
		System.out.println("x=" + x);
		System.out.println("y=" + y);
	}

4、关系运算符

关系运算符缩写操作范例结果
<LT小于4<3false
<=LE小于等于4<=3false
>GT大于4>3true
>=GE大于等于4>=3true
==EQ等于4==3false
!=NE不等于4!=3true

关系运算符对数字型、、布尔型和引用类型有效。这种表达式的计算值是布尔值。
数字型:>,<,>=,<=,= =,!=
例如:3>2的值是true;3<=4的值为true;4= =5的值是false。
布尔型:= =,!=
例如:true= =false的值是false;(2>3)= =(3<4)的值是false。
引用类型:= =,!=
例如:引用类型的= =比较为true时,表示当前比较的两个变量指向同一个对象。
Integer a = new integer(1);
Integer b = new integer(2);
Integer c = a;
这时,a==c的值是true;a= =b的值是false。
5、逻辑运算符

逻辑运算符操作范例结果
&AND()逻辑与false&truefalse
|OR()逻辑或false|truetrue
^XOR()逻辑异或true^truetrue
!NOT()逻辑非!truefalse
&&AND()逻辑与,具有短路效果false&&truefalse
||OR()逻辑或,具有短路效果false||truetrue

(1)&与

true & true = true
false & true = false
true & false = false
false & false = false

总结&符号特点
&:只要两边的boolean表达式结果,有一个false,那么结果就是false
只有两边都为true,结果为true。
(2)|或

true | true = true
false | true = true
true | false = true
false | false = false

总结|:两边只要有一个为真,结果就为真,当两边同为假时结果才为假。
(3)^异或

true ^ true = false
false ^ true = true
true ^ false = true
false ^ false = false

^:两边相同结果是false
两边不同结果是true;
(4)!非

!true =false
!false = true

(5)&&
&运算只有两边全为真的时候,结果才为真。其实,当左边为假的时候就没有必要再进行判断了,于是&&就产生了,这就是短路效果。
int a=4;
a>3&&a<6;
A>3&a<6;
在这种情况下是没有区别的
如果:
a=2
a>3&a<6 2大于3为假,接着运算2小于6为真,总的结果为假
a>3&&a<6;此时的a不大于3的结果为false右边不运算了。即短路。所以&&比&效率稍微高了一点。

public static void main(String[] args) {
		int x = 0;
		int y = 1;
		if(x == 0 && y == 1) {
			System.out.println(x+y);
		}
	}

“&”和“&&”的区别:单与时(&),左边无论真假,右边都进行运算;双与时(&&),如果左边为真,右边参与运算,如果左边为假,那么右边不参与运算。
“|”和“||”的区别:双或时(||),左边为真右边不参与运算。
“^”异或和“|”的不同之处:当左右两边都为true时,结果为false。逻辑运算符用于连接布尔型表达式,在Java中不可以写成3<x<6,应该写成X>3&&x<6.
6、三元运算符
也称三目运算符
语法格式:条件表达式 ? 表达式1 : 表达式2;
如果条件为true,运算后的结果是表达式1;
如果条件为false,运算后的结果是表达式2;
示例:
(1)获取两个数中的大数。
int x = 3,y = 4,z;
z = (x>y)?x:y;//变量存储的就是两个数的大数。

int x = 1;
int y = 2;
int z;
z = x > y ? x :y;
System.out.println(z);

(2)判断一个数是奇数还是偶数。

int x = 5;
System.out.println(x%2==0?"偶数":"奇数");

7、移位操作符
移位计算:>>,<<,>>>
(1)位运算符

运算符运算范例
<<左移3<<2=12-->3*2*2=12
>>右移3>>1=1-->3/2=1
>>>无符号右移3>>>1=1-->3/2=1
&与运算6 & 3 = 2
|或运算6 | 3 = 7
^异或运算6 ^ 3 = 5
~反码~6=-7

(2)位运算符的细节
左移 << 空位补0,被移除的高位丢弃,空缺位补0。
右移 >> 被移除的二进制最高位是0,右移后空缺位补0;最高位是1,空缺位补1。
无符号右移 >>>> 被移位二进制最高位无论是0或者是1,空缺都用0补。
与运算 & 二进制位进行&运算,只有1&1时结果是1,否则是0;
或运算 | 二进制位进行|运算,只有0|0时结果是0,否则是1;
异或运算 ^ 任何相同二进制位进行 ^ 运算,结果是0;1^ 1=0,0^ 0=0。不相同二进制^运算结果是1。1 ^ 0=1,0 ^ 1=1。
8、下标运算符[]
用于访问数组的值,通过下标索引进行访问。例如:
int[] array = new int[5];
array[1] = 2;
System.out.println(array[1]);
9、实例运算符instance of
用于判断对象实例是否由某个类创建,计算结果为布尔值。例如:
String hello = new String(“hello”);
If(hello instanceof String){ //这个表达式的值为true
……
}
10、强制类型转换运算符
用于数据类型的强制转换
(1)、数值间的转型
数值的表示范围是有区别的,从小的范围向大的范围转换是不需要强制转型,会自动转换,但是由大的范围向小的范围转换是需要强制转型,并且通常会损失精度。
int a = 10000;
Byte b = (byte)a; 现在b=1,这就是损失了精度。
(2)、对象间的转型
子类赋值给父类是不需要转型的,但是父类向子类赋值则是需要转型的。
Object类是所有Java的父类,即是根父类。
Object object = new String(“hello”);不需要转型
String string = (String)object; 需要强制转型

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

m0_53941252

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值