变量:
1、要明确数据的类型
2、需要给变量起名字
3、这个变量需要有一个值存在,才有意义。初始化值

定义一个变量的语句格式:
数据类型 变量名 = 初始化值
举例:int price = 8;
正确读法:将数值8赋值给int类型的变量price

java中数据分为两大类:
整数类型
byte 1字节 -128 - 127
short 2字节
int(默认整数) 4字节
long(使用时需要数据后面添加L或者l后缀)
8字节

浮点类型
float(是有用是需要数据后面添加F或者f后缀)
4字节
double(默认浮点类型)
8字节

字符类型
char 2字节

布尔类型
boolean 1字节(理解成1字节)
(当数值超过了默认类型可接受的范围,就要使用更大的数据去接受)

使用变量时要注意
1、作用域
变量定义在哪个大括号内,它就在哪个大括号内生效
并且,在同一个大括号内不允许同时定义多个同名的变量
2、初始化值
没有初始化的变量无法直接使用
只需要在使用变量之前给值级就可以,不一定非要在定义的时候给值。
(在定义的时候就给值,防止后期遗忘)

定义变量的格式
1、数据类型 变量名 = 初始化值; (推荐)
2、数据类型 变量名;
变量名 = 初始化值;

3、一行上只建议定义一个变量
可以定义多个,但不推荐

一般来说,正常情况下,我们在做变量运算的时候,参与运算的数据类型与接收结果的数据类型一致
默认转换(自动转换类型)
byte,short,char-int-long-float-double
byte,short,char相互之间不会转换,他们参与运算首先转换为int类型
强制转换(强制类型转换) (可能会损失精度,导致数据不准确)
目标类型 变量名 = (目标类型)(被转换的数据);

(为了避免使用强制类型转换:
最终接收结果的变量类型,定义为参与运算的最大的类型)


(代码格式化的快捷键:ctrl)
面试题:哪句编译失败,为什么
byte b1=3,b2=4,b;
b=b1+b2;
b=3+4;
回答:第二句,因为b是byte类型,而b1+b2默认是int类型,byte范围小于int无法接收

!变量相加,首先会提升数据类型然后再相加,byte-short-char在参与运算的时候首先会提升到int类型,然后再参与运算
常量相加,首先会先相加,得到一个值,然后看看这个值是在接收范围内,如果在则直接赋值;如果不在,则报错

思考题:
byte b = (byte)130; 结果是多少
分析:
首先,我们知道数据在计算机中是以补码的形式参与运算的,所以我们要得到130的补码
而要想知道补码,就必须知道反码和原码。
而又因为原码,反码,补码是针对二进制来计算的,所以我们要求出130的二进制
130的二进制:10000010
又因为整数默认是int类型,130是正数,所以4个字节,它的原码,反码,补码是一样的
130的补码:00000000 00000000 00000000 10000010
然后我们做了强制类型转换操作,实际上做的是截取操作(截取就是直接把超出范围的部分直接截掉)
这个是补码:10000010
因为最高位是1,所以我们要已知补码求原码
符号位 数值位
补码: 1 0000010
反码: 1 0000001
原码: 1 1111110
结果是:-(64+32+16+8+4+2) = -126

思考题1:请问下面代码有没有问题,如果有,怎么改?
double d = 12.345;
float f = d;
回答:有。小数默认是int类型,而float类型范围比double小,此时强制类型转换,会损失精度
思考题2:下面两个代码有什么区别呢?
float f1 = (float)12.345;
float f2 = 12.345f;
回答:1、f1其实是由double类型的数据做强制类型转换得来的,可能会损失精度
2、f2接收的数据实际上本身就是一个float类型的数据,不存在会损失精度的问题


一个字符与数值相加时,会先得到字符对应的ASCII码表的值,再进行运算
ASCII码表只需要记住三个字符对应的数值:'0' = 48 'A' = 65 'a' = 97


+:如果+两边,只要有一边是字符串,那么+做的就是字符的拼接,结果是一个新的字符串
如果+两边都没有字符串,而是字符的相加或者数值的相加,做的是普通的加法运算,得到的是一个数值
(括号可以改变运算顺序)

++/--
结论:
--表示的意思是减一,如果放在变量前面,是先减一,再进行赋值操作;如果放在变量后面,就是先进行赋值操作,再减一。
++表示的意思是加一,如果放在变量前面,是先加一,再进行赋值操作;如果放在变量后面呢,就是先进行赋值操作,再加一。
注意事项:++和--都不嗯呐哪个运用在常量上(常量在程序运行过程中不会发生改变)


赋值运算符 =,+=,-=,*=,/=,%=
a += 2; (a = a + 2)(数值大小理解,但是含义不同)

面试题:a = a+1; a+=1区别
byte a = 1;
a = a+1;(不包含强制类型转换,如果要计算,需要 a = (byte)(a+1))
a+=1;(包含强制类型转换,运算时自动强制类型转换(进行如上操作))


