1. 保留字和关键字

关键字:被Java语言赋予了特殊含义,用做专门用途的字符串(单词)
特点:都是小写

用于定义数据类型的关键字
class interface enum byte short
int long float double char
boolean void
用于定义流程控制的关键字
if else switch case default
while do for break continue
return
用于定义访问权限修饰符的关键字
private protected public
用于定义类,函数,变量修饰符的关键字
abstract final static synchronized
用于定义类与类之间关系的关键字
extends implements
用于定义建立实例及引用实例,判断实例的关键字
new this super instanceof
用于异常处理的关键字
try catch finally throw throws
用于包的关键字
package import
其他修饰符关键字
native strictfp transient volatile assert
用于定义数据类型值的字面值 严格上不是,但可以这么认为,因为他们不能用于标识符
true false null

保留字
现有Java版本尚未使用, 但以后版本可能会作为关键字使用。自己命名标识符时要避免使用这些保留字
gotoconst_(在Java9中被用作保留字,以后可能会使用)

2. 标识符

标识符:Java 对各种变量、 方法和类等要素命名时使用的字符序列称为标识符技巧:凡是自己可以起名字的地方都叫标识符。

定义合法标识符规则:
1. Unicode字符集中的任意字母和数字, _或 $ 组成
2. 数字不可以开头。
3. 不可以使用关键字和保留字,但能包含关键字和保留字。
4. Java中严格区分大小写,长度无限制。
5. 标识符不能包含空格。

不符合标识符规则的命名,编译时不通过

  1. public class IdentifierTest{
  2. public static void main(String args[]){
  3. System.out.println("Hello, zdkk");
  4. }
  5. }
  6. class hello1_${
  7. }
  8. /*
  9. class 1hello{
  10. }
  11. */
  12. /*
  13. class int{
  14. }
  15. */
  16. class Myint{
  17. }
  18. class myint{
  19. }
  20. class My111111111111111111111111111111111111111111111111111111{
  21. }
  22. class My Int{
  23. }

image.png
Java中的名称命名规范:
包名:多单词组成时所有字母都小写: xxxyyyzzz
类名、接口名:多单词组成时,所有单词的首字母大写: XxxYyyZzz
变量名、方法名:多单词组成时,第一个单词首字母小写,第二个单词开始每个
单词首字母大写: xxxYyyZzz
常量名:所有字母都大写。多单词时每个单词用下划线连接: XXX_YYY_ZZZ

注意1:在起名字时,为了提高阅读性,要尽量有意义,“见名知意”。 注意2: java采用unicode字符集,因此标识符也可以使用汉字声明,但是不建议使用。

3. 字面量与基本数据类型

字面量

直接出现在Java源码中的值,包括整数,浮点数,字符,字符串,以及保留字true, false, null

变量的概念:

内存中的一个存储区域
该区域的数据可以在同一类型范围内不断变化
变量是程序中最基本的存储单元。包含变量类型、变量名和存储的值


变量的作用:

用于在内存中保存数据

使用变量注意:

Java中每个变量必须先声明,后使用
使用变量名来访问这块区域的数据

变量的作用域:其定义所在的一对{ }内
变量只有在其作用域内才有效
同一个作用域内,不能定义重名的变量

变量的使用:

  • 声明变量

数据类型 变量名 int num

  • 变量赋值

变量名= 值 num = 19

  • 声明+赋值

数据类型 变量名 = 值 int num = 19

变量分类

变量按数据类型分类 :

Java中的基本数据类型不存在无符号的,它们的取值范围是固定的,不会随着机器硬件环境或操作系统的改变而改变。
基本语法 - 图2

整型

类 型 占用存储空间 表数范围
byte 1字节=8bit位 -128 ~ 127
short 2字节 -215 ~215-1
int 4字节 -231 ~ 231-1 (约21亿)
long 8字节 -263 ~ 263-1(约9*1018)

所有整型都表示有符号的数字,Java中没有类似C/C++中的unsigned关键字 java的整型常量默认为 int 型,声明long型常量须后加‘l’或‘L’ java程序中变量通常声明为int型,除非不足以表示较大的数,才使用long bit: 计算机中的最小存储单位。 byte:计算机中基本存储单元。

浮点型
与整数类型类似, Java 浮点类型也有固定的表数范围和字段长度,不受具体操作系统的影响。

