一、常量和变量
1、标识符可以由字母、数字、下划线(_)、美元符号($)组成,不能以数字开头,不能是Java关键字和保留字。
2、命名尽量简短,且能清楚的表达其作用,做到见名知意。
3、Java中有三种注释类型:
(1)单行注释
(2)多行注释
(3)文档注释(Java特有,通过javadoc.exe命令从文档注释中提取内容,生成程序的 API 帮助文档 -- javadoc -d doc xxx.java)
单行注释中可以嵌套 单行注释/多行注释,多行注释中可以嵌套单行注释,但不可以嵌套多行注释
注释不会被编译到字节码文件(.class)中去,所以加了注释之后字节码文件不会变大
PS:使用文档注释时还可以使用 javadoc 标记生成更详细的文档信息:
@author 标明开发该类模块的作者
@version 标明该类模块的版本
@see 参考转向,也就是相关主题
@param 对方法中某参数的说明
@return 对方法返回值的说明
@exception 对方法可能抛出的异常进行说明
4、常量:声明常量必须使用 final 关键字,常量名所有字母都大写,用下划线连接。常量的值不能是默认初始值,且常量值被设定后,在程序运行过程中不允许改变。
常量的分类:整数常量(有四种表现形式:二/八/十/十六进制)、小数常量、布尔常量(只有true和false两个值,通常用于判断)、字符常量(将一个数字、字母或符号用单引号标识,字符中所能表示的数字只有0--9)、字符串常量(将一个或多个字符用双引号标识)、null常量(只有null一个数值)
5、1 byte(字节) = 8 bit(比特位/二进制位)
字节(byte)是数据的最小单元。无论数据大或小,都至少用一个字节表示。一个中文在内存中用2个字节存放。
6、变量:变量的三要素:变量类型、变量名、变量值。变量名的长度没有限制,但区分大小写。
Java中变量的使用规则:
(1)变量必须先声明,后使用 -- 必须先初始化才能使用;
(2)变量可以声明时初始化,也可以使用时赋值;
(3)变量每次只能赋一个值,但可以多次修改;
(4)变量必须有自己的作用范围。
7、数据类型
基本数据类型
数值型
整数类型(byte、short、int、long):1、2、4、8
浮点类型(float、double):4、8
字符型(char):2字节
布尔型(boolean)
引用数据类型
类(class)
接口(interface)
数组( [ ] )
注意:
(1)整数默认为int类型,小数默认为double类型。所以,为long型变量赋值时在数值后添加字母L,为float型变量赋值时在数值后添加字母f。为char型变量赋值时使用单引号(')引起来
(2)在 Java 的领域里,基本数据类型变量存的是数据本身,而引用数据类型变量存的是保存数据的空间地址
8、null
null:空类型,不会应用在基本数据类型
引用数据类型只能指向实体,或者什么都不指向--为空null
null可以取消引用型变量的指向(引用型变量不做任何实际指向时,可将其置为null)
9、类型转换:一般情况下,运算的两端是同类型或者都是数值类型(数值类型可以做自动类型提升)才可以,因为类型不一致,存储空间也不一致。
强制类型转换可能会造成数据的丢失/精度丢失,因为强制转换不是四舍五入,而是直接将小数位截断
char类型也可以进行运算,字符在ASCII表中有对应的数字 'a'+1 --> 98
boolean类型不可以做运算,也不可以进行类型转换
eg: byte b = 4;
byte b1 = 3;
byte b2 = 7;
b = b1 + b2; //编译时报错,因为b1、b2是变量,其值会变
//若上述三个变量都是int类型,则不会报错。因为int是默认类型。处理为:舍弃高位
10、运算符:算术运算符、赋值运算符、比较运算符、逻辑运算符、位运算符、三元运算符。实际开发中,一般会使用小括号辅助进行运算符的优先级顺序管理。
算术运算符
(1)两个整数做运算,结果还是整数。如果涉及到负数运算时,符号只参考被运算的数
(2)取模运算的用处:任何数%2其结果不是0就是1--开关算法的定义
(3)加号(+):加法运算、连接符(任何数据,只要和字符串进行相加,都是相连接,拼成一个更大的字符串)
(4)自增和自减运算符只能用于操作变量,不能直接用于操作数值或常量
(5)b = a ++; a自增的先增和后增是有区别的,后增要先预存a的原值,运算完(a自增)之后再将原值赋给b(最后才将右边赋值给左边)
赋值运算符
(1)+=、-=、*=、/=、%=:将左右两边运算的结果赋给左边
(2)short s = 3;
s = s +4; //编译报错,可能损失精度。不做自动转换,需要强转
s += 4; //在内存中是: s = (short)(s+4),有自动强转动作(多使用此种方式)
(3)a *= b + 6; //a = a * (b + 6)
比较运算符
(1)比较运算符运算完一定有结果,且结果只有两种:true、false
(2)> 、 < 、 >= 、 <=只支持左右两边操作数是数值类型,== 、 !=两边的操作数既可以是数值类型,也可以是引用类型(比地址)。且 == 和 != 比其他关系运算符的优先级低
(3)比较运算表达式不能连接,eg:2 < x < 5 错误
(4)double a = 1.0;
double b = 0.1 + 0.1 + ... + 0.1; //10个0.1相加
a == b; //false. 因为 a=1.0, b=0.99...9 (16个9)
比较a和b是否相等: Math.abs(a - b) < 1e-6 //1e-6:1 * 10的-6次方 = 0.000001
逻辑运算符
(1)逻辑运算符用于连接两个boolean类型的表达式,优先级:! > && > ||
(2)一般情况下,连接boolean型表达式,&& 和 || 使用较多(左边可以确定结果时右边不再参与运算),& 和 | 不仅可以连接boolean型(无论左边的运算结果是什么,右边都参与运算),还可以做移位运算
(3)异或(^)运算:两边相同结果为false,两边不同结果为true
位运算符
(1)<< 、 >> 、 >>> (无符号右移) 、 & 、 | 、 ^ 、 ~
(2)左移几位就是乘以2的几次方。在进行除2次幂运算时,用 >> 保证符号位
(3)移位运算不会改变操作数本身,只是得到了一个新的运算结果,而原来的操作数本身是不会改变的
(4)&的特点:取某个二进制数中的某一段,用 1 & 数( 1 的特点:凡是有效位全保留)
(5)一个数异或(^)同一个数两次,结果还是这个数 -- 加密、解密
三元运算符
条件表达式 ? 表达式1 : 表达式2;
11、流程控制语句
判断结构(if语句)
(1)三元运算符必须得有运算结果,if...else...可以有结果,也可以没有结果。所以,当if...else...运算后有一个具体的结果时,可以简写成三元运算符
(2)多重 if 语句的最后一个else可以省略,且每一个if条件中都增加了else隐含条件(对前面条件取反)。所以,使用多重 if 语句时,要先处理包含范围更小的情况
(3)多条件对应相同内容时,应将多条件进行合并 -- 提高代码的复用性
(4)多重 if 语句:if...else if...else...整个是一条语句,只运行一个代码块(程序的单一出口原则)
(5)直接定义在主函数中的未命名的代码块叫局部代码块,局部代码块可以定义局部变量的生命周期 -- 可以节省内存空间
(6)if 和 switch 的区别之 if:a.对具体的值进行判断; b.对区间进行判断; c.对运算结果是 boolean 类型的表达式进行判断
(7)if 和 while 的区别:if 对条件只判断一次,而 while 可以对条件进行多次判断
选择结构(switch)
(1)switch(表达式) 一执行,各个case都已加载进内存,所以,各case的备选答案是无序的。先读第一个case,依次往下,哪个case的值匹配,才读里面的具体内容,直到遇到break或大括号结束。无论default放在哪里,有效答案都不匹配时,最后才读default中的内容。default 可以出现在任意位置,也可以省略
说明:case匹配后,读该case中的内容。后面如果没有break或大括号结束,则继续读下一个case中的内容(不读下一个case判断),直到遇到break或大括号结束 -- 只要有一个case匹配,就不再读后面的case了(程序的单一出口原则)
(2)switch(表达式) 可选择的数据是有限的,表达式的值必须是整型或字符型,可选的值有:byte、short、int、char、String、枚举
(3)case 后面的值可以是常量数值,也可以是一个常量表达式,但不能是变量或带有变量的表达式
(4)可以把功能相同的 case 语句合并起来
(5)if 和 switch 的区别之 switch:a.对具体的值进行判断; b.值的个数通常是固定的; c.功能性较差,书写麻烦易出错
(6)对于几个固定值的判断,建议使用switch语句。因为switch语句会将具体的答案一次性加载进内存,效率相对较高
循环结构(while、do...while、for)
(1)Java 常用的 3 种循环: while 、do...while、for
(2)while特点:先判断,后执行,do...while特点: 先执行,后判断(do...while语句保证循环至少被执行一次)
(3)if 和 while 的区别:if 对条件只判断一次,而 while 可以对条件进行多次判断
(4)for 循环(有固定次数):
执行过程:
a. 执行循环变量初始化部分,设置循环的初始状态,此部分在整个循环中只执行一次
b. 进行循环条件的判断,如果条件为 true ,则执行循环体内代码;如果为 false ,则直接退出循环
c. 执行循环变量变化部分,改变循环变量的值(控制循环次数),以便进行下一次条件判断
d. 依次重新执行 b、c 步骤,直到退出循环
注意:
a. for 关键字后面括号中的三个表达式必须用 “;” 隔开,三个表达式都可以省略,但 “;” 不能省略
省略 “循环变量初始化”,可以在 for 语句之前由赋值语句进行变量初始化操作
省略 “循环条件”,循环可能会一直执行下去(死循环),要避免
省略 “循环变量变化”,可以在循环体中进行循环变量的变化
b. "循环变量初始化" 和 "循环变量变化" 部分,可以使用 “,” 同时初始化或改变多个循环变量的值
eg: for (int i=1, j=5; i<=5 && j>=1; i++, j--){ ... }
c. ”循环条件“ 部分结果为 true 或 false,可以使用逻辑运算符组合的表达式,表示复杂判断条件,但一定注意运算的优先级。其他表达式只要合法即可
d. for 和while 可以互换
如果需要通过变量来对循环进行控制,且该变量只作为循环增量存在时,用 for 更节约空间。
如果要通过一个循环操作变量,该变量操作完之后还需要进一步的运算,此时要使用while。如果使用for,建议在for之前额外定义一个变量来保存循环变量的值,责任明确
e. 循环通常情况下,需要定义条件,需要控制次数
f. 用到while循环,就要考虑到不满足while循环条件的情况,可用return结束函数
其他流程控制语句(break、continue)
break:
a. 作用:跳出当前循环,执行循环后的代码。也可跳出指定循环,用法:在需要跳出的循环前指定 标号+冒号(:),使用时,break 标号; 即可
b. 作用范围:switch语句 或 循环(loop)语句内使用 (无限循环用break停止)
c. 当 break 语句单独存在时,下面不要定义其他语句,因为执行不到
continue:
a. 结束本次循环,继续下次循环。也可以结束指定循环,继续下次循环。用法:在需要结束的循环前指定 标号+冒号(:),使用时,continue 标号; 即可
b. 作用范围:循环(loop)语句内使用
c. 当 continue 语句单独存在时,下面不要定义其他语句,因为执行不到
多重循环:
循环体中包含循环语句的结构称为多重循环,最常见的就是二重循环:外层循环控制打印的行数,内层循环控制每行打印的个数
12、foreach
foreach是for语句的特殊简化版本,在遍历数组、集合时,foreach更简单便捷
语法: for(元素类型 元素变量 : 遍历对象) {
//执行的代码
}
如果想在foreach语句中获取数组元素的下标,在外部定义一个变量,在foreach循环中自增,但不建议使用这种做法
13、while或for循环,可将其定义成死循环,然后在循环内部通过continue和break控制循环结束
while (true) {
//......此处省略部分代码
if (true) {
continue;
}
//......此处省略部分代码
break;
}
for (int i = 0; ; i++) {
//......此处省略部分代码
if (true) {
break;
}
}