2.4 常量与变量
1、变量的概念:
就是将不确定的数据进行存储,也就是需要在内存中开辟一个存储空间。
该区域有自己的名称(变量名)和类型(数据类型)
该区域的数据可以在同一类型范围内不断变化
为什么要定义数据类型?
就好像一套别墅,别墅中有厨房、卫生间、卧室等(数据类型)房间,它们分别用来存放不同的东西,每间房中只能放同类型的工具,不能把卫生间的马桶放厨房或者卧室……
如何开辟存储空间?
就是通过明确数据类型,变量名称,数据来完成。
2、为什么要定义变量:
用来不断的存放同一类型的常量,并可以重复使用
3、使用变量注意:
变量的作用范围(一对{}之间有效)
初始化值
定义变量的格式:
数据类型变量名=初始化值;
注:(1)格式是固定的,记住格式,以不变应万变。(2)与C++通用。
理解:变量就如同数学中的未知数。
2.4 常量与变量
Java语言是强类型语言,对于每一种数据都定义了明确的具体数据类型,在内存中分配了不同大小的内存空间
注意:整数默认:int 小数默认:double
1、整数类型在内存中开辟的空间不同:
byte:占1个八位来表示,即用8个二进制数来表示一个字节。 取值范围:-27——+27-1 (-128——+127)
short:占2个八位,即用16个二进制数来表示。取值范围:-215——+215-1 (-32768——+32767)
int:占4个八位,即32个二进制位来表示。取值范围:-231——+231-1 这个范围生活中的数据基本都能装下。
long:天文数字,超出int型范围是会用。
举例:CPU缓存,按需定义,开辟不同大小的存储空间。
2、单精度和双精度的最大区别在于精确程度不同,因为精确程度不同,那么他们在空间中占的内存也不一样:
float:占了四个八位,即32个二进制位。
double:占了八个八位,即64个二进制位。
3、字符型:
char:占两个八位,即16个二进制位。范围0——6535
4、布尔型:
boolean:只有两个取值true和false。
2.4 常量与变量
自动类型转换(也叫隐式类型转换)
强制类型转换(也叫显式类型转换)
类型转换的原理
什么时候要用强制类型转换?
表达式的数据类型自动提升(由低级向高级提升)
所有的byte型、short型和char的值将被提升到int型。(int型运算还是int型)
如果一个操作数是long型,计算结果就是long型;
如果一个操作数是float型,计算结果就是float型;
如果一个操作数是double型,计算结果就是double型。
分析
System.out.println(‘a’)与System.out.println(‘a’+1) 的区别。
‘a’是char型,在System.out.println(‘a’)中不发生数据类型自动提升,所以输出a;
‘a’+1运算中,1是int型,表达式要进行数据类型自动提升,a在计算机中有自己的ASCII码值,所以可以由char型提升为int型,进行计算;
2.4 常量与变量
自动类型提升
byte b = 3;
int x = 4;
x = x + b;//b会自动提升为int类型进行运算。
强制类型转换
byte b = 3;
b = b + 4;//报错
b = (byte)(b+4);//强制类型转换,强制将b+4的结果转换为byte类型,再赋值给b。
思考:
byte b1=3,b2=4,b;
b=b1+b2;*失败
b=3+4;
哪句是编译失败的呢?为什么呢?
b1b2是变量不是具体数值,3和4是具体数值
b=3+4 ,3和4都是常量,所以java在编译时期会检查该常量的和是否超出byte类型的范围。如果没有可以赋值。
b=b1+b2不可以,是因为b1和b2是变量,因为变量的值会变化,不确定具体的值,所以默认使用int类型进行存储。
2.5 运算符
算术运算符
赋值运算符
比较运算符
逻辑运算符
位运算符
三元运算符
2.5.1 算术运算符
算术运算符的注意问题
如果对负数取模,可以把模数负号忽略不记,如:5%-2=1。但被模数是负数就另当别论,如:-2%5=-2;
规律:左正余正,左负余负(或者:左号同,其余同)
对于除号“/”,它的整数除和小数除是有区别的:整数之间做除法时,只保留整数部分而舍弃小数部分。
例如:int x=3510;x=x/1000*1000; x的结果是? 3000
“+”除字符串相加功能外,还能把非字符串转换成字符串。
字符串数据和任何数据使用“+”都是相连接,最终都会变成字符串。
例如:System.out.println("5+5="+5+5);//打印结果是? 5+5=55
转义字符:
定义:通过反斜线\来转变后面字母或者符号的意义。
\n |
回车换行(回车符) |
Windows系统(dos中直接能识别\n) |
\b |
退格,相当于backspace |
|
\r |
回车换行(回车符) |
Windows系统,linux系统 |
\t |
制表符,相当于tab键 |
|
\” |
输出一个单引号 |
对”进行了转义 |
\’ |
输出一个单引号 |
对’进行了转义 |
\\ |
输出一个\\ |
对后面那个\进行了转义 |
|
|
|
注意: 1、 不是所有的字母都能被转义为具有特殊含义的操作,能被转义的只有几个,很多事无效转义的,如:\h等; 2、 println后面的ln:本句结束回车换行 |
2.5.2 赋值运算符
符号:
= |
把右边的值赋给左边 |
+= |
把左右两边的和再赋给左边 |
-= |
把左右两边的差再赋给左边 |
*= |
把左右两边的积再赋给左边 |
/= |
把左右两边的商再赋给左边 |
%= |
把左右两边的余数再赋给左边 |
注意: 1、 这些运算符都是一次运算符,并不是分两步进行运算的。 2、 一次运算电脑可以完成自动类型提升转换,两次运算时不能完成自动类型提升转换,类型超出存储时,会出现精度错误。 |
示例:
int a,b,c; a=b=c =3;
int a = 3; a+=5;等同运算a=a+5;
思考:
short s = 3;
s=s+2;
s+=2;
有什么区别?
s=s+2//编译失败,因为s会被提升为int类型,运算后的结果还是int类型。无法赋值给short类型。
s+=2//编译通过,因为+=运算符在给s赋值时,自动完成了强转操作。
2.5.3 比较运算符
注意: 1、比较运算符的结果都是boolean型,也就是要么是true,要么是false; 2、比较运算符“==”不能误写成“=”; | |
|
|
|
|
2.5.4 逻辑运算符
逻辑运算就是一种关系,用于连接boolean类型的表达式 | |
| |
逻辑运算符用于连接布尔型表达式,在Java中不可以写成3<x<6,应该写成x>3 & x<6 。 | |
“&”和“&&”的区别: 单&时,左边无论真假,右边都进行运算; 双&时,如果左边为真,右边参与运算,如果左边为假,那么右边不参与运算。 “|”和“||”的区别同理,双或时,左边为真,右边不参与运算。 | |
异或( ^ )与或( | )的不同之处是:当左右都为true时,结果为false。 | |
|
|
2.5.5 位运算符
位运算符 | ||||||
运算符 |
运算 |
范例 |
细节 | |||
<< |
左移 |
3 << 2 = 12 --> 3*2*2=12 |
空位补0,被移除的高位丢弃,空缺位补0。 | |||
>> |
右移 |
3 >> 1 = 1 --> 3/2=1 |
被移位的二进制最高位是0(正数的二进制),右移后,空缺位补0; 最高位是1(负数的二进制),空缺位补1。 注意:右移对于获取其他整数的表现形式很方便。 | |||
>>> |
无符号右移 |
3 >>> 1 = 1 --> 3/2=1 |
被移位二进制最高位无论是0或者是1,空缺位都用0补。 | |||
& |
与运算 |
6 & 3 = 2 |
二进制位进行&运算,只有1&1时结果是1,否则是0; | |||
| |
或运算 |
6 | 3 = 7 |
二进制位进行| 运算,只有0 | 0时结果是0,否则是1; | |||
|
技巧:二进制1就是true,0就是false。 | |||||
^ |
异或运算 |
6 ^ 3 = 5 |
相同二进制位进行^ 运算,结果是0;1^1=0 , 0^0=0 不相同二进制位^ 运算结果是1。1^0=1 , 0^1=1 注意规律:一个数异或一个数两次,结果还是这个数。 | |||
~ |
反码 |
~6 = -7 |
反码就是取反,注意正数取反后,再由二进制向十进制转化比较麻烦,简便算法是求这个二进制十进制的相反数; | |||
注意: 1、<<:相当于乘与2的倍数 2、>>:相当于除以2的倍数 总结:移n位,就是乘以或者除以2的n次幂。 | ||||||
| ||||||
求一个数的相反数计算过程 | ||||||
求一个正数的相反数: (1) 将正数转化成二进制数; (1) 取反; (2) 加二进制1; (4) 将二进制转化成十进制; |
反过来求一个负数的相反数: (1) 将负数转换成二进制; (1) 减二进制1; (2) 取反; (4) 将二进制转换成十进制; | |||||
|
|
|
|