02.基本语法
1.关键字与标识符
1.关键字
2.标识符的使用
定义:凡是自己可以起名字的地方都叫标识符
涉及到的结构:包名、类名、接口名、变量名、方法名、常量名
2.变量的使用(重点)
1.变量的分类
按数据类型分类
详细说明:
1.整型:byte(1字节=8bit) \ short(2字节) \ int(4字节) \ long(8字节)
? ① byte范围:-128 ~ 127
? ② 声明long型变量,必须以"l"或"L"结尾
? ③ 通常,定义整型变量时,使用int型
? ④ 整型的常量,默认类型是:int型
500MB 1MB = 1024KB 1KB= 1024B B= byte ? bit?
bit: 计算机中的最小存储单位。byte:计算机中基本存储单元。
2.浮点型:float(4字节) \ double(8字节)
? ① 浮点型,表示带小数点的数值
? ② float表示数值的范围比long还大
? ③ 定义float类型变量时,变量要以"f"或"F"结尾
? ④ 通常,定义浮点型变量时,使用double型。
? ⑤ 浮点型的常量,默认类型为:double
浮点型数据计算精度丢失问题
float和double数据类型的地城数据存储结构不一样:
计算机系统采纳了所谓的浮点数表达方式。这种表达方式利用科学计数法来表达实数,即用一个尾数(Mantissa也叫有效数字 ),一个基数(Base),一个指数(Exponent)以及一个表示正负的符号来表达实数。浮点数利用指数达到了浮动小数点的效果,从而可以灵活地表达更大范围的实数。
float:1bit(符号位),8bits(指数位),23bits(尾数位)
double:1bit(符号位),11bits(指数位),52bits(尾数位)Java中double类型的格式基本遵循IEEE 754标准。尽管数学意义上的小数是连续的,但double仅仅能表示其中的一些离散点,把这些离散点组成的集合记为S,S的大小还是有限的。如果要保存的小数P刚好在集合S内,那么double类型就能精确的表示P;否则double类型只能从集合S中找一个与P最近的离散点P'代替P。
对于float和double数据类型精度丢失问题,在‘Effective Java’一书中也提到:float和double只能用来做科学计算或者工程计算(why?),在商业计算中我们要用java.math.BigDecimal。如果我们需要精确计算,非要用String来构建BigDecimal不可!
剖析float型的内存存储和精度丢失问题:https://www.iteye.com/blog/hxraid-504293
3.字符型:char (1字符=2字节)
? ① 定义char型变量,通常使用一对'',内部只能写一个字符
? ② 表示方式:1.声明一个字符 2.转义字符 3.直接使用 Unicode 值来表示字符型常量
4.布尔型:boolean
? ① 只能取两个值之一:true 、 false
? ② 常常在条件判断、循环结构中使用
按声明的位置分类(了解)
2.定义变量的格式:
数据类型 变量名 = 变量值;
或
数据类型 变量名;
变量名 = 变量值;
3.变量使用的注意点
① 变量必须先声明,后使用
② 变量都定义在其作用域内。在作用域内,它是有效的。换句话说,出了作用域,就失效了
③ 同一个作用域内,不可以声明两个同名的变量
4.基本数据类型变量间运算规则
1.涉及到的基本数据类型:除了boolean之外的其他7种
2.自动类型转换(只涉及7种基本数据类型)
? 结论:当容量小的数据类型的变量与容量大的数据类型的变量做运算时,结果自动提升为容量大的数据类型。
? byte 、char 、short --> int --> long --> float --> double
? 特别的:byte,short,char之间不会相互转换,他们三者在计算时首先转换为int类型
? 说明:此时的容量大小指的是,表示数值的范围的大和小。比如:float容量要大于long的容量
3.强制类型转换(只涉及7种基本数据类型):自动类型提升运算的逆运算
? 1.需要使用强转符:()
? 2.注意点:
-
强制类型转换,可能导致精度损失。(在大转小时)
-
java中强转只能针对单个bean对象,数组间不可直接强转 eg:Object[] objs ==> String[] strs
java.lang.ClassCastException: [Ljava.lang.Object; cannot be cast to [Ljava.lang.String;
4.String与8种基本数据类型间的运算
- String属于引用数据类型,翻译为:字符串
- 声明String类型变量时,使用一对""
- String可以和8种基本数据类型变量做运算,且运算只能是连接运算:+
- 运算的结果仍然是String类型
3.进制的转换

进制转换的介绍
第一组:
- 二进制转十进制
- 八进制转十进制
- 十六进制转十进制
第二组: - 十进制转二进制
- 十进制转八进制
- 十进制转十六进制
第三组 - 二进制转八进制
- 二进制转十六进制
第四组 - 八进制转二进制
- 十六进制转二进制
第一组
二进制转换成十进制

八进制转换成十进制

第二组
十六进制转换成十进制
规则:从最低位(右边)开始,将每个位上的数提取出来,乘以 16 的(位数-1)次方,然后求和。
案例:请将 0x23A 转成十进制的数
0x23A = 10 * 16^0 + 3 * 16 ^ 1 + 2 * 16^2 = 10 + 48 + 512 = 570
十进制转换成二进制
规则:将该数不断除以 2,直到商为 0 为止,然后将每步得到的余数倒过来,就是对应的二进制。
案例:请将 34 转成二进制
= 0B00100010
十进制转换成八进制
规则:将该数不断除以 8,直到商为 0 为止,然后将每步得到的余数倒过来,就是对应的八进制。
案例:请将 131 转成八进制 => 0203
十进制转换成十六进制
规则:将该数不断除以 16,直到商为 0 为止,然后将每步得到的余数倒过来,就是对应的十六进制。
案例:请将 237 转成十六进制 => 0xED
第三组
二进制转换成八进制
规则:从低位开始,将二进制数每三位一组,转成对应的八进制数即可。
案例:请将 ob11010101 转成八进制
ob11(3)010(2)101(5) => 0325
二进制转换成十六进制
规则:从低位开始,将二进制数每四位一组,转成对应的十六进制数即可。
案例:请将 ob11010101 转成十六进制
ob1101(D)0101(5) = 0xD5
第四组
八进制转换成二进制
规则:将八进制数每 1 位,转成对应的一个 3 位的二进制数即可。
案例:请将 0237 转成二进制
02(010)3(011)7(111) = 0b10011111
十六进制转换成二进制
规则:将十六进制数每 1 位,转成对应的 4 位的一个二进制数即可。
案例:请将 0x23B 转成二进制
0x2(0010)3(0011)B(1011) = 0b001000111011
3.运算符
运算符是一种特殊的符号,用以表示数据的运算、赋值和比较等。
算术运算符
赋值运算符
比较运算符(关系运算符 )
逻辑运算符
位运算符
元运算符
1.算术运算符
注意点
1.如果对负数取模,可以把模数负号忽略不记,eg:5%-2=1;但被模数是负数则不可忽略。此外,取模运算的结果不一定总是整数,eg:-5%2=-1
2.对于除号“/”,它的整数除和小数除是区别的:整数之间做除法时,只保留整数部分而舍弃小数部分。
? 例如:int x=3510;x=x/1000*1000; x的 结果是? //1000
3.“+”除字符串相加功能外,还能把非字符串转换成字符串.例如: System.out.println(“5+5=”+5+5); //打印结果是? 5+5=55 ?
2.赋值运算符
符号:=
? 当“=”两侧数据类型不一致时,可以使用自动类型转换或使用强制类型转换原则进行处理。
? 支持连续赋值
扩展赋值运算符: +=, -=, *=, /=, %= (使用这些运算符,在与容量大的类型的数据计算时,原数据类型不会自动提升为容量大的数据类型)
3.比较运算符
比较运算符的结果都是boolean型,也就是要么是true,要么是false。
比较运算符“==”不能误写成“=”
instanceof只能用于引用数据类型
4.逻辑运算符
注意点:
? 逻辑运算符用于连接布尔型表达式,在Java中不可以写成3
? “&”和“&&”的区别:
? 单&时,左边无论真假,右边都进行运算;
? 双&时,如果左边为真,右边参与运算,如果左边为假,那么右边不参与运算。
? “|”和“||”的区别同理,||表示:当左边为真,右边不参与运算。
? 异或( ^ )理解:异或,追求的是“异”
5.位运算
基本规则
java 中有 7 个位运算(&、|、^、~、>>、<<和 >>>)

运算过程
算术左移<<

算术右移>> 无符号右移(逻辑右移)>>>

按位与& 按位或| 按位异或^
按位取反~

原码、补码、反码
基本规则
二进制的最高位是符号位: 0表示正数,1表示负数
正数的原码,反码,补码都一样(三码合一)
负数的反码=它的原码符号位不变,其它位取反
负数的补码=它的反码+1,负数的反码 = 负数的补码 - 1
0的反码,补码都是O
java没有无符号数,换言之,java中的数都是有符号的
在计算机运算的时候,都是以补码的方式来运算和存储的.
当我们看运算结果的时候,要看他的原码
- Java整数常量默认是int类型,当用二进制定义整数时,其第32位是符号位;
当是long类型时,二进制默认占64位,第64位是符号位 - 二进制的整数有如下三种形式:
原码:直接将一个数值换成二进制数。最高位是符号位
负数的反码:是对原码按位取反,只是最高位(符号位)确定为1。
负数的补码:其反码加1。 - 计算机以二进制补码的形式保存所有的整数。
正数的原码、反码、补码都相同
负数的补码是其反码+1
为什么使用原码、反码、补码
计算机辨别“符号位”显然会让计算机的基础电路设计变得十分复杂! 于是人们想出了将符号位也参与运算的方法.
我们知道, 根据运算法则减去一个正数等于加上一个负数, 即: 1-1 = 1 + (-1) = 0 ,
所以机器可以只有加法而没有减法, 这样计算机运算的设计就更简单了。
1 - 1 = 1 - (-1) = [0000 0001]原 + [1000 0001]原 = [0000 0001]补 + [1111 1111]补 = [0000 0000]补 = [0000 0000]原
byte取值区间:-127~128
-127 = 1000 0001(byte类型 最小的负数)
-1 = 1111 1111 (byte类型 最大的负数)
1 = 0000 0001
0 = 0000 0000
6.三元运算符
语法是“条件表达式?表达式1:表达式2”
使用这个算法可以使调用数据时逐级筛选。
表达式:“( ) ? : ” ()中进行二元运算 ?再运算,就形成三元运算符
一般if--else可以改写为三元表达式
4.流程控制
顺序结构:程序从上到下执行
分支结构:
? if-else if - else
? switch-case
switch(表达式)中表达式的值必须是下述几种类型之一:byte,short, char,int,枚举 (jdk 5.0),String (jdk 7.0);
case子句中的值必须是常量,不能是变量名或不确定的表达式值;
同一个switch语句,所有case子句中的常量值互不相同;
break语句用来在执行完一个case分支后使程序跳出switch语句块;如 果没break,程序会顺序执行到switch结尾
default子句是可任选的。同时,位置也是灵活的。当没匹配的case时, 执行default
循环结构:
? for
? while
? do-while 先执行一次在判断while的条件来决定是否循环
带标记的for循环
@Test
public void test() { // i0-j0-j1-i1-j0-j1-i2-
Outerloop:
for (int i = 0; i < 10; i++) {
System.out.print("i" + i + "-");
Innerloop:
for (int j = 0; j < 2; j++) {
if (i == 2) {
break Outerloop; // 只能打断外层的循环(当外层的 i = 2 时)即打断了整个循环
}
System.out.print("j" + j + "-");
}
}
}
@Test
public void test1() { // i0-j0-j1-i1-j0-j1 -i2- i3-j0-j1-i4-j0-j1-i5-j0-j1-i6-j0-j1-i7-j0-j1-i8-j0-j1-i9-j0-j1-
for (int i = 0; i < 10; i++) {
System.out.print("i" + i + "-");
Innerloop:
for (int j = 0; j < 2; j++) {
if (i == 2) {
break; // 只能打断内层的一次循环(当外层的 i = 2 时)
}
System.out.print("j" + j + "-");
}
}
}