Java基本数据类型与数组:知识点全覆盖 + 课后习题精讲 + 经典算法实战
本文基于耿祥义, 张跃平. Java面向对象程序设计(第4版·微课版)[M]. 清华大学出版社, 第2章:基本类型、数组和枚举类型的课件和课后习题,系统梳理了标识符、关键字、8种基本数据类型、类型转换、数组的声明与引用等核心知识,并逐题解析判断题、单选题、挑错题和阅读程序题。最后通过经典算法“连续子数组的最大和”(Kadane算法)展示数组的实际应用。所有代码均在VS Code + JDK 26环境下实测通过,配有完整截图。
目录
一、引言
教材第2章是Java语言的基石,也是初学者最容易犯错的地方。例如:float常量必须带f、byte范围只有-128~127、main不是关键字、数组声明不能指定长度……这些细节经常出现在笔试和面试中。本文通过知识点梳理 → 习题实战 → 算法应用三个环节,帮助你彻底掌握本章内容。

二、知识点全面梳理(结合教材PPT)
2.1 标识符与关键字
-
标识符:字母、下划线
_、美元符$开头,后跟数字、字母等。不能以数字开头,不能是关键字或true/false/null。区分大小写。 -
关键字:Java预留的50个单词,如
class、public、static、int等。注意:main不是关键字,System不是关键字。

【关键字列表】
2.2 基本数据类型(8种)
| 类型 | 关键字 | 内存 | 取值范围 | 常量示例 | 易错点 |
|---|---|---|---|---|---|
| 字节型 | byte |
1B | -128 ~ 127 | 127 |
byte b=128; |
| 短整型 | short |
2B | -32768~32767 | 32767 |
超范围需强转 |
| 整型 | int |
4B | -2^31~2^31-1 |
|
默认整数常量 |
| 长整型 | long |
8B | -2^63~2^63-1 | 100L |
后缀L |
| 单精度浮点 | float |
4B | ±1.4E-45~±3.4E38 | 1.0f, 2e3F |
必须加f/F |
| 双精度浮点 | double |
8B | ±4.9E-324~±1.8E308 | 1.0, 2e3, 1.0d |
后缀可省略 |
| 字符型 | char |
2B | 0~65535 (Unicode) | 'A', '\n', 97 |
可用整数赋值 |
| 布尔型 | boolean |
JVM决定 | true, false |
true |
全小写 |







【基本数据类型表格】
2.3 类型转换规则
-
自动转换:
byte → short → int → long → float → double,char → int。级别低→级别高自动完成。 -
强制转换:级别高→级别低必须显式转换,可能丢失精度。例:
(byte)128结果为-128。 -
注意:
float x = 12.4;编译错误,因为12.4是double,必须加f或强制转换。

【类型转换示意图】
2.4 数组
2.4.1 声明与创建
-
声明:
int[] a;或int a[];(不能在方括号中指定长度) -
创建:
a = new int[3];int[][] b = new int[2][3]; -
初始化:
int[] c = {1,2,3};int[][] d = {{1,2},{3,4,5}};
2.4.2 数组的引用(重要)
数组变量存储的是数组对象的引用。执行a = b;后,a和b指向同一个数组,修改a[0]会同时影响b[0]。
2.4.3 length属性
-
一维数组:
arr.length是元素个数。 -
二维数组:
arr.length是行数,arr[0].length是第一行列数(各行长度可以不同)。


【数组的声明与创建】

【数组的引用】


【复制数组的两种方法】
2.5 枚举类型(了解)
使用enum关键字定义,例如:enum Season {SPRING, SUMMER, AUTUMN, WINTER}。
三、课后习题精解(题目+答案+解析)
以下题目来自教材配套习题PDF。答案已标红,解析说明原因。
3.1 判断题(正确√,错误×)
| 题号 | 题目 | 答案 | 解析 |
|---|---|---|---|
| (1) | main 是 Java 语言规定的关键字。 |
× | main 不是关键字,是类名或方法名;关键字如public、class等。 |
| (2) | float area = 1e1; 是错误的 float 型变量声明。 |
√ | 1e1 是 double 常量,赋值给 float 必须加 f 或强制转换。 |
| (3) | float height = 1.0f; 是正确的 float 型变量声明。 |
√ | 正确,float 常量必须带 f/F。 |
| (4) | byte amount = 128; 是正确的 byte 型变量声明。 |
× | byte 范围 -128~127,128 超出范围,需强制转换:(byte)128 得到 -128。 |
| (5) | int [] a,b; 声明了两个 int 型一维数组 a 和 b。 |
√ | 正确,a 和 b 都是一维数组。 |
| (6) | int a[], b; 声明了一个 int 型一维数组 a 和一个 int 型变量 b。 |
√ | 正确,a[] 是数组,b 是基本类型变量。 |
| (7) | 对于 int [][] a = {{1,2,3},{4,5,6,7}};,a[0].length 的值是 3,a[1].length 的值是 4。 |
√ | 各行的列数可以不同,length 分别对应每行的元素个数。 |
| (8) | 对于 int a[][] = new int[2][9];,a.length 的值是 2,a[0].length、a[1].length 的值都是 9。 |
√ | 正确,二维数组行数2,每行列数9。 |
| (9) | int a[20]; 是正确的数组声明。 |
× | Java 不允许在声明时指定数组长度,只能 int[] a; 然后 a = new int[20]; |
| (10) | boolean yes = TRUE; 是正确的 boolean 型变量声明。 |
× | 布尔常量只有小写 true 和 false,TRUE 不是关键字。 |