类 型 占用存储空间 表数范围
单精度float 4字节 -3.403E38 ~ 3.403E38
双精度double 8字节 -1.798E308 ~ 1.798E308

浮点型常量有两种表示形式:
十进制数形式:如: 5.12 512.0f .512 (必须有小数点)
科学计数法形式:如: 5.12e2 512E2 100E-2 也可以是十六进制科学计数法:0.125可以表示为0x1.0p-3 float:单精度,尾数可以精确到7位有效数字。很多情况下,精度很难满足需求。
double:双精度,尾数可以精确到16位有效数字。默认采用此类型。
Java 的浮点型常量默认为double型, 声明float型常量,须后加‘f’或‘F’。

字符型
char 型数据用来表示通常意义上“字符”(2字节无符号数)
Java中的所有字符都使用Unicode编码,故一个字符可以存储一个字母,一个汉字,或其他书面语的一个字符。
取值范围:\u0000~\uffff
字符型字面量的三种表现形式:

  • 字符常量是用单引号 '' 括起来的单个字符。
  • Java中还允许使用转义字符 \ 来将其后的字符转变为特殊字符型常量。
  • 直接使用 Unicode 值来表示字符型常量: \uxxxx 。其中XXXX代表一个十六进制整数。
    1. char c1 = 'a';
    2. char c2 = '中';
    3. char c3 = '9';
    4. char c4 = '\n';
    5. char c5 = '\u000a';
    char类型是可以进行运算的。因为它都对应有Unicode码。
\b 退格键
\t 制表位
\n 换行符
\f 换页符
\r 回车符
\“ 双引号
\‘ 单引号
\\ 反斜线
\xxx xxx编码的Latin-1字符,其中xxx是八进制数,介于000-377之间。
\uxxxx xxxx编码的Unicode字符,其中xxxx是四个十六进制数。Unicode转义序列可以出现在Java程序的任何位置,不局限在字符和字符串字面量中。

boolean类型
用来判断逻辑条件,一般用于程序流程控制:

  • if条件控制语句;
  • while循环控制语句;
  • do-while循环控制语句;
  • for循环控制语句;

必须明确给出条件语句!
boolean类型数据只允许取值true和false,无null。
不可以使用0或非 0 的整数替代false和true,这点和C语言不同。
image.png
Java虚拟机中没有任何供boolean值专用的字节码指令, Java语言表达所操作的boolean值,在编译之后都使用java虚拟机中的int数据类型来代替: true用1表示, false用0表示。 ———《java虚拟机规范 8版》
boolean类型到底占多少字节

按照声明的位置分类

在方法体外,类体内声明的变量称为成员变量。
在方法体内部声明的变量称为局部变量。
基本语法 - 图4

二者在初始化值方面的异同:
同: 都有生命周期 异: 局部变量除形参外,需显式初始化。

类型转换

参考文档

基本类型转换

有多种类型的数据混合运算时,系统首先自动将所有数据转换成容量最大的那种数据类型,然后再进行计算。
image.png
byte,short,char之间不会相互转换,他们三者在计算时首先转换为int类型。
boolean类型不能与其它数据类型运算。

基本类型与字符串类型转换

当把任何基本数据类型的值和字符串(String)进行连接运算时(+), 基本数据类型的值将自动转化为字符串(String)类型。

强制类型转换

自动类型转换的逆过程,将容量大的数据类型转换为容量小的数据类型。使用时要加上强制转换符: () , 但可能造成精度降低或溢出,格外要注意。
通常,字符串不能直接转换为基本类型,基本类型也不能之间转换成字符型, 但通过基本类型对应的包装类则可以实现把字符串转换成基本类型。

  1. String str = "123";
  2. int num = Integer.parseInt(a);

进制

所有数字在计算机底层都以二进制形式存在。

对于整数,有四种字面量表示方式
二进制(binary): 0,1 ,满2进1.以0b或0B开头。
十进制(decimal): 0-9 ,满10进1。
八进制(octal): 0-7 ,满8进1. 以数字0开头表示。
十六进制(hex): 0-9及A-F,满16进1. 以0x或0X开头表示。此处的A-F不区分大小写。

在任何数字字面量中,可以使用下划线,提升可读性。 严格来说,负号是作用在字面量上的运算符,而不是字面量的一部分。

4. 运算符

运算符是一种特殊的符号,用以表示数据的运算、赋值和比较等。

