Java基础程序设计主要包括Java的关键字、标识符、数据类型、运算符、流程控制和数组共六部分内容。
1. 关键字
关键字即被Java语言赋予特殊含义,用做专门用途的字符串或单词,其特点是所有字母都为小写,具体如下表所示:
关键字类别 | 关键字 |
用于定义数据类型的关键字 | class、interface、enum、byte、short、int、long、float、double、char、boolean、void |
用于定义数据类型值的关键字 | true、false、null |
用于定义流程控制的关键字 | 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 |
注意:除关键字外,Java还定义有保留字,即现有Java版本尚未使用,但以后版本可能会作为关键字使用。自己命名标记符时要避免使用保留字,如byValue、cast、future、generic、inner、operator、outer、rest、var 、goto 、const。
2. 标识符
3. 数据类型
变量即内存中的一块区域,拥有变量名和数据类型,该区域的数据可以在统一类型范围内通过赋值不断变化;变量均有初始化值,通过使用变量名来访问其所在内存中的这块区域的。注意:计算机以补码的形式存储所有的整数。
3.1 变量的分类
按数据类型划分:
- 基本数据类型:数值型(byte、short、int、long、float、double)、字符型(char)和布尔型(boolean);
- 引用数据类型:类(class,如String)、接口(interface)、数组([])。
按声明位置划分:
- 成员变量:类变量(static修饰)、实例变量(无static修饰);
- 局部变量:形参(方法签名中定义的变量)、方法局部变量、代码块局部变量;
- 异同之处:成员变量和局部变量都有生命周期,但局部变量除形参外需显式初始化。
3.2 基本数据类型
基本数据类型 | 占用存储空间 | 表数范围 | 备注 |
byte | 1字节=8bits | -128~127 | …… |
short | 2字节 | -215~215-1 | …… |
int | 4字节 | -231~231-1 | Java整型常量默认为int型 |
long | 8字节 | -263~263-1 | 声明long型常量需后加“l”或“L” |
float | 4字节 | -3.403E38~3.403E38 | 单精度浮点型:声明float型常量需后加“f”或“F”,如.512f、5.12e2f、51.2E-2等 |
double | 8字节 | -1.798E308~1.798E308 | 双精度浮点型:Java浮点型常量默认为double型;可使用科学计数法形式表示 |
char | 2字节 | 单引号括起,涵盖所有书面语字符和转义字符 | 可直接使用Unicode值表示字符常量,如’\uXXXX’,其XXXX代表十六进制整数;char类型是可以进行计算的,因其有对应的Unicode码 |
boolean | ? | true、false,无null | 与C语言不同,不可用0或非0值代表false或true |
3.3 基本数据类型转换
(1) 自动类型转换:容量小的类型自动转换为容量大的数据类型,示意图如下:
- 多种类型的数据混合运算时,系统先自动将所有数据转换成容量最大的那种数据类型,再进行计算;
- byte、short、char之间不会相互转换,其三者之前在计算时会自动转换为int类型;
- 当把任何基本类型的值和字符串值进行连接运算时(+),基本类型的值将自动转化为字符串类型。
(2) 强制类型转换:自动类型转换的逆过程,将容量大的转换为容量小的数据类型
- boolean类型不可以转换为其它的数据类型;
- 使用时要加上强制转换符“( )”,但可能造成精度降低或溢出;
- 字符串不能直接转换为基本类型,需要借助基本类型对应的包装类来实现。
4. 运算符
运算符是一种特殊的符号,用以表示数据的运算、赋值和比较等,主要包括算术运算符、赋值运算符、比较运算符、逻辑运算符、位运算符和三元运算符,具体说明如下:
运算符类型 | 具体运算符 | 注意事项 |
算术运算符 | +(正号、加、字符串连接)、-(负号、减)、*、/、%、++(自增)、- -(自减) | 取模运算结果的符号取决于被模数,且结果不一定是整数 |
赋值运算符 | =、+=、-=、*=、/=、%= | 支持连续赋值;扩展赋值运算符既能实现运算,又不会改变原有数据类型 |
比较运算符 | ==、!=、>、<、>=、<=、instanceof | 也叫关系运算符,结果为true或false |
逻辑运算符 | &(逻辑与)、|(逻辑或)、!(逻辑非)、&&(短路与)、||(短路或)、^(逻辑异或) | 注意&与&&的区别 |
位运算符 | <<(左移)、>>(右移)、>>>(无符号右移)、&(按位与)、|(按位或)、^(按位异或)、~(反码) | 防止有效位移出;可使用按位异或运算实现两个变量值的互换 |
三元运算符 | (条件表达式) ? 表达式1 : 表达式2 | 要求两个表达式的数据类型一致 |
5. 流程控制
程序流程控制 | 具体内容 | 注意事项 |
顺序结构 | 从上倒下逐行执行,中间无任何判断和跳转 | 成员变量采用合法的前向引用 |
分支结构 | if-else switch-case | 注意if条件表达式的前后顺序 switch变量的数据类型必须为byte、short、char、int、枚举或String |
循环结构 | for循环 while循环 do-while循环 | 可以实现嵌套循环 组成部分:初始化(init_statement)、循环条件(test_exp)、循环体(body_statement)、迭代(alter_statement)四部分 |
特殊流程控制 | break语句:用于终止某个语句块的执行 continue语句:用于跳出某个循环语句块的一次执行 return语句:用于结束循环,直接结束当前方法 | break语句:多层嵌套时可通过标签指明要终止哪一层语句块 continue语句:多层嵌套时可通过标签指明跳过哪一层循环 continue用于终止此次循环,而break用于终止本层循环,其之后均不能有其他语句 |
6. 数组
数组是多个相同类型数据的组合,实现对这些数据的统一管理;其中,数组中的元素可以是任何数据类型,包括基本数据类型和引用数据类型;而数组本身属于引用类型,数组型数据是对象,其中的元素相当于该对象的成员变量。
6.1 一维数组与二维数组
数组 | 一维数组 | 两维数组 | 备注 |
声明方式 | type var[] 或 type[] var | type var[][] 或 type[][] var | Java语言中声明数组时不能指定其长度,即 |
初始化 | 动态初始化: 声明并初始化数组与数组元素的赋值操作分开进行 如: 静态初始化: 声明并初始化数组与数组元素的赋值操作同时进行 如: | 动态初始化: 如
静态初始化:如
| 初始化即为数组元素分配存储空间; 数组一旦初始化,其长度是不可变的; |
引用 | 数组下角标 | 数组下角标 | 易发生空指针和数组下标越界的异常 |
遍历 | 如
|
|
6.2 数组的默认初始化值
- 对于byte、short、int、long类型的数组而言,元素的默认初始化值为0;
- 对于float、double类型的数组而言,元素的默认初始化值为0.0;
- 对于char类型的数组而言,元素的默认初始化值为空格;
- 对于boolean类型的数组而言,元素的默认初始化值为false;
- 对于引用数据类型的数组而言,元素的默认初始化值为null(注意其与0不同)。
6.3 内存的基本结构
- 栈空间(stack):存放局部变量、对象的引用;
- 堆空间(heap):new出来的东西,即新建的数组或对象;
- 方法区:存放包名、类名和方法的定义,常量池(如字符串常量池);
- 静态域:存放静态变量。
6.4 一维数组的内存结构
例如数组初始化语句int[] scores = new int[4];
的执行过程为:
- 在栈空间中,声明scores变量,用于存放对象的引用;
- 在堆空间中,创建长度为4的int型数组,其初始化值为0;
- 将创建的数组在堆空间中的首地址传递给scores变量;
- 由此,即建立起栈空间中scores变量与堆空间新建int型数组之间的关系。
6.5 数组常用算法
数组的常用算法包括数组的复制、反转和排序,排序可采用冒泡法和直接选择排序等方法;其中,java.util.Arrays类的sort()方法提供了数组元素排序的功能,如Arrays.sort(arr);
即可对arr数组的元素按从小到大的方式排序。
// 冒泡排序:从小到大
for(int i = 0; i < arr.length - 1; i++) {
for(int j = 0; j < arr.length - i; j++) {
if(arr[j] > arr[j + 1]) {
int temp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = temp;
}
}
}
// 直接选择排序:从小到大
for(int i = 0; i < arr.length; i++) {
for(int j = i + 1; j < arr.length; j++) {
if(arr[i] > arr[j]) {
int temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
}
}