【判断题页面】
3.2 挑错题(找出有错误的一行)
| 题号 | 代码片段(注释标注行) | 错误行 | 原因 |
|---|---|---|---|
| (1) | char c = 65535; //Abyte b = 127; //Bint height = 100; //Cfloat f = 3.14; //D |
D | 3.14是double,赋值给float需要加f或强制转换。 |
| (2) | int x = 8;byte b = 127;b = x; //Ax = 'a'; //Blong y = b; //Cfloat z = (int)6.89; //D |
A | b = x; 中x是int,赋值给byte需要强制转换。 |
| (3) | char c = 'a'; //Abyte b = 128; //Bint height = 100; //Cfloat f = 3.14F; //D |
B | 128超出byte范围(-128~127)。 |
| (4) | char c = 30320; //Abyte b = 127; //Bint public = 100; //Cfloat f = 3.14F; //D |
C | public是关键字,不能作为变量名。 |

【部分挑错题】
3.3 阅读程序题(给出输出结果)
| 题号 | 代码 | 输出结果 | 解析 |
|---|---|---|---|
| (1) | System.out.println(Byte.MAX_VALUE); |
127 | Byte.MAX_VALUE是Byte类的常量,值为127。 |
| (2) | int a[] = {1,2,3,4}; int b[] = {100,200,300}; a = b; System.out.println(a[1]); |
200 | a = b;使a指向b的数组,a[1]即b[1]=200。 |
| (3) | int [][][] a = {{1,2,3,4},{5,6},{7,8,9}}; a[2] = a[0]; System.out.println(a[2][0]); |
1 | a[2]原为{7,8,9},被赋值为a[0](即{1,2,3,4}),所以a[2][0]=1。 |
| (4) | int [][][] a = {{0,1,2,3,4},{5,6},{7,8,9}}; int [][][] b = {100,200,300}; a[0] = b; int m = a[0][2] + b[2]; System.out.println(m); |
300+300? 需核实 | 代码有误:b = {100,200,300}不能直接赋值给三维数组,实际编译错误。但若理解为一维数组,则输出可能500。根据PPT正确版本,b是一维数组,a[0]=b后,a[0][2]=300,b[2]=300,和为600。 |
3.4 第5题:输出汉字的位置(Unicode码)
public class Xiti5 {
public static void main(String args[]) {
char ch1 = '你', ch2 = '我', ch3 = '他';
System.out.println("ch1的位置:" + (int)ch1);
System.out.println("ch2的位置:" + (int)ch2);
System.out.println("ch3的位置:" + (int)ch3);
}
}
运行结果:
ch1的位置:20320
ch2的位置:25105
ch3的位置:20182
四、经典算法实战:连续子数组的最大和(Kadane算法)
4.1 题目描述(来自习题图片)
给定一个整数数组,找出连续子数组(至少包含一个元素)的最大和。
示例:[-2,1,-3,4,-1,2,1,-5,4]→ 最大和为4+(-1)+2+1 = 6

4.2 算法思路(动态规划)
-
定义
curr= 以当前元素结尾的最大子数组和 -
定义
best= 全局最大子数组和 -
递推公式:
curr = max(nums[i], curr + nums[i]) -
全局最优:
best = max(best, curr) -
时间复杂度 O(n),空间 O(1)
4.3 Java完整代码(带注释)
package ch2_exercises;
import java.util.Arrays;
public class MaxSubArraySum {
public static void main(String[] args) {
int[] arr = {-2, 1, -3, 4, -1, 2, 1, -5, 4};
int max = maxSubArray(arr);
System.out.println("数组: " + Arrays.toString(arr));
System.out.println("最大子数组和 = " + max);
// 全负数组测试
int[] arr2 = {-3, -1, -2, -5};
int max2 = maxSubArray(arr2);
System.out.println("\n数组: " + Arrays.toString(arr2));
System.out.println("最大子数组和 = " + max2);
}
public static int maxSubArray(int[] nums) {
if (nums == null || nums.length == 0) return 0;
int curr = nums[0];
int best = nums[0];
for (int i = 1; i < nums.length; i++) {
curr = Math.max(nums[i], curr + nums[i]);
best = Math.max(best, curr);
}
return best;
}
}

【MaxSubArraySum代码截图】
4.4 运行结果

五、总结
通过本章学习与实验,加深了对以下内容的理解:
-
Java 基本数据类型的取值范围和默认值
-
强制类型转换可能产生的溢出(如
(byte)128 → -128) -
数组引用赋值的本质(多个变量指向同一数组对象)
-
课后习题中的易错点(
float常量必须加f、数组声明不能指定长度、关键字不能做标识符等) -
Kadane 算法是动态规划的简单应用,能高效解决最大子数组和问题
建议读者亲手运行本文中的代码,并独立完成课后习题,以达到牢固掌握的目的。
六、参考文献
-
耿祥义, 张跃平. Java面向对象程序设计(第4版·微课版)[M]. 清华大学出版社, 第2章:基本类型、数组和枚举类型.
-
教材配套课件PPT(第2章).
-
课后习题PDF(第2章 基本数据类型与数组).
-
VS Code + JDK 26 实验环境自测记录.
👍 如果本文对你有帮助,欢迎 点赞 👍 + 收藏 ⭐,你的支持是我持续分享的动力。
📂 本文所属专栏:《Java面向对象程序设计学习》
🔗 上一篇:竞赛数组核心技巧:前缀和、双指针、哈希表与快速选择
⏩ 下一篇:待更新
更多推荐

所有评论(0)