一、关键字
定义:被 Java 赋予特殊含义的单词。
特点:基本上都是英文小写。
-
用于定义数据类型的关键字
基本数据类型 整数型(默认为 int) byte(8 位,1 字节,默认值是 0,最大存储数据量是 2^8-1,数据范围是 -2^7 ~ 2^7-1 之间) short(16 位,2 字节,默认值是 0,最大存储数据量是 2^16-1,数据范围是 -2^15 ~ 2^15-1 之间) int(32 位,4 字节,默认值是 0,最大存储数据量是 2^32-1,数据范围是 -2^31 ~ 2^31-1 之间) long(64 位,8 字节,默认值是 0L,最大存储数据量是 2^64-1,数据范围是 -2^63 ~ 2^63-1 之间) 浮点型(默认为 double) float(32 位,4 字节,默认值是 0.0f,范围是 -3.40E38 ~ 3.40E38 之间) double(64 位,8 字节,默认值是 0.0d,范围是 -1.79E308 ~ 1.79E308 之间) 字符型 char(16 位,2 字节,Unicode 码,最小值是 \u0000(0),最大值是 \uffff(65535)) 布尔型 boolean(1 位,默认值是 false) 引用数据类型 class(类) interface(接口) enum(枚举) 数组 注解 void(用于方法(函数)上表示无返回值类型)
-
用于定义数据类型值的关键字
true(真) false(假) null(空)
-
用于定义流程控制的关键字
判断 if else switch case default 循环 for while do 继续循环 continue 结束循环或选择语句 break 返回 return
-
用于定义访问权限修饰符的关键字
public(公有的) protected(受保护的) private(私有的)
-
用于定义类、方法(函数)、变量修饰符的关键字
abstract(抽象的) static(静态的) final(最终的) synchronized(同步的) enum(枚举)
-
用于定义类与类之间关系的关键字
extends(继承) implements(实现)
-
用于定义建立实例、引用实例及判断实例的关键字
new(建立实例) this(当前引用) super(父类引用) instanceof(判断对象类型)
-
用于异常处理的关键字
try(检查异常) catch(捕获异常) finally(最终执行) throw(抛出异常) throws(抛出异常)
-
用于包的关键字
package(创建包) import(导入包)
-
用于其它修饰的关键字
native(本地) strictfp(strict float point)(精确浮点) volatile(类型修饰符) transient(变量修饰符) assert(断言)
注:main 不是关键字,只是被虚拟机(JVM)所识别的一个名称标识。
二、标识符
- 定义:程序中自定义名称,由 26 个大小写英文字母、数字 0 ~ 9、符号 _$ 组成。
- 定义合法标识符的规则:
不允许数字开头。
-
不允许使用关键字。
注: 1. Java 中严格区分标识符的大小写。 2. 为了提高可阅读性,起名字时,要有意义。
- 名称规范:
-
包名:多个单词组成时,所有字母都小写。
例如:xxxyyyzzz
-
类/接口名:多单词组成时,所有单词的首字母大写。
例如:XxxYyyZzz
-
变量/方法(函数)名:多单词组成时,第一个单词首字母小写,第二个单词开始,每个单词首字母大写。
例如:xxxYyyZzz
-
常量名:所有字母都大写,多单词组成时,每个单词用_(下划线)连接。
例如:XXX_YYY_ZZZ
-
三、常量
定义:Java 中固定不变的、表示不能改变的值。
-
Java 中常量的分类:
1. 整数常量:所有整数。 十进制:0 ~ 9,满 10 进 1。 八进制:0 ~ 7,满 8 进 1,用 0 开头来表示。 十六进制:0 ~ 9、A ~ F,满 16 进 1,用 0x 开头来表示。 2. 小数常量:所有小数。 3. 布尔型常量:true、false。 4. 字符常量:将一个数字/字母/符号用单引号('')标识。 5. 字符串常量:将一个或者多个字符用双引号("")标识。 6. null 常量:null。
-
进制的基本转换:
-
十进制转换为二进制
例如:9 的二进制算法 9 / 2 = 4 —— 1(余数) 4 / 2 = 2 —— 0(余数) 2 / 2 = 1 —— 0(余数) 1 除不尽(最后余数) 结果要从下往上写,9 的二进制为:1001。
-
二进制转换为十进制
例如:1100 的十进制算法 2^3 × 1 + 2^2 × 1 + 2^1 × 0 + 2^0 × 0 = 12
十进制转二进制,除 2 取余数倒写;二进制转十进制,乘 2 的幂数。
十进制、八进制、十六进制的互转,类似十进制与二进制的方法;亦可先讲十进制转换为二进制,再把二进制转换为八进制或十六进制(一个八进制位相当于三个二进制位,一个十六进制位相当于四个二进制位)。
-
负数的二进制表现形式:将二进制对应的数取反,然后加 1 即可(注:负数的最高位都为 1)。
例如:-6 的二进制 6 的二进制为 0000 0000 0000 0000 0000 0000 0000 0110 取反为 1111 1111 1111 1111 1111 1111 1111 1001 加 1 后的最终结果为 1111 1111 1111 1111 1111 1111 1111 1010
-
四、变量
- 定义:内存中的一个存储空间,有自己的名称(变量名)和类型(数据类型)。
- 作用:用来存放同一类型的数据,并且可以重复使用。
- 格式:数据类型 变量名 = 初始值;
- 类型的自动提升:
-
运算中,低类型与高类型进行数据计算时,会自动将表达式中的低类型提升为高类型。
例如: byte b = 3; int c; c = b + 2;//b 会自动提示为 int 类型,再进行运算。
-
- 强制类型转换:
-
当需要进行类型数据变换时,可以进行强制转换。
例如: byte b = 3; b = b + 4;//报错 b = (byte)b + 4;//强制类型转换,强制将 b + 4 的结果转换为 byte 类型,再赋值给 b
-
五、运算符
-
算术运算符
*(乘) 例如:3 * 4 = 12; /(除) 例如:5 / 5 = 1; %(取模) 例如:5 % 5 = 0; 注:取模运算时,如果存在负数,运算结果取决于运算式左边有没有负数。 -(减) 例如:6 - 4 = 2; -(负号) 例如:i = 4; -i; -4; +(加) 例如:5 + 5 = 10; +(正号) 例如:i = 3; +i; 3; +(字符串相加) 例如:"He" + "llo" = "Hello"; 注:字符串数据和任何数据使用 + 相连接,最终都会变成字符串。 ++(自增)(前) 例如:a = 2; b = ++a; a = 3; b = 3; ++(自增)(后) 例如:a = 2; b = a++; a = 3; b = 2; --(自减)(前) 例如:a = 2; b = --a; a = 1; b = 1; --(自减)(后) 例如:a = 2; b = a--; a = 1; b = 2;
-
赋值运算符
=(等于) 例如:int i = 3; +=(加等于) 例如:int a = 3; a += 5;//等同于 a = a + 5; -=(减等于) 例如:int a = 3; a -= 5;//等同于 a = a - 5; *=(乘等于) 例如:int a = 3; a *= 5;//等同于 a = a * 5; /=(除等于) 例如:int a = 3; a /= 5;//等同于 a = a / 5; %=(模等于) 例如:int a = 3; a %= 5;//等同于 a = a % 5;
-
比较运算符
<(小于) 例如:3 < 5; true; >(大于) 例如:3 > 5; false; <=(小于等于) 例如:3 <= 5; true; >=(大于等于) 例如:3 >= 5; false; !=(不等于) 例如:3 != 5; true; ==(等等于) 例如:3 == 5; false; instanceof(检查是否为类的实例对象) 例如:"Hello" instanceof String; true; 注:比较运算符的结果都是 boolean 型,要么是 true,要么是 false。
-
逻辑运算符
概念:逻辑运算符是用于连接 boolean 类型的表达式 !(非) 例如:! true; false; 注:结果为相反 ^(异或) 例如:true ^ false; true; 注:两边相同,结果为 false; 两边不同,结果为 true。 &(与) 例如:true & false; false; 注:两边有一个为 false,结果为 false; 两边都为 true,结果为 true。 |(或) 例如:true | false; true; 注:两边有一个为 true,结果为 true; 两边都为 false,结果为 false。 &&(双与) 例如:true && false; false; 注:如果左边为 true,右边才参与运算;如果左边为 false,右边不参与运算。 ||(双或) 例如:true || false; true; 注:如果左边为 false,右边才参与运算;如果左边为 true,右边不参与运算。
-
位运算符
~(反码) 注:二进制进行取反。 ^(异或) 注:相同的二进制,结果为 0;不同的二进制,结果为 1。 &(与) 注:有 0 时,结果为 0。 |(或) 注:有 1 时,结果为 1。 <<(左移) 注:被移除的高位丢弃,空缺位都补 0。 >>(右移) 注:被移除的最高位为 0,右移后,低位丢弃,空缺位补 0;被移除的最高位为 1,右移后,低位丢弃,空缺位补 1。 >>>(无符号右移) 注:被移除的最高位无论是 0 或者是 1,空缺位都补 0。
-
三元运算符
格式:(条件表达式)? 表达式 1: 表达式 2; 注: 如果条件表达式结果为 true,执行表达式 1; 如果条件表达式结果为 false,执行表达式 2。 例如: int x = 3, y = 5, z; z = (x > y)? x : y;//x > y? 的结果为 false,执行表达式 2 z = 5;//y 的值赋给 z
-
运算符的优先级如下:
六、转义字符
-
概念:通过 \ 来转变后面字母或者字符的含义。
常用转义字符: \':单引号 \":双引号 \\:反斜杠 \b:退格 \n:换行 \r:回车 \t:制表符,相当于 tab 键
七、数组
概念:同一种数据类型的集合。也就是说,用来装数据类型的容器,被称为集合。
好处:可以自动给数组中的元素添加编号,编号从 0 开始,方便操作元素。
-
格式:
元素类型[] 数组名 = new 元素类型[元素个数或数组长度]; 例如:int[] arr = new int[3]; 元素类型[] 数组名 = new 元素类型[]{元素 1,元素 2,元素 3,…}; 例如:int[] arr = new int[]{1,2,3}; 元素类型[] 数组名 = {元素 1,元素 2,元素 3,…};(简化的静态初始化格式) 例如:int[] arr = {1,2,3}; 注:new 是用来在堆内存中产生容器实体。
-
数组是引用数据类型,内存分配如下:
注: 1. System.out.println(arr);//输出的结果为一个哈希值,也称为地址值。 2. 数组在堆内存中开辟空间后,都会有默认的初始值,各个数据类型对应各各自的初始值。如:int 默认 0。 3. 堆内存开辟空间保存数据,桟内存保存对应的哈希值,通过哈希值指引到堆内存中的数据。
-
内存初步了解:
1. 程序运行时,需要在内存中分配对应的空间。为了提高运算的效率,对内存空间进行了不同区域的划分,每一片区域都有特定的处理数据方式和内存管理方式。 2. 桟内存: 用于存储局部变量,数据使用完毕,占用空间会自动释放。 3. 堆内存: 1. 通过 new 建立的实例都存储在堆内存中。 2. 每一个实体都有内存地址值。 3. 实体中的变量都有默认初始值。 4. 实体在不被使用的时候,在不确定的时间内会被垃圾回收器回收。
-
数组操作的常见问题:
1. NullPointerException(空指针异常) 例如: int[] arr = null; System.out.println(arr[0]);//NullPointerException 注:数组的引用没有指向实体,却操作实体中的元素,就会报出 NullPointerException(空指针异常)。 2. ArrayIndexOutOfBoundsException(数组脚标越界异常) 例如: int[] arr = new int[3]; System.out.println(arr[5]);//ArrayIndexOutOfBoundsException 注: 访问了数组中不存在的脚标时,就会报出 ArrayIndexOutOfBoundsException(数组脚标越界异常)。
-
数组的常见操作:
-
排序:常见的简单排序方式有选择排序和冒泡排序。
-
选择排序:
-
冒泡排序:
-
-
查找:最常见的查找方式有折半查找(二分查找)。
-
折半查找:
-
-
进制转换:十进制转换为二进制、八进制、十六进制等。
-
-
数组中的数组:多维数组。
-
常见的二维数组
格式: 元素类型[][] 数组名 = new 元素类型[一维数组的个数][一维数组的元素个数或数组长度]; 例如:int[][] arr = new int[2][3]; arr[0][0] = 58; 说明:这种格式表示定义了名称为 arr 的二维数组。二维数组中有 2 个一维数组,每个一维数组中有 3 个元素,一维数组的名称分别是 arr[0],arr[1],并且给第一个一维数组的 0 脚标元素赋值 58。 元素类型[][] 数组名 = new 元素类型[一维数组的个数][]; 例如:int[][] arr = new int[2][]; 注:这种格式中的每一个一维数组的默认初始值都为 null。 元素类型[][] 数组名 = {{元素 1,…},{元素 1,元素 2,…},{元素 1,元素 2,元素 3,…},…};(简化的静态初始化格式) 例如:int[][] arr = {{2,3}{3,5,8},{8,10,12,15}};
-
二维数组的内存分配如下:
-
-
八、程序流程控制
- 程序流程控制也成为语句,主要有:判断结构、选择结构、循环结构。
-
判断结构(if)
1. if(条件表达式){ 执行语句; } 2. if(条件表达式){ 执行语句; }else{ 执行语句; } 3. if(条件表达式){ 执行语句; }else if(条件表达式){ 执行语句; } … else{ 执行语句; } 注: 每一种格式都是单条语句; 当第二种格式的执行语句都是有值出现的情况下,可以用三元运算符表示,简化 if else 的代码; 无论条件表达式是什么样,条件表达式的结构不是 true 就是 false。
-
选择结构(switch)
switch(条件表达式){ case 取值 1: 执行语句; break; case 取值 2: 执行语句; break; case 取值 3: 执行语句; break; … default: 执行语句; break; } 注: 取值的类型有:byte、short、int、char、enum(JDK5 以后支持)、String(JDK7 以后支持); case 与 default 没有书写顺序要求,先执行 case,如果没有匹配的 case 再执行 default; 如果匹配的 case 或者 default 没有对应的 break,程序会继续向下执行,运行可执行的语句,直到结束。 结束的两种情况: 1. 遇到 break,跳出 switch 并结束。 2. 执行到 switch 的结尾即是结束。 switch 相对于 if 有效率更高的优势,因此在符合 case 取值类型的情况下,建议优先使用 switch。
-
循环结构(for、while、do while)
for(初始化表达式;循环条件表达式;循环后的操作表达式){ 执行语句; } 注: 初始化表达式只执行一次; 循环条件表达式结果为 true,进入循环体执行语句,然后再执行循环后的操作表达式; 再次执行循环条件表达式,重复执行这个过程,直到循环条件表达式的结果为 false 为止,结束循环。 while(循环条件表达式){ 执行语句; } 注: 先判断循环条件,结果为 true 才进入循环体执行语句。 do{ 执行语句; }while(循环条件表达式); 注: 先进入循环体执行语句,再判断循环条件,结果为 true 才继续进入循环体执行语句; 无论条件是否为 true,循环体的执行语句至少都会执行一次。
-
其它流程控制语句(break、continue)
break(跳出)语句:选择结构和循环结构中使用。 continue(继续)语句:循环结构中使用。 注: 如果脱离对应的结构语句,单独使用是没有意义的; continue 语句是结束本次循环,继续进入下一次循环; break 和 continue 语句的后面不允许有其它语句,因为不会向下执行。
-
九、函数(方法)
概念:定义在类中,具有特定功能的一段独立小程序,称为函数,也称为方法。
-
格式:
修饰符 返回值类型 函数名(参数类型 形式参数 1,参数类型 形式参数 2,参数类型 形式参数 3,…){ 执行语句; return 返回值; } 说明: 返回值类型:函数运行后结果的数据类型。 参数类型:形式参数的数据类型。 形式参数:变量,用于储存调用函数时传递给函数的实际参数。 实际参数:传递给形式参数的具体数值。 return:结束函数。 返回值:返回给调用函数的调用者。 特点: 函数只有被调用才会执行; 函数的出现提高了代码的复用性; 定义函数在于可以将功能代码进行封装,以便于对该功能进行复用。 注: 函数只能调用函数,不允许在函数内部定义函数; 对于函数不需要返回值的情况,返回值类型可以使用关键字 void 表示,这样的函数中最后一行的 return 可以省略不写。
-
重载:在同一个类中,允许存在多个的同名函数,只要参数列表中的个数或者参数类型不同即可。
优势:便于阅读、优化程序。
-
使用场景:当定义的功能相同,但参与运算的未知内容不同时,此时可以定义一个函数名称以表示功能,以方便阅读,通过不同的参数列表来区分多个同名的函数。
例如: //返回两个整数的和 public int add(int x,int y){ return x+y; } //返回三个整数的和 public int add(int x,int y,int z){ return x+y+z; } //返回两个小数的和 public double add(double x,double y){ return x+y; }