本文基于耿祥义, 张跃平. Java面向对象程序设计(第4版·微课版)[M]. 清华大学出版社, 第2章:基本类型、数组和枚举类型的课件和课后习题,系统梳理了标识符、关键字、8种基本数据类型、类型转换、数组的声明与引用等核心知识,并逐题解析判断题、单选题、挑错题和阅读程序题。最后通过经典算法“连续子数组的最大和”(Kadane算法)展示数组的实际应用。所有代码均在VS Code + JDK 26环境下实测通过,配有完整截图。

目录

一、引言

二、知识点全面梳理(结合教材PPT)

2.1 标识符与关键字

2.2 基本数据类型(8种)

2.3 类型转换规则

2.4 数组

2.4.1 声明与创建

2.4.2 数组的引用(重要)

2.4.3 length属性

2.5 枚举类型(了解)

三、课后习题精解(题目+答案+解析)

3.1 判断题(正确√,错误×)

3.2 挑错题(找出有错误的一行)

3.3 阅读程序题(给出输出结果)

3.4 第5题:输出汉字的位置(Unicode码)

四、经典算法实战:连续子数组的最大和(Kadane算法)

4.1 题目描述(来自习题图片)

4.2 算法思路(动态规划)

4.3 Java完整代码(带注释)

4.4 运行结果

五、总结

六、参考文献


一、引言

教材第2章是Java语言的基石,也是初学者最容易犯错的地方。例如:float常量必须带fbyte范围只有-128~127、main不是关键字、数组声明不能指定长度……这些细节经常出现在笔试和面试中。本文通过知识点梳理 → 习题实战 → 算法应用三个环节,帮助你彻底掌握本章内容。


二、知识点全面梳理(结合教材PPT)

2.1 标识符与关键字

  • 标识符:字母、下划线_、美元符$开头,后跟数字、字母等。不能以数字开头,不能是关键字或true/false/null。区分大小写。

  • 关键字:Java预留的50个单词,如classpublicstaticint等。注意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

100077(八进制), 

0x3A(十六进制)

默认整数常量
长整型 long 8B -2^63~2^63-1 100L 后缀L
单精度浮点 float 4B ±1.4E-45~±3.4E38 1.0f2e3F 必须加f/F
双精度浮点 double 8B ±4.9E-324~±1.8E308 1.02e31.0d 后缀可省略
字符型 char 2B 0~65535 (Unicode) 'A''\n'97 可用整数赋值
布尔型 boolean JVM决定 truefalse true 全小写

【基本数据类型表格】

2.3 类型转换规则

  • 自动转换byte → short → int → long → float → doublechar → 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 不是关键字,是类名或方法名;关键字如publicclass等。
(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].lengtha[1].length 的值都是 9。 正确,二维数组行数2,每行列数9。
(9) int a[20]; 是正确的数组声明。 × Java 不允许在声明时指定数组长度,只能 int[] a; 然后 a = new int[20];
(10) boolean yes = TRUE; 是正确的 boolean 型变量声明。 × 布尔常量只有小写 true 和 falseTRUE 不是关键字。

【判断题页面】

3.2 挑错题(找出有错误的一行)

题号 代码片段(注释标注行) 错误行 原因
(1) char c = 65535; //A
byte b = 127; //B
int height = 100; //C
float f = 3.14; //D
D 3.14是double,赋值给float需要加f或强制转换。
(2) int x = 8;
byte b = 127;
b = x; //A
x = 'a'; //B
long y = b; //C
float z = (int)6.89; //D
A b = x; 中x是int,赋值给byte需要强制转换。
(3) char c = 'a'; //A
byte b = 128; //B
int height = 100; //C
float f = 3.14F; //D
B 128超出byte范围(-128~127)。
(4) char c = 30320; //A
byte b = 127; //B
int public = 100; //C
float 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]=300b[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 算法是动态规划的简单应用,能高效解决最大子数组和问题

建议读者亲手运行本文中的代码,并独立完成课后习题,以达到牢固掌握的目的。


六、参考文献

  1. 耿祥义, 张跃平. Java面向对象程序设计(第4版·微课版)[M]. 清华大学出版社, 第2章:基本类型、数组和枚举类型.

  2. 教材配套课件PPT(第2章).

  3. 课后习题PDF(第2章 基本数据类型与数组).

  4. VS Code + JDK 26 实验环境自测记录.

👍 如果本文对你有帮助,欢迎 点赞 👍 + 收藏 ⭐,你的支持是我持续分享的动力。

📂 本文所属专栏:《Java面向对象程序设计学习》
🔗 上一篇:竞赛数组核心技巧:前缀和、双指针、哈希表与快速选择
⏩ 下一篇:待更新

更多推荐