关系运算符 ==,!=,>,<,>=,<=
注意事项:
1、关系型运算符的比较结果是一个boolean类型的值,要么true,要么false
2、不要把==和=搞混淆。==表示相等(关系运算符),=表示赋值运算


逻辑运算符 &,|,^,!,&&,||
特点:逻辑运算符一般用于连接boolean类型的表达式或者值

&:单与,又称作逻辑与,有false则false
|:单或,又称作逻辑或,有true则true
^:亦或,相同为false,不同为true
!:非,将true变成false,将false变成true

逻辑运算符:&&,||
问题1:&&与&的区别;
||与|的区别:
结论:
1、无论单与双与,还是单或双或,从结果上来看是一样的。
2、单个与无论左边是false还是true,右边都会执行
3、双与当左边是false的时候,右边就不会执行,结果为false;当左边是true的时候,右边会执行,结果是有false则false
4、单个或无论左边是false还是true,右边都会执行
5、双或当左边是true的时候,右边就不执行了,结果为true;当左边为false的时候,右边会执行,结果是有true则true

运算:
对常量和变量进行操作的过程称之为运算。
运算符:
对常量和变量进行操作的符号称之为运算符。
操作数:
参与运算的数据称之为操作数。
表达式:
用运算符把常量或者变量连接起来并且符合java规范的式子,称之为表达式。
总结:不同的运算符进行连接体现的是不同类型的表达式。


算数运算符:+,-,*,/,%,++,--
/:算数整除运算,结果取的是整数部分
(如果想保留小数,只需要将其中一个变量变成浮点类型就行,例如 *1.0)
%:算术运算符取余运算

位运算符:
>>,>>>,<<,&,|,^,~
想要进行位运算,必须知道二进制

 

分析:
需要求出3和4的二进制
3的二进制:11
4的二进制:100
因为x和y都是int类型,所以占4个字节,又因为3和4都是正数所以,他们的原码,反码,补码都一样
3的原码,反码和补码:00000000 00000000 00000000 00000011
4的原码,反码和补码:00000000 00000000 00000000 00000100


&位与运算:有0则0
00000000 00000000 00000000 00000011
&
00000000 00000000 00000000 00000100
-------------------------------------
00000000 00000000 00000000 00000000

结果是:0

|位或运算:有1则1
00000000 00000000 00000000 00000011
|
00000000 00000000 00000000 00000100
-----------------------------------
00000000 00000000 00000000 00000111

结果是:7


^位异或运算:相同则0,不同则1
00000000 00000000 00000000 00000011
^
00000000 00000000 00000000 00000100
-----------------------------------
00000000 00000000 00000000 00000111

结果是:7


~位取反运算
00000000 00000000 00000000 00000100
~
------------------------------------
补码: 1 1111111 11111111 11111111 11111011
反码: 1 1111111 11111111 11111111 11111010
原码: 1 0000000 00000000 00000000 00000101

结果是:-5


位运算:>>,>>>,<<
<<左移:左移之后,右边用0补齐,左边多出来的丢弃(不管是1还是0)
实际上是乘上2的次幂
>>右移:右移之后,如果最高位是0,就用0补齐,如果最高位是1,就用1补齐,右边多出来的丢弃
实际上是除以2的次幂
>>>无符号右移:右移之后,无论最高位是0还是1,都用0补齐,右边多出来的丢弃、


分析:要想参与位运算,就必须要先得知道二进制

1、计算出3的二进制:11( 3<<2 )
00000000 00000000 00000000 00000011 3的原码,反码,补码
(00)00000000 00000000 00000000 00001100
结果是:12

2、计算出24的二进制:11000( 24>>2 )
00000000 00000000 00000000 00011000 24的原码,反码,补码
0000000000 00000000 00000000 000110(00)
结果是:6

3、计算出24的二进制:11000( 24>>>2 )
00000000 00000000 00000000 00011000 24的原码,反码,补码
0000000000 00000000 00000000 000110(00)
结果是:6

4、计算出-24的二进制:11000( -24>>2 )
-24的原码:10000000 00000000 00000000 00011000
-24的反码:11111111 11111111 11111111 11100111
-24的补码:11111111 11111111 11111111 11101000

右移2位:
补码:1111111111 11111111 11111111 111010(00)
反码:1111111111 11111111 11111111 111001
原码:1000000000 00000000 00000000 000110
结果是:-6

5、计算出-24的二进制:11000( -24>>>2 )
-24的原码:10000000 00000000 00000000 00011000
-24的反码:11111111 11111111 11111111 11100111
-24的补码:11111111 11111111 11111111 11101000

无符号右移2位:
补码:0011111111 11111111 11111111 111010(00)
结果是:1073741818



main方法的快捷键 :psvm