@TOC
常量
概念:常量就是程序运行过程中其值不发生变化的量,所有基本类型的值,固定不变,都是常量,String类型的量比较特殊,可以认为是常量
常量的分类
- 字面值常量
- 自定义常量
- 自己创建的空间 存储一个值 让它固定,使其不能发生变化 例如 final int i = 1;
字面值常量的分类
- 整数常量 例如:1,78,5
- 小数常量 例如:3.24 5.67
- 字符常量 例如:‘c’ ‘A’ ‘1’ ‘3’ ‘我’ (PS:只能是单个字母,数字,或者汉字)
- 字符串常量 例如:“Hello World”
- 布尔常量 只有true 和 false
- 空常量 null
Java对整数常量提供了4中表现形式
(1)二进制: 由0,1组成 以“0b”开头
(2)八进制: 由0—7组成 以“0”开头
(3)十进制: 由0—9组成,不加任何修饰,默认是十进制
(4)十六进制: 由0—9和A—F 组成 以“0X”开头
变量
概念:程序运行过程中其值可以发生变化的量。(其实就是在内存中开辟一块空间)
定义格式:数据类型 变量名 = 变量值;例如:int i = 1;//将1赋值给x
注意:变量在没有赋值的时候,是不能被拿来使用的!!!
数据类型
数据类型的分类
- 基本数据类型
- 引用数据类型
基本数据类型的分类
- .整数型: byte、short 、int 、 long
- .浮点型 : float 、 double
- .字符型 : char
- 布尔型. : true、false
注意事项:
整数的默认数据类型是int,小数的默认数据类型是double;
如果要定义long类型的整数,而这个整数的范围超过了int型(-32768~32767),那么就要在数字末位加L;
例如:long i=432432L;
long a = 1;
如果要定义float类型的小数,那么就要在小数末位加上F;
例如:float i = 3.14F;
运算符
概念:对常量或者变量进行运算的符号。
数据类型的转换
- 整型—>整型 (自动转换)
(1)大数据类型—>小数据类型(自动转换) 例如
byte a = 1;
int b = a;//将byte类型的变量a自动转换成了int类型的变量b,不用添加任何条件
(2)小数据类型—>大数据类型(强制转换) 例如
int a = 1;
byte b = (byte)a;//将int类型的变量a强制转换成byte类型的变量b,需要在前面加上括号,里面写上所需要的数据类型
- 浮点—>浮点
浮点向浮点类型转换,和第一个整数数据类型转换方法一样,参照上一个; - 整型—>浮点
先比较内存空间的大小,再比较精确度,例如
byte a = 1;
float b = a;//将byte类型的变量,转换成float类型的变量,byte是8bit位,而float是32bit位,可以存下, 所以是自动转换
long c = 1;
float d = (float)c;//将long类型的变量转换成float类型变量,因为long是64bit位,而float是32bit位,所以要强制转换
int i = 1;
float k = i;//将int类型的变量转换成float类型的变量,因为int是32bit位,float是32bit位,所以要比较精确度,而float精确度较高,所以是自动转换
- 浮点—>整型
任何浮点类型的变量都需要强制转换成整型变量,而且结果是取整数部分,弃小数部分 例如
float a = 23.7;
float c = 23.1;
int b = a;//则输出b的结果是23
int d = c;//则输出d的结果也是23
- 整型—>字符(利用Unicode编码,必须强制转换)
int x = 97;
char y = (char)x;//输出y==’a’
- 字符—>整型(强制转换)
char i = ‘a’;
int y = (char)i;//输出y==97
运算符的分类
- 算术运算符:+、–、*、/、%、++、- -
(1) "/"这个运算符除下来的结果中取商的整数部分,例如:8/7=1;7/8=0,9/4=2;
注意:要是定义的变量是浮点型,则‘/’的结果小数部分取决于定义的变量有几位小数
float x = 5.0F;
x = x/2;//输出x==2.5
(2)“%”这个运算符除下来的结果中取商的余数部分,例如:8%7=1;7%8=7,9%4=1;
(3) “++”这个运算符的含义是给原来的值自加1,,例如:i = 1;i++;则输出 i = 2;
(4) “-- ”这个运算符的含义是给原来的值自减1,例如:i = 9;i- - ;则输出i = 8;
注意事项:
“++”和“–”放在变量前和放在变量之后的意义是不一样的;
变量前:先运算,再赋值;
变量后:先赋值,再运算;
以下的代码块用来解释说明:
int i = 1;
int ii = 1;
int b = i++;
int b1 = ++ii;
System.out.println(i);//输出结果是2;i自加了一次,所以i+1=2
System.out.println(ii);//输出结果是2;ii自加了一次,所以ii+1=2
System.out.println(b);//输出结果是1;b运算的时候,先将i=1的值赋值给b,再将i自加1
System.out.println(b1);//输出结果是2;b1运算的时候,先让ii=ii+1=2,再将此ii=2的值赋值给b1
-
下面的代码块比较特殊
int a = 1;
a = a++;//输出结果a==1;
int b = 1;
for(int i = 1;i <= 100;i++){
b = b ++;
}//输出结果a仍然是1
- 逻辑运算符
&(并且) , |(或者) , !(非) , ^(异或) , &&(短路与) , ||(短路或)
下面说一下“&&”与“&”的区别
“&&”与“&”的处理结果是一样的;
“&&”具有短路效果,如果左端为false,则不处理右端的运算;如果左端为true,则会处理右端的运算;
int a = 1;
int b = 10;
boolean flag = ((a == 10)&&((b++) > 10));
System.out.println(b);//b=10,说明没有执行b++ >10这个代码块
System.out.println(flag);//flag=false
“&”这个运算符不具有短路效果,无论左端是false还是true,它都会执行右端的代码
int a = 1;
int b = 10;
boolean flag = ((a==10)& (b++)>10);
System.out.println(b);//b = 11,说明此事运行了右端的代码
System.out.println(flag);//flag = false
同理“||”与“|”的区别也是一样的
“^”异或运算符,两个处理结果不同则为true ,相同则为false;
例如:(1)(3>2)^(4>3)
true true
结果为false;
(2)(4>3)^(5<4)
true false
结果为true;
3. 位运算符(直接对二进制的补码进行运算)
&(与),|(或),^(异或) , ~(按位取反) , <<(左移) ,>>(右移) ,>>>(无符号右移)
(1)& 有0则0; 例如:0001&0110=0000
(2)| 有1则1; 例如:0001|0110=0111
(3)^ 相同取0,不同取1 例如:0001^0110=0111
注意:^的特点:一个数据被另一个数据位异或两次,该数本身不变。
例如:5^6^6=5;
6^5^6=5;
(4)~ 按位取反,0则取1,1则取0 例如:~0001=1110
(5)<< 左边的数据乘2的移动次幂 例如 10<<3 =102^3=80;
5<<2 = 52^2=20;
(6)>> 左边的数据除以2的移动次幂 例如 50>>3=50/2^3=6;
4. 三目运算符
int a=(c>d)?c:d;
解释一下上面的式子吧,如果c>d是true,则返回a=c,如果c>d是false,则返回a=d;
5. 比较运算符:== ,!= , < , > , <= , >= , instanceof
注意:“==“与“=”不一样,“==”是比较等号左右两边的值是否相等,而“=”是赋值;
==比较的是地址,equals比较的是内容;
6. 赋值运算符:=、–=、+=、/=、%=、 *=
(1)"="此运算符就是将“=”右边的值赋给“=”左边的值;
(2)“–=”这个运算符举个例子吧 eg:int i = 1;i + = 1;//“i + = 1”等价于“i = i + 1”;则此时的i=2;
(3)"+=、/=、*=、%="以此类推
注意事项:
byte、short类型的变量,参与运算时,Java会默认将这些类型转换为int型,这称之为自动类型提升
以下的代码段进行解释
那么现在说一下i+=1与i = i+1的区别:
刚才看到byte类型的变量,在参与运算时,会自动转换为int型
这时,就会运行成功,这也仅是i+=1与i = i+1的区别
进制
进制是Java对整数常量的一种表现形式
进制的分类: 二进制、八进制、十进制、十六进制
- 二进制:由0和1组成,一般以0b开头;
- 八进制:由0~7组成,一般以0开头;
- 十进制:由0~9组成,一般默认前面什么都不加的数字是十进制;
- 十六进制:由0~9和A~F组成,一般以0X开头
进制的转换
(1)其他进制到十进制的转换规则是:每一组的数据=系数*基数^权;
系数:该位对应的数字;
基数:由几进制转换到十进制,那么基数就是几;
权:由右向左依次从0开始排序所得的数字;
例如:八进制转十进制
0150=1×8^2+5×8^1+0×8^0
=64 + 40+0
=104
二进制转十进制
0b101=1×2^2+0×2^1+1×2^0
=4 + 0 + 1
=5
(2)十进制到其他进制的转换规则是:除基取余,直到商为0,余数翻转
例如:十进制转二进制
10/2=5......0
5/2=2........1
2/2=1........0
1/2=0........1
余数翻转 ,从下往上依次是1010
原码 反码 补码
原码:将一个十进制的整数,转换成二进制的数,一般是8位,最左边的位是符号位,0则是正数,1是负数;
整数的原码,反码,补码都是一样的,比如:
十进制的数字 10的 原码: 00001010
反码:00001010
补码:00001010
负数的反码:符号位不变,其余取反;
补码:在其反码的基础上加1
-10的原码:10001010;
反码:11110101;
补码:11110110;