算术运算符

运算符 运算 范例 结果 是否会发生数据类型转换
+ 正号 +3 3
- 负号 b=4; -b -4
+ 5+5 10
- 6-4 2
* 3*4 12
/ 5/5 1
% 取模(取余) 7%5 2
++
++
自增(前):先运算后取值
自增(后):先取值后运算
a=2;b=++a;
a=2;b=a++;
a=3;b=3
a=3;b=2
- -
- -
自减(前):先运算后取值
自减(后):先取值后运算
a=2;b=- -a
a=2;b=a- -
a=1;b=1
a=1;b=2
+ 字符串连接 “He” + “llo” “Hello” 会,都转成字符串

对于除号“/”,它的整数除和小数除是有区别的:整数之间做除法时,只保留整数部分而舍弃小数部分。 如果对负数取模,可以把模数负号忽略不记,如: 5%-2=1。 但被模数是负数则不可忽略。此外,取模运算的结果不一定总是整数。 自增运算不会改变变量本身的数据类型

image.png

赋值运算符

符号: =
当“=”两侧数据类型不一致时, 可以使用自动类型转换或使用强制类型转换原则进行处理。
支持连续赋值。 从右往左
扩展赋值运算符: +=, -=, *=, /=, %= 不会改变数据类型(可以看成是强制类型转换)

  1. class PracticeTest2{
  2. public static void main(String args[]){
  3. short s = 3;
  4. //s = s + 2; //错误: 不兼容的类型: 从int转换到short可能会有损失
  5. s += 2; //这样是可以的
  6. s++; //这样也是可以的
  7. System.out.println(s); //6
  8. int m = 2;
  9. int n = 3;
  10. n *= m++;
  11. System.out.println("n="+n); //n=6 注意是6不是9
  12. System.out.println("m="+m); //m=3
  13. int i = 1;
  14. i *= 0.1;
  15. System.out.println("i="+i);//i=0
  16. i++;
  17. System.out.println("i="+i);//i=1
  18. int number = 10;
  19. number += (number++) + (++number);
  20. System.out.println("number="+number);//number=32
  21. }
  22. }

image.png

比较运算符(关系运算符)

含自动类型转换

运算符 运算 范例 结果
== 相等于 4==3 false
!= 不等于 4!=3 true
< 小于 4<3 false
> 大于 4>3 true
<= 小于等于 4<=3 false
>= 大于等于 4>=3 true
instanceof 检查是否是类的对象 “Hello” instanceof String true

比较运算符的结果都是boolean型,也就是要么是true,要么是false。
比较运算符“==”不能误写成“=” 。
比较运算符也有自动类型转换
> < >= <= 只能用于数值之间的比较
== != 也能用于引用数据类型之间的比较,前提是两者满足子父类关系

逻辑运算符4个

&—逻辑与 | —逻辑或 ! —逻辑非
&& —短路与 || —短路或 ^ —逻辑异或
“&”和“&&”的区别:
单&时,左边无论真假,右边都进行运算;
双&时,如果左边为真,右边参与运算,如果左边为假,那么右边不参与运算。

位运算符7个

仅限于整型之间,含自动类型转换
当然与,或,异或运算符除外,既能进行逻辑运算,也能进行位运算

运算符 运算 范例
<< 左移 3 << 2 = 12 —> 322=12
>> 右移 3 >> 1 = 1 —> 3/2=1
>>> 无符号右移 3 >>> 1 = 1 —> 3/2=1
& 与运算 6 & 3 = 2
| 或运算 6 | 3 = 7
^ 异或运算 6 ^ 3 = 5
~ 取反运算 ~6 = -7
<< 空位补0,被移除的高位丢弃,空缺位补0。
>> 被移位的二进制最高位是0,右移后,空缺位补0;
最高位是1,空缺位补1。
>>> 被移位二进制最高位无论是0或者是1,空缺位都用0补。
& 二进制位进行&运算,只有1&1时结果是1,否则是0;
| 二进制位进行 | 运算,只有0 | 0时结果是0,否则是1;
^ 相同二进制位进行 ^ 运算,结果是0; 1^1=0 , 0^0=0
不相同二进制位 ^ 运算结果是1。 1^0=1 , 0^1=1
~ 正数取反,各二进制码按补码各位取反
负数取反,各二进制码按补码各位取反

image.png

三元运算符

格式:
(条件表达式)?表达式1: 表达式2;
条件表达式为true, 运算后的结果是表达式1;为false, 运算后的结果是表达式2;
表达式1和表达式2为同种类型或者说统一为一种类型
可嵌套
能用三元的都能用if-else,能用if-else的不一定能用三元。但是能用三元尽量用三元

优先级

image.png
c运算符优先级
屏幕截图 2021-01-15 184030.png

5. 程序流程控制

流程控制语句是用来控制程序中各语句执行顺序的语句,可以把语句组合成能完成一定功能的小逻辑模块。

顺序结构

程序从上到下逐行地执行,中间没有任何判断和跳转。

分支结构

根据条件,选择性地执行某段代码。

if—-else

就近原则
image.png
三种格式

  1. if(条件表达式){
  2. 执行代码块;
  3. }
  1. if(条件表达式){
  2. 执行代码块1;
  3. }
  4. else{
  5. 执行代码块2;
  6. }
  1. if(条件表达式1){
  2. 执行代码块1;
  3. }
  4. else if (条件表达式2){
  5. 执行代码块2;
  6. }
  7. ……
  8. else{
  9. 执行代码块n;
  10. }

多选1,一旦某个条件满足,后续就不会执行

switch—-case

格式:

  1. switch(表达式){
  2. case 常量1:
  3. 语句1;
  4. // break;
  5. case 常量2:
  6. 语句2;
  7. // break;
  8. case 常量N:
  9. 语句N;
  10. // break;
  11. default:
  12. 语句;
  13. // break;
  14. }

switch(表达式)中表达式的值必须是下述几种类型之一: byte, short,char, int, 枚举 (jdk 5.0), String (jdk 7.0); case子句中的值必须是常量,不能是变量名或不确定的表达式值;
同一个switch语句,所有case子句中的常量值互不相同; 即标签不能重复

if和switch语句很像,具体什么场景下,应用哪个语句呢?

如果判断的具体数值不多,而且符合byte、 short 、 char、 int、 String、枚举等几种类型。虽然两个语句都可以使用,建议使用swtich语句。因为效率稍高。
其他情况:对区间判断,对结果为boolean类型判断,使用if, if的使用范围更广。也就是说, 使用switch-case的,都可以改写为if-else。反之不成立。
switch_if_three.jpg

循环结构

根据循环条件,重复性的执行某段代码。
循环语句的四个组成部分

  • 初始化部分(init_statement)
  • 循环条件部分(test_exp)
  • 循环体部分(body_statement)
  • 迭代部分(alter_statement)

    while

    格式:
    1. ①初始化部分
    2. while(②循环条件部分){
    3. ③循环体部分;
    4. ④迭代部分;
    5. }

    do—while

    格式:
    1. ①初始化部分;
    2. do{
    3. ③循环体部分
    4. ④迭代部分
    5. }while(②循环条件部分);

    for

    格式:
    1. for (①初始化部分; ②循环条件部分; ④迭代部分){
    2. ③循环体部分;

    ②循环条件部分为boolean类型表达式,当值为false时,退出循环
    ①初始化部分可以声明多个变量,但必须是同一个类型,用逗号分隔
    ④可以有多个变量更新,用逗号分隔

foreach(JDK1.5)

break与continue

break语句用于终止某个语句块的执行

  1. {
  2. ……
  3. break;
  4. ……
  5. }

break语句出现在多层嵌套的语句块中时,可以通过标签指明要终止的是哪一层语句块

  1. label1: { ……
  2. label2: { ……
  3. label3: {
  4. ……
  5. break label2;
  6. ……
  7. }
  8. }
  9. }

continue 语句
continue只能使用在循环结构中
continue语句用于跳过其所在循环语句块的一次执行,继续下一次循环
continue语句出现在多层嵌套的循环语句体中时,可以通过标签指明要跳过的是哪一层循环

总结

break只能用于switch语句和循环语句中。
continue 只能用于循环语句中。
二者功能类似,但continue是终止本次循环, break是终止本层循环。
break、 continue之后不能有其他的语句,因为程序永远不会执行其后的语句。
标号语句必须紧接在循环的头部。标号语句不能用在非循环语句的前面。
很多语言都有goto语句, goto语句可以随意将控制转移到程序中的任意一条语句上,然后执行它。但使程序容易出错。 Java中的break和continue是不同于goto的。