java.lang.Thread
java.lang.Object
1. (单选题) Java语言中的数组用于保存一组相同相同数据类型的元素。以下为数组分配空间或赋值的语句错误的是( )。
A int [] ABC = new int[4]{1,2,3,4};
B int[] ABC={1,2,3,4};
C int[] C=new int [4];
D int [] ABC=new [] {1,2,3,4};
答案:A
核心原因解析
Java 数组的初始化语法有严格规则,错误的核心在于:使用
new 类型[长度]显式指定数组长度时,不能同时在大括号中直接赋值。下面逐一分析每个选项:1. 选项 A(错误)
int [] ABC = new int[4]{1,2,3,4};错误原因:Java 数组初始化分为「静态初始化」和「动态初始化」,二者不能混合使用:
- 动态初始化:
new int[4]→ 仅指定数组长度,系统默认赋值(int 数组为 0),不能加{}赋值;- 静态初始化:
new int[]{1,2,3,4}→ 仅指定元素,系统自动推导长度,不能显式写长度[4]。该语句同时写了[4]和{1,2,3,4},违反语法规则,编译直接报错。
2. (单选题) 下列关于JDK的说法中,错误的是( )。
A 安装JDK后,还需要单独安装JRE
B JDK包括Java编译器、Java文档生成工具、Java打包工具等
C JDK是Java开发工具包的简称
D JDK是整个Java的核心
答案:A
核心原因解析
JDK(Java Development Kit)是 Java 开发工具包,其核心特征是内置了完整的 JRE(Java 运行环境),因此安装 JDK 后无需单独安装 JRE。下面逐一分析每个选项:
1. 选项 A(错误)
错误原因:JDK 的目录结构中包含完整的 JRE(如
jdk_x.x.x/jre目录),涵盖 JVM、核心类库、运行时依赖等所有 JRE 的内容。
- 仅运行 Java 程序:只需安装 JRE;
- 开发 Java 程序:安装 JDK 即可(自带 JRE,无需额外安装);⚠️ 补充:JDK 9 及以上版本取消了 JDK 目录下的独立 JRE 文件夹,但仍内置了 JRE 的核心组件,本质还是包含 JRE 运行环境。
2. 选项 B(正确)
正确原因:JDK 是 “开发工具包”,核心包含一系列开发 / 编译 / 打包工具:
javac.exe:Java 编译器(将.java 源文件编译为.class 字节码);javadoc.exe:Java 文档生成工具(根据注释生成 API 文档);jar.exe:Java 打包工具(将.class 文件打包为.jar 包);- 此外还有
java.exe(运行工具)、javap.exe(反编译工具)等。3. 选项 C(正确)
正确原因:JDK 的全称是 Java Development Kit,直译就是 “Java 开发工具包”,这是 JDK 的标准定义。
4. 选项 D(正确)
正确原因:JDK 是整个 Java 生态的核心:
- 包含开发 Java 程序的所有工具(编译器、打包工具等);
- 包含运行 Java 程序的 JRE 环境;
- 包含 Java 核心类库(
java.lang、java.util等);没有 JDK,既无法开发 Java 程序,也无法运行(除非单独装 JRE,但 JRE 本身也是 JDK 的子集)。补充:JDK、JRE、JVM 的核心关系
plaintext
JDK = JRE + 开发工具(javac、javadoc、jar等) JRE = JVM + Java核心类库(rt.jar等)
- JVM(Java 虚拟机):负责运行字节码,是跨平台的核心;
- JRE:Java 运行环境,仅用于运行已编译的 Java 程序;
- JDK:Java 开发工具包,覆盖 “开发 + 运行” 全流程。
总结
选项 A 的错误在于混淆了 JDK 和 JRE 的包含关系 ——JDK 内置 JRE,安装 JDK 后无需单独安装 JRE;其余选项均是对 JDK 的正确描述。
6. (单选题)给定如下Java代码, 编译运行时, 以下( ) 描述是正确的 。
public class Person{ | |
static int arr[] = new int [10]; | |
public static void main(String a[]){ | |
System.out.println(arr[1]); | |
} | |
} |
A 编译时正确但是运行时出错
B 输出为 null
C 编译时将发生错误
D 输出为0
答案:D
核心原因解析
本题考察 Java 数组的默认初始化规则,结合
static修饰的类变量特性,逐一拆解逻辑:1. 数组的核心特性:默认初始化
Java 中数组属于引用类型,当通过
new int[10]创建数组时,系统会为数组的每个元素分配内存并赋予默认值:
- 基本数据类型数组的默认值规则:
byte/short/int/long→0;float/double→0.0;char→'\u0000'(空字符);boolean→false;- 引用类型数组(如
String[])→null。本题中
arr是int类型数组,因此所有元素默认值为0。2.
static修饰的类变量初始化时机
static int arr[] = new int [10];是类变量(静态变量),在类加载阶段(main 方法执行前)就已完成初始化:
- 类加载时,JVM 会为
arr分配内存,创建长度为 10 的 int 数组,并将所有元素初始化为0;- main 方法中访问
arr[1](数组第二个元素)时,直接获取到默认值0。3. 逐一分析选项
- 选项 A(错误):编译和运行均无错误。数组初始化合法,访问
arr[1]未超出数组下标(数组下标范围 0-9),不会抛出ArrayIndexOutOfBoundsException。- 选项 B(错误):
null是引用类型的默认值,int是基本数据类型,数组元素默认值为0而非null。- 选项 C(错误):代码语法完全合规:
- 数组声明
static int arr[](等价于static int[] arr)是合法写法;new int[10]正确创建数组;- main 方法中
System.out.println(arr[1])访问数组元素语法无误。- 选项 D(正确):int 数组元素默认值为
0,arr[1]的值是0,因此输出0。补充:关键易错点
- 数组下标从
0开始:arr[1]是数组第二个元素,未越界;- 静态变量初始化优先级:类变量在 main 方法执行前完成初始化,无需手动赋值即可访问;
- 基本类型 vs 引用类型数组默认值:切勿混淆(如
int[]默认0,String[]默认null)。综上,代码编译运行均正常,输出结果为
0,答案为 D。
10. (单选题) 下列选项中,可以在Java虚拟机中运行的文件类型是( )。
A .jre
B. java
C .class
D .exe
答案:C
核心原因解析
Java 程序的执行分为 “编译” 和 “运行” 两个核心阶段,不同文件类型的作用和执行主体完全不同,关键区分如下:
1. 选项 A:.jre(错误)
.jre并非标准的 Java 文件后缀,JRE(Java 运行环境)是支撑 Java 程序运行的环境本身,而非可运行的文件类型,因此该选项无意义。2. 选项 B:.java(错误)
.java是 Java 源文件的后缀,存储的是人类可读的 Java 源代码(如Test.java)。
- 特点:无法直接在 JVM 中运行,必须先通过
javac编译器编译为.class文件;- 例:
javac Test.java会将Test.java编译为Test.class。3. 选项 C:.class(正确)
.class是 Java 字节码文件的后缀,是javac编译.java源文件后生成的二进制文件(存储 JVM 可识别的字节码指令)。
- 核心特性:
.class文件是 JVM 唯一能直接加载并运行的文件类型,跨平台的核心(“一次编译,到处运行” 的基础);- 运行方式:通过
java命令调用 JVM 执行,如java Test(无需写.class后缀)。4. 选项 D:.exe(错误)
.exe是 Windows 系统的可执行文件(二进制可执行程序),由操作系统直接运行,与 JVM 无关:
- Java 程序若要生成
.exe,需通过第三方工具(如 exe4j)打包,本质是封装了 JRE +.class文件,并非 JVM 直接运行.exe。补充:Java 程序执行流程(核心)
plaintext
.java 源文件 → [javac 编译] → .class 字节码文件 → [JVM 加载/执行] → 程序运行
- JVM 的核心作用是 “解释 / 编译字节码”,而非直接执行源代码或系统可执行文件;
.class文件是连接源代码和 JVM 的唯一桥梁。关键易错点
- 误区:认为
.java能直接运行 → 需先编译为.class;- 误区:认为
.exe是 Java 运行文件 →.exe是系统级可执行文件,与 JVM 无关。综上,只有
.class文件可在 Java 虚拟机中运行,答案为 C。
11. (单选题) 以下代码运行的结果是:( )
int[] nums=new int[5]; | |
nums={2,5,8,3,6}; | |
System.out.println(“数组第二个成员是:”+nums[1]); |
A 显示0
B 语法报错
C 显示2
D 显示5
答案:B
核心原因解析
本题的关键是理解 Java 数组初始化的语法规则,错误出现在数组赋值语句
nums={2,5,8,3,6};,具体分析如下:1. 数组初始化的两种合法形式
Java 中数组初始化有严格的语法限制,仅以下两种方式合法:
- 方式 1:声明时直接静态初始化
int[] nums = {2,5,8,3,6};(省略new int[],仅能在声明行使用);- 方式 2:先动态初始化,再逐个赋值
java
运行
int[] nums = new int[5]; // 动态初始化(指定长度,元素默认0) nums[0] = 2; nums[1] = 5; // ... 逐个赋值其他元素2. 错误根源:单独使用
{}赋值非法代码中先执行
int[] nums=new int[5];(创建了长度为 5 的 int 数组),随后试图通过nums={2,5,8,3,6};整体赋值 —— 这是 Java 语法不允许的:
{}这种 “数组字面量” 仅能在数组声明的同一行使用(如int[] nums = {…};);- 数组创建后(
new int[5]),无法通过数组名={…}的方式整体赋值,只能通过下标逐个赋值(nums[0]=2; nums[1]=5;等)。因此,
nums={2,5,8,3,6};这行代码会直接导致编译语法报错,程序无法运行。逐一排除其他选项
- 选项 A(显示 0):错误。若数组未赋值,元素默认值为 0,但本题因语法错误无法编译,不会执行到输出步骤;
- 选项 C(显示 2):错误。nums [1] 是数组第二个元素(下标从 0 开始),即使赋值合法,nums [1] 也应为 5,且本题根本无法通过编译;
- 选项 D(显示 5):错误。虽然 nums [1] 理论值是 5,但因语法报错,程序无法运行,不会输出任何结果。
补充:修正后的合法代码
若要实现预期逻辑,正确写法有两种:
java
运行
// 写法1:声明时静态初始化 int[] nums = {2,5,8,3,6}; System.out.println("数组第二个成员是:"+nums[1]); // 输出5 // 写法2:动态初始化后逐个赋值 int[] nums = new int[5]; nums[0] = 2; nums[1] = 5; nums[2] = 8; nums[3] = 3; nums[4] = 6; System.out.println("数组第二个成员是:"+nums[1]); // 输出5综上,原代码因语法错误无法编译运行,答案为 B。
那应该怎样快速赋值呢?
在 Java 中,数组创建后无法直接用
{}整体赋值,但有多种简洁高效的快速赋值方式,可根据场景选择,以下是最常用的方法(按简洁度 / 实用性排序):一、最简洁:声明时直接静态初始化(推荐)
这是数组赋值最简洁的方式,声明和赋值一步完成,无需单独指定长度(系统自动推导)。
语法:
// 格式1:完整写法(清晰) 数据类型[] 数组名 = new 数据类型[]{元素1, 元素2, ...}; // 格式2:简化写法(更常用) 数据类型[] 数组名 = {元素1, 元素2, ...};示例(对应你的需求):
// 两种写法等价,都能快速给长度为5的数组赋值 int[] nums = new int[]{2,5,8,3,6}; // 或简化写法 int[] nums = {2,5,8,3,6}; System.out.println("数组第二个成员是:"+nums[1]); // 输出5✅ 适用场景:创建数组时就确定所有元素值(最常用)。
二、数组创建后快速赋值:Arrays.fill ()(批量赋相同值)
如果需要给数组所有元素赋同一个值,用
java.util.Arrays工具类的fill()方法,一行代码完成。语法:
Arrays.fill(数组名, 要赋的值); // 进阶:给指定下标范围赋值(左闭右开) Arrays.fill(数组名, 起始下标, 结束下标, 要赋的值);示例:
import java.util.Arrays; public class ArrayFillDemo { public static void main(String[] args) { int[] nums = new int[5]; Arrays.fill(nums, 10); // 所有元素赋值为10 System.out.println(Arrays.toString(nums)); // 输出 [10, 10, 10, 10, 10] // 进阶:仅给下标0-2(含0,不含3)赋值为5 int[] nums2 = new int[5]; Arrays.fill(nums2, 0, 3, 5); System.out.println(Arrays.toString(nums2)); // 输出 [5, 5, 5, 0, 0] } }✅ 适用场景:数组所有 / 部分元素值相同(如初始化默认值)。
三、数组创建后快速赋值:Arrays.setAll ()(动态生成值)
如果需要按规则动态赋值(如递增、计算值),用
Arrays.setAll()方法,一行代码完成自定义赋值逻辑。语法:
java
运行
Arrays.setAll(数组名, 下标 -> 赋值表达式);示例:
java
运行
import java.util.Arrays; public class ArraySetAllDemo { public static void main(String[] args) { int[] nums = new int[5]; // 快速赋值:下标i对应值为 i*2+2(生成 2,4,6,8,10) Arrays.setAll(nums, i -> i * 2 + 2); System.out.println(Arrays.toString(nums)); // 输出 [2, 4, 6, 8, 10] // 也可直接赋值指定值(模拟你的需求) int[] nums2 = new int[5]; int[] values = {2,5,8,3,6}; // 准备好要赋的值 Arrays.setAll(nums2, i -> values[i]); // 按下标映射赋值 System.out.println(Arrays.toString(nums2)); // 输出 [2,5,8,3,6] } }✅ 适用场景:需要按规则(如下标、计算)动态赋值,或复用已有数组的值。
四、JDK9+ 新特性:List.of () 转数组(适合少量元素)
JDK9 及以上版本可通过
List.of()创建不可变列表,再转数组,适合快速给数组赋少量元素。示例:
java
运行
import java.util.List; public class ArrayFromListDemo { public static void main(String[] args) { // 快速赋值并转数组 Integer[] nums = List.of(2,5,8,3,6).toArray(new Integer[0]); System.out.println(nums[1]); // 输出5 } }✅ 适用场景:JDK9+ 环境,元素数量少且无需修改(转数组后为不可变列表的数组)。
五、传统方式:循环赋值(通用)
如果需要兼容所有 JDK 版本,或赋值逻辑复杂,用循环逐个赋值(虽然不是 “一行”,但也是高效的通用方式)。
示例:
java
运行
public class ArrayLoopDemo { public static void main(String[] args) { int[] nums = new int[5]; int[] values = {2,5,8,3,6}; // 准备好要赋的值 // 循环快速赋值 for (int i = 0; i < nums.length; i++) { nums[i] = values[i]; } System.out.println(nums[1]); // 输出5 } }✅ 适用场景:所有 JDK 版本,或赋值逻辑需要额外判断(如过滤、转换)。
总结:快速赋值的优选方案
场景 推荐方法 优点 创建数组时确定所有元素 声明时静态初始化( int[] nums = {2,5,8,3,6};)最简洁,一行完成 所有 / 部分元素值相同 Arrays.fill()批量赋值,无需循环 按规则动态赋值 / 复用已有值 Arrays.setAll()灵活,支持自定义逻辑 JDK9+、少量元素 List.of().toArray()语法简洁,可读性高 兼容所有版本 / 复杂赋值逻辑 循环赋值 通用,无版本限制 你的原需求(给
int[5]赋值{2,5,8,3,6}),最优选择是 “声明时静态初始化”(一行代码完成,无额外依赖)。
17. (单选题) 执行下面的代码会引发____异常。
String str=null;
String strTest=new String(str);
A IllegalArgumentException
B InvalidArgumentException
C NullPointerException
D ArithmeticException
步骤 1:明确核心异常的含义
先梳理选项中各异常的触发条件:
异常类型 触发场景 NullPointerException当程序尝试访问空引用(null) 的成员(方法 / 属性),或把 null传入不支持的核心方法时触发IllegalArgumentException方法接收到合法类型但非法值的参数时触发(非 null类非法值)InvalidArgumentExceptionJava无此内置异常(是其他语言 / 自定义异常的命名,干扰项) ArithmeticException算术运算错误触发(如除以 0) 步骤 2:分析代码执行逻辑
代码如下:
java
运行
String str=null; String strTest=new String(str); // 核心行
String类的构造方法public String(String original)的设计逻辑:该方法会尝试访问传入参数original的内部字符数组(original.value),而当original为null时,相当于尝试访问null引用的成员变量,直接触发NullPointerException。步骤 3:排除干扰项
- A 选项:
IllegalArgumentException是 “参数合法但值非法”(比如给substring传负数),但null不是 “合法值”,而是空引用,因此不触发;- B 选项:Java 标准库中无此异常,直接排除;
- D 选项:代码无算术运算,完全不相关,排除;
- C 选项:
str是null,传入String构造方法后,底层访问null的成员,触发空指针异常,符合逻辑。最终结论
答案是 C(NullPointerException)。
补充验证
若运行这段代码,JVM 会直接抛出如下异常(核心栈信息):
plaintext
Exception in thread "main" java.lang.NullPointerException at java.base/java.lang.String.<init>(String.java:178) at 你的类名.main(你的类名.java:行号)完全印证了
NullPointerException的触发结果。
21. (单选题) 以下哪个关键字用来定义成员常量( ) 。
A finalize
B final
C finally
D const
要解决这个问题,核心是区分 Java 中
final/finally/finalize/const的语义和用途,尤其是 “成员常量” 的定义关键字。步骤 1:梳理各关键字的核心含义
关键字 用途与语义 final① 修饰变量:变为常量(赋值后不可修改);② 修饰类:不可被继承;③ 修饰方法:不可被重写。✅ 定义成员常量的核心关键字。 finally仅用于 try-catch-finally异常处理结构,声明最终执行的代码块(无论是否抛异常都会执行),与 “常量” 无关。finalize是 Object类的一个方法(protected void finalize()),用于对象被垃圾回收前的收尾操作,不是关键字,也与常量无关。constJava 中保留关键字(预留但未实现),仅标记为 “保留”,不能实际使用(C++ 中用 const定义常量,但 Java 不支持)。步骤 2:逐一排除选项
- A 选项
finalize:是方法名,不是关键字,排除;- C 选项
finally:用于异常处理的代码块,与常量无关,排除;- D 选项
const:仅为保留关键字,无法实际定义常量,排除;- B 选项
final:是 Java 中唯一能定义成员常量的关键字(如public final int MAX_NUM = 100;),正确。补充示例(成员常量的定义)
java
运行
public class ConstantDemo { // 用final定义成员常量(命名规范:全大写,下划线分隔) public final int MAX_SCORE = 100; // 实例常量 public static final double PI = 3.14159; // 静态常量(类常量) }上述代码中,
MAX_SCORE和PI被final修饰后,赋值后无法修改,符合 “成员常量” 的定义。最终结论
答案是 B(final)。
22. (单选题) 对下面哪个类定义,可以通过“new J_Class()”生成J_Class的实例对象( )。
A public class J_Class{
public void J_Class(){}
public J_Class(String s){}
}
B public class J_Class{
public J_Class(String s){}
}
C public abstract class J_Class{
public J_Class(){}
}
D public class J_Class{}
答案:D
核心原因解析
本题考察 Java 类实例化的核心规则:通过
new 类名()创建实例的前提是「类有可访问的无参构造方法」,且类不是抽象类。下面逐一分析每个选项:1. 选项 A(错误)
java
运行
public class J_Class{ public void J_Class(){} // 这是普通方法,不是构造方法! public J_Class(String s){} // 带参构造方法 }错误原因:
- 构造方法的核心特征:无返回值类型(连 void 都不能写)、方法名与类名完全一致;
- 此处
public void J_Class(){}因写了void,是普通方法而非构造方法;- 类中仅显式定义了带参构造
J_Class(String s),编译器不会自动生成无参构造;- 因此调用
new J_Class()时,无可用的无参构造方法,编译报错。2. 选项 B(错误)
java
运行
public class J_Class{ public J_Class(String s){} // 仅显式定义带参构造 }错误原因:
- Java 编译器默认给类生成无参构造的前提是「类中没有显式定义任何构造方法」;
- 此类显式定义了带参构造
J_Class(String s),编译器不再生成无参构造;- 调用
new J_Class()时,无匹配的无参构造,编译报错(仅能通过new J_Class("xxx")实例化)。3. 选项 C(错误)
java
运行
public abstract class J_Class{ public J_Class(){} // 无参构造存在,但类是抽象类 }错误原因:
abstract(抽象类)的核心特性是「不能被实例化」,即使有无参构造方法,也无法通过new J_Class()创建实例;- 抽象类的作用是被继承,只能通过实例化其子类来间接使用。
4. 选项 D(正确)
java
运行
public class J_Class{} // 无显式构造方法正确原因:
- 类中未显式定义任何构造方法,Java 编译器会自动为其生成「默认的无参构造方法」(隐式、public、空实现);
- 类不是抽象类,且无参构造可访问,因此
new J_Class()能正常创建实例。补充:Java 构造方法的核心规则
规则要点 说明 无参构造的生成 类中无任何显式构造 → 编译器自动生成默认无参构造;类中有显式构造(无论带参 / 无参)→ 编译器不再生成默认无参构造 构造方法特征 无返回值类型(无 void)、方法名 = 类名、可重载(多个构造方法) 抽象类限制 抽象类不能被实例化,即使有构造方法(构造方法供子类调用) 关键易错点
- 误区:把
void J_Class(){}当成构造方法 → 构造方法绝对不能写返回值类型;- 误区:只要类有构造方法就能
new()→ 需匹配调用的构造参数(new J_Class()要求无参构造);- 抽象类即使有构造方法,也无法直接实例化。
综上,只有选项 D 满足「非抽象类 + 有默认无参构造」,可通过
new J_Class()创建实例。
那么这个时候就有吴彦祖问了如果把c中的抽象去掉的呢?
如果把选项 C 中的
abstract关键字去掉,该选项就正确了,具体分析如下:修正后的选项 C 代码
java
运行
public class J_Class{ public J_Class(){} // 显式定义的无参构造方法 }修正后可通过
new J_Class()实例化的核心原因
- 类的类型合法:去掉
abstract后,J_Class变为普通类(非抽象类),普通类允许通过new直接实例化;- 构造方法匹配:类中显式定义了
public J_Class()无参构造方法,完全匹配new J_Class()的调用形式(无参构造调用);- 访问权限合规:构造方法是
public,外部可正常访问,无权限限制。补充对比:修正前后的核心差异
状态 是否可 new J_Class()核心原因 原选项 C(含 abstract) ❌ 不可 抽象类禁止直接实例化 修正后(去掉 abstract) ✅ 可以 普通类 + 显式无参构造,匹配调用 关键注意点
- 显式定义的无参构造 和 编译器自动生成的默认无参构造,效果完全一致(都支持
new J_Class());- 只要类是普通类(非抽象、非接口),且有可访问的无参构造(显式 / 默认),就能通过
new 类名()实例化。综上,去掉选项 C 的
abstract后,该类满足 “普通类 + 无参构造” 的核心条件,new J_Class()可以正常生成实例对象。
方法重载
23. (单选题) 下面的方法重载,正确的是( )。
A
float fun(int a,float b){ }
float fun(int x,float y){ }
B
float fun1(int a,float b){ }
float fun2(int a,float b){ }
C
int fun(int a,float b){ }
float fun(int a,float b){ }
D
float fun(float a){ }
float fun(float a,float b){ }
答案:D
核心原因解析
本题考察 Java 方法重载(Overload)的核心规则:
在同一个类中,方法名相同,但参数列表不同(参数个数、类型、顺序至少其一不同),与返回值类型、参数名无关。
下面逐一分析每个选项:
1. 选项 A(错误)
java
运行
float fun(int a,float b){ } float fun(int x,float y){ }错误原因:仅参数名(
a/x、b/y)不同,参数列表(int + float)完全一致 —— 方法重载要求参数列表 “实质不同”,参数名只是标识符,不影响重载判定,因此编译报错(重复定义方法)。2. 选项 B(错误)
java
运行
float fun1(int a,float b){ } float fun2(int a,float b){ }错误原因:方法名(
fun1vsfun2)不同 —— 方法重载的前提是 “方法名相同”,此为两个不同名的普通方法,并非重载。3. 选项 C(错误)
java
运行
int fun(int a,float b){ } float fun(int a,float b){ }错误原因:仅返回值类型(
intvsfloat)不同,参数列表完全一致 —— Java 不允许 “仅返回值不同” 的方法重载(JVM 无法通过调用上下文区分,如fun(1, 1.0f)无法确定调用哪个方法),编译报错。4. 选项 D(正确)
java
运行
float fun(float a){ } float fun(float a,float b){ }正确原因:方法名相同(
fun),参数列表个数不同(1 个参数 vs 2 个参数)—— 符合方法重载的核心规则,是合法的重载。补充:方法重载的完整判定规则
判定维度 是否影响重载 示例说明 方法名 必须相同 fun()和fun(int a)是重载;fun()和fun1()不是参数个数 影响 fun(float a)和fun(float a, float b)是重载参数类型 影响 fun(int a)和fun(float a)是重载参数顺序 影响 fun(int a, float b)和fun(float a, int b)是重载参数名 不影响 fun(int a)和fun(int x)不是重载返回值类型 不影响 int fun()和float fun()不是重载访问修饰符 不影响 public fun()和private fun()不是重载(仅参数列表相同时)关键易错点
- 误区 1:认为 “参数名不同” 就是重载 → 参数名无实质意义,仅参数列表(个数 / 类型 / 顺序)才有效;
- 误区 2:认为 “返回值不同” 可构成重载 → Java 编译期仅通过参数列表判定方法唯一性,返回值不参与;
- 误区 3:认为 “方法名不同但参数相同” 是重载 → 重载的核心是 “同名不同参”。
综上,只有选项 D 符合方法重载的规则,是正确答案。
25. (单选题) 编写出下面代码段的运行结果( )。
boolean flag = false; | |
if (flag = true) { | |
System.out.println("true"); | |
} else { | |
System.out.println("false"); | |
} |
A true
B 没有信息输出
C false
D出错
答案:A
核心原因解析
本题的关键是区分「赋值运算符
=」和「相等判断运算符==」,这是 Java 条件判断中最常见的易错点:1. 核心语法辨析
==:相等判断运算符,用于判断左右两边的值是否相等,返回boolean类型结果;=:赋值运算符,用于将右边的值赋给左边的变量,表达式本身的结果就是赋值后变量的值。2. 代码执行流程拆解
java
运行
boolean flag = false; if (flag = true) { // 重点:这里是赋值,不是判断! System.out.println("true"); } else { System.out.println("false"); }步骤 1:初始化
flag = false;步骤 2:执行if (flag = true):
- 先执行赋值操作:将
true赋给flag,此时flag的值变为true;- 赋值表达式
flag = true的结果就是赋值后的值(true);步骤 3:if条件判定为true,进入if分支,执行System.out.println("true");最终输出:true。3. 逐一排除其他选项
- 选项 B(没有信息输出):错误。
if/else分支必然执行其一,不可能无输出;- 选项 C(false):错误。若误将
flag = true当成flag == true,会认为条件是false == true(结果false),但实际是赋值操作;- 选项 D(出错):错误。代码语法完全合规(赋值表达式的结果是
boolean类型,可作为if条件),编译和运行均无错误。关键易错点总结
- 误区:把
if (flag = true)误读为if (flag == true)—— 前者是 “赋值后判断表达式结果”,后者是 “判断值是否相等”;- 扩展:若代码是
if (flag == true),则条件为false == true,会输出false;但本题是赋值运算符,结果完全不同;- 语法规则:Java 允许
boolean类型的赋值表达式直接作为if条件(因为表达式结果是boolean),这是合法语法(但业务中应避免,易混淆)。综上,代码运行结果为输出
true,答案为 A。
26. (单选题) 选出以下定义合法的标识符 。
A 2ac
B $abc
C #3c
D float
第 26 题解答
标识符定义规则
编程语言中(以 Java/C/C++ 等主流语言为例),合法标识符需满足:
- 由字母(A-Z/a-z)、数字(0-9)、下划线(_)、美元符($)组成;
- 不能以数字开头;
- 不能是语言的关键字 / 保留字;
- 区分大小写(本题不涉及)。
选项分析
- A:2ac → 以数字开头,违反规则 2,不合法;
- **B:以开头,后续为字母,符合所有规则,合法;
- C:#3c → 包含非法字符
#,违反规则 1,不合法;- D:float → 是编程语言的关键字(浮点型),违反规则 3,不合法。
答案:B
40. (单选题)下列JAVA代码运行的结果是( )。
int[] my_Array; | |
my_Array=new int[5]; | |
for(int count=0;count<=5;count++) | |
System.out.println(my_Array[count]); |
A
将0,1,2,3,4,5输出到屏幕
B
将1,2,3,4,5输出到屏幕
C
将0,1,2,3,4输出到屏幕
D
其它都不是
答案:D
核心原因解析
本题考察 Java 数组的索引规则 +
for循环的边界问题,核心错误是「数组索引越界异常」,具体分析如下:步骤 1:明确数组的基本特征
- 数组定义:
my_Array=new int[5]→ 数组长度为 5,索引范围是0~4(Java 数组索引从 0 开始,长度为 n 的数组,最大索引为 n-1);- 数组初始化:
int类型数组的默认值为0,因此my_Array[0]~my_Array[4]的值都是0。步骤 2:分析
for循环的执行逻辑循环条件:
int count=0;count<=5;count++→ 循环变量count会依次取0,1,2,3,4,5,共 6 次循环:
- 前 5 次循环(
count=0~4):访问my_Array[0]~my_Array[4],均为合法索引,会输出0;- 第 6 次循环(
count=5):访问my_Array[5]→ 超出数组索引范围(最大索引为 4),触发 ArrayIndexOutOfBoundsException(数组索引越界异常),程序崩溃。步骤 3:逐一排除选项
- 选项 A(输出 0,1,2,3,4,5):错误。数组元素默认值是 0,且索引 5 越界,既不会输出 1~5,也无法执行完循环;
- 选项 B(输出 1,2,3,4,5):错误。数组元素无 1~5 的值,且索引越界导致程序崩溃;
- 选项 C(输出 0,1,2,3,4):错误。前 5 次循环输出的是 5 个
0(而非 0~4),且第 6 次循环会触发异常,程序无法正常输出完 5 个 0 就崩溃;- 选项 D(其它都不是):正确。因为程序会抛出数组索引越界异常,既不会按 A/B/C 的方式输出,也无法正常执行完成。
补充:关键易错点
- 数组索引规则:长度为 n 的数组,索引范围是
0 ~ n-1,这是 Java 数组的核心规则,越界会直接抛出运行时异常;- int 数组默认值:
int类型数组未显式赋值时,每个元素的默认值为0,而非 1 或其他数值;- 循环边界:本题循环条件
count<=5是典型错误,正确的循环条件应为count<5(避免越界)。扩展:修正后的代码与输出
若将循环条件改为
count<5,则循环执行 5 次,输出 5 个0(0 0 0 0 0),但选项中无此答案,因此仍选 D。综上,程序会触发数组索引越界异常,A/B/C 的描述均不成立,答案为 D。
43. (单选题) 下面 Java 代码片段创建 ( )个对象?
int a=10; | |
int[] a=new int[]{1,2,3}; | |
String c=new String("abc"); | |
MyTest test=new MyTest(); |
A 1
B 3
C 4
D 2
答案:B
核心原因解析
本题考察 Java 中 “对象” 的定义 ——只有通过
new创建的引用类型实例才是对象,基本数据类型(如int)的变量并非对象,逐一分析代码行:步骤 1:逐行拆解代码,判断是否创建对象
代码行 是否创建对象 原因说明 int a=10;❌ 否 int是基本数据类型,变量a仅存储数值10,无对象创建(基本类型无 “对象” 概念);int[] a=new int[]{1,2,3};✅ 是 数组是 Java 中的引用类型, new int[]{1,2,3}会在堆内存创建数组对象;String c=new String("abc");✅ 是 new String("abc")显式创建String 对象(注意:若仅写"abc"是字符串常量,但new会创建新对象);MyTest test=new MyTest();✅ 是 new MyTest()创建自定义类MyTest的实例对象;步骤 2:统计对象数量
上述代码中,通过
new创建的对象共 3 个:数组对象、String 对象、MyTest 对象。逐一排除其他选项
- 选项 A(1):错误。仅统计了其中 1 个对象,忽略了数组 / String/MyTest 中的另外两个;
- 选项 C(4):错误。误将基本类型
int a=10也算作对象,基本类型无对象概念;- 选项 D(2):错误。漏统计了数组对象 / String 对象 / MyTest 对象中的某一个;
- 选项 B(3):正确。仅引用类型的
new操作创建对象,共 3 个。补充:关键规则总结
- 对象的判定标准:
- 引用类型(数组、类、接口、String 等)通过
new创建的实例 = 对象;- 基本数据类型(int/byte/short/long/float/double/char/boolean)的变量 = 数值 / 字符,不是对象;
- 特殊说明:
String特殊:"abc"是字符串常量(存储在常量池),new String("abc")会在堆内存创建新的 String 对象(与常量池无关),本题中new String("abc")明确创建 1 个对象;- 数组是引用类型:无论基本类型数组(
int[])还是引用类型数组(String[]),new数组时都会创建数组对象。易错点提醒
- 误区:认为 “所有变量都是对象”→ 基本类型变量仅存储值,无对象头、无堆内存分配,不是对象;
- 误区:忽略数组是对象 → Java 中数组是特殊的引用类型,
new数组必然创建对象;- 注意:本题中
int a=10重复定义变量名(与int[] a重名),属于语法错误,但题目仅问 “创建多少对象”,不影响对象数量统计(核心考点是对象判定)。综上,代码共创建 3 个对象,答案为 B。
47. (单选题)编译和执行下例代码会输出什么?
int i=10; | |
switch (i){ | |
default: | |
System.out.print("default,"); | |
case 0: | |
System.out.print("zero,"); | |
break; | |
case 1: | |
System.out.print("one,"); | |
break; | |
case 2: | |
System.out.print("two,"); | |
break; | |
} |
A
default,
B
zero,one,two,default,
C
default,zero,
D
one,
答案:C
核心原因解析
本题考察
switch-case语句的核心规则:default 分支的执行逻辑 + case 穿透(break 终止),拆解执行流程如下:步骤 1:初始化与 switch 匹配
变量
i=10,进入switch(i)后,依次匹配case 0、case 1、case 2—— 均不匹配,因此执行default分支。步骤 2:default 分支执行(无 break 触发穿透)
default分支代码:System.out.print("default,");→ 输出default,;default分支后无 break 语句,触发switch的 “穿透规则”:执行完default后,会继续执行后续的case分支(而非终止)。步骤 3:穿透执行 case 0 分支
- 执行
case 0分支代码:System.out.print("zero,");→ 输出zero,;case 0分支后有break语句,触发终止,switch执行完毕。步骤 4:最终输出结果
两次输出拼接为
default,zero,,对应选项 C。逐一排除其他选项
- 选项 A(default,):错误。忽略了
default无 break 导致的穿透,漏算了case 0的输出;- 选项 B(zero,one,two,default,):错误。
switch先匹配不到 case 才执行 default,且 case 0 有 break,不会执行 case 1/2;- 选项 D(one,):错误。i=10 不匹配 case 1,无任何执行逻辑。
补充:switch 核心规则总结
- default 执行时机:所有 case 都不匹配时执行(位置不影响,即使写在最前面,也会先判断 case 再执行 default);
- 穿透规则:分支后无
break,会按顺序执行后续所有分支,直到遇到break或 switch 结束;- default 位置:可写在 switch 任意位置(如最前、中间、最后),但执行逻辑不变(先匹配 case,再执行 default)。
易错点提醒
- 误区:认为
default执行后 switch 就终止 → 只有break能终止 switch,default 无 break 会穿透;- 误区:认为
default必须写在最后 → 位置不影响执行逻辑,仅代码可读性差异。综上,代码执行后输出
default,zero,,答案为 C。
49. (单选题) 下列选项中对static的描述错误的是( )。
A
static关键字可以修饰成员变量和局部变量
B
静态方法只能访问静态成员
C
静态方法可以通过类名或对象访问
D
Java中的static关键字可以修饰类的成员,包括属性、方法以及代码块
答案:A
核心原因解析
本题考察 Java 中
static关键字的核心语法规则,逐一分析选项:1. 选项 A(错误)
错误原因:
static关键字只能修饰类的成员(成员变量、成员方法、代码块、内部类),不能修饰局部变量(方法内、代码块内定义的变量)。
- 成员变量:属于类 / 对象,可被
static修饰(静态成员变量);- 局部变量:属于方法 / 代码块的局部作用域,生命周期和作用域仅限于当前方法 / 代码块,
static修饰局部变量会直接触发编译报错。示例(非法的 static 局部变量):
java
运行
public static void main(String[] args) { static int a=10; // 编译报错:Illegal modifier for parameter a; only final is permitted }这是 Java 语法的强制限制,因此 “static 可以修饰局部变量” 的描述错误。
2. 选项 B(正确)
正确原因:静态方法属于 “类”,而非 “对象”,在静态方法执行时,可能还没有创建任何对象,因此:
- 静态方法不能直接访问非静态成员(非静态成员变量 / 方法,依赖对象存在);
- 静态方法只能直接访问静态成员(静态成员变量 / 方法,属于类,随时可访问)。若需在静态方法中访问非静态成员,必须先创建对象,通过对象引用访问(但这不属于 “直接访问”,规则本身仍成立)。
3. 选项 C(正确)
正确原因:静态方法属于类,因此有两种合法访问方式:
- 通过类名直接访问(推荐方式):
类名.静态方法名();- 通过对象引用访问(语法允许,但不推荐):
对象名.静态方法名()。示例:
java
运行
class Test { public static void show() {} } // 合法访问方式1:类名访问 Test.show(); // 合法访问方式2:对象访问 Test t = new Test(); t.show();4. 选项 D(正确)
正确原因:Java 中
static可修饰类的多种成员:
- 静态属性(成员变量):
static int num = 10;;- 静态方法:
static void show() {};- 静态代码块:
static { ... }(用于类初始化);- 静态内部类:
static class Inner {}(属于外部类,而非外部类的对象)。因此 “static 可以修饰类的成员,包括属性、方法以及代码块” 的描述正确。补充:static 关键字核心规则总结
可修饰的元素 不可修饰的元素 核心特性 成员变量、成员方法 局部变量、普通类(仅内部类可 static) 属于类,而非对象,类加载时初始化 静态代码块、静态内部类 构造方法、局部内部类 静态成员不依赖对象,可直接通过类访问 易错点提醒
- 误区:认为 “static 能修饰所有变量”→ 局部变量是方法内的临时变量,无 “静态” 概念,static 无法修饰;
- 误区:认为 “静态方法不能通过对象访问”→ 语法允许,但违背静态成员的设计初衷,不推荐使用;
- 核心:
static的核心是 “属于类,而非对象”,局部变量的作用域仅限于方法,无法绑定到类,因此不能被 static 修饰。综上,对 static 描述错误的是选项 A。
51. (单选题) 以下关于构造函数的描述错误的是( )。
A
构造函数是类的一种特殊函数,它的方法名必须与类名相同
B
构造函数的返回类型只能是void型
C
构造函数的主要作用是完成对类的对象的初始化工作
D
一般在创建新对象时,系统会自动调用构造函数
答案:B
核心原因解析
本题考察 Java 构造函数(构造方法)的核心语法规则,逐一分析选项:
1. 选项 A(正确)
正确原因:构造函数是类的特殊方法,核心语法特征之一是「方法名必须与类名完全一致(包括大小写)」。例如:
java
运行
class Person { // 合法构造函数:名与类名一致 public Person() {} // 非法:名不一致,不是构造函数(变成普通方法) public People() {} }因此 “方法名必须与类名相同” 的描述正确。
2. 选项 B(错误)
错误原因:构造函数没有返回值类型—— 既不能写
void,也不能写int/String等其他类型。这是构造函数与普通方法的核心区别:
- 若写了
void,该方法会变成普通方法(即使名与类名一致),不再是构造函数;- 构造函数的 “无返回值” 是语法规则,而非 “返回值类型为 void”。
示例(非法的构造函数写法):
java
运行
class Person { // 错误:写了void,变成普通方法,不再是构造函数 public void Person() {} }因此 “构造函数的返回类型只能是 void 型” 的描述完全错误。
3. 选项 C(正确)
正确原因:构造函数的核心作用是初始化对象—— 创建对象时,通过构造函数为对象的成员变量赋初始值、完成初始化逻辑。例如:
java
运行
class Person { String name; // 构造函数初始化name public Person(String n) { name = n; // 完成对象属性的初始化 } } // 创建对象时,通过构造函数给name赋值 Person p = new Person("张三");因此 “完成对类的对象的初始化工作” 的描述正确。
4. 选项 D(正确)
正确原因:构造函数不能手动调用,创建对象时系统会自动触发构造函数的执行:
- 语法上通过
new 类名(参数)创建对象,底层就是系统调用对应参数的构造函数;- 若类中无显式构造函数,编译器会自动生成默认无参构造,创建对象时仍会调用该默认构造。
示例:
java
运行
Person p = new Person(); // 系统自动调用Person的无参构造函数因此 “创建新对象时,系统会自动调用构造函数” 的描述正确。
补充:构造函数核心规则总结
规则 说明 命名规则 必须与类名完全一致(大小写敏感),无返回值类型(不能写 void) 核心作用 初始化对象的成员变量、完成初始化逻辑 调用方式 仅由系统在 new对象时自动调用,不能手动调用默认构造生成 类中无显式构造时,编译器自动生成无参构造 重载支持 支持(参数列表不同即可) 易错点提醒
- 误区:把 “构造函数无返回值” 等同于 “返回值类型为 void”→ 前者是语法规则(无返回值类型声明),后者是普通方法的特征,二者完全不同;
- 误区:认为构造函数可以手动调用 → 构造函数只能由系统在
new时调用,手动写p.Person()会编译报错(若没写 void)或变成普通方法调用(若写了 void)。综上,关于构造函数描述错误的是选项 B。
53. (单选题)若有说明语句:char c='72';
则变量c( )。
A
包含3个字符
B
包含2个字符
C
代码错误
D
包含1个字符
答案:C
核心原因解析
本题考察 Java 中
char类型的赋值规则,核心错误在于字符常量的语法格式,具体分析如下:步骤 1:明确 char 类型的核心规则
char是 Java 的基本数据类型,用于表示单个 Unicode 字符,赋值时需满足:
- 字符常量必须用单引号
'包裹,且单引号内只能有 1 个字符(单个字符、转义字符如'\n'、Unicode 编码如'\u0041');- 若单引号内有多个字符,或字符编码超出范围,会直接触发编译报错。
步骤 2:分析赋值语句
char c='72';的错误语句中
'72'是用单引号包裹了两个字符('7'和'2'),违反了 “单引号内只能有 1 个字符” 的语法规则:
- 合法的 char 赋值:
char c = '7';(单引号内 1 个字符)、char c = '\u0037';(Unicode 表示数字 7);- 非法的 char 赋值:
char c = '72';(多字符)、char c = "7";(用双引号,双引号是字符串专属)。因此该代码在编译阶段就会报错,变量
c无法正常定义。逐一排除其他选项
- 选项 A(包含 3 个字符):错误。char 本身只能存储 1 个字符,且代码语法错误,不存在 “包含 3 个字符” 的可能;
- 选项 B(包含 2 个字符):错误。同理,char 仅能存储 1 个字符,且赋值语句语法错误,无法执行;
- 选项 D(包含 1 个字符):错误。虽然 char 类型本身是存储 1 个字符,但赋值语句因多字符导致语法错误,变量无法定义,不存在 “包含 1 个字符” 的情况;
- 选项 C(代码错误):正确。单引号内包含多个字符,违反 char 赋值规则,编译报错。
补充:char 赋值的合法 / 非法场景对比
赋值语句 合法性 说明 char c = '7';合法 单引号内 1 个字符,符合规则 char c = '72';非法 单引号内多字符,编译报错 char c = "7";非法 双引号是 String 专属,类型不匹配 char c = '\n';合法 转义字符,单引号内 1 个转义字符 char c = '\u0037';合法 Unicode 编码,表示数字 7,单字符 易错点提醒
- 误区:认为 “单引号内可以写多个字符,char 会自动截取”→ Java 语法强制单引号内只能有 1 个字符,多字符直接编译报错,无截取逻辑;
- 误区:混淆 char 和 String → char 是单字符(单引号),String 是字符串(双引号),二者不能混用。
综上,该赋值语句语法错误,答案为 C。
58. (单选题) 下列哪个类用于处理日期和时间,并且不包含时区信息?
A
Calendar
B
ZonedDateTime
C
Date
D
LocalDateTime
答案:D
核心原因解析
本题考察 Java 中日期时间类的核心特性(时区支持),逐一分析选项:
1. 选项 A(错误)
错误原因:
Calendar是 Java 早期的日期时间处理类(抽象类),其核心设计绑定了系统默认时区——Calendar的实例会默认使用运行环境的时区(如TimeZone.getDefault()),所有日期时间计算都基于该时区,因此包含时区信息。示例:java
运行
Calendar cal = Calendar.getInstance(); System.out.println(cal.getTimeZone()); // 输出系统默认时区(如Asia/Shanghai)2. 选项 B(错误)
错误原因:
ZonedDateTime是 Java 8+java.time包中的类,名称中 “Zoned” 直接表明其核心特性:专门处理带时区的日期时间,是 “日期 + 时间 + 时区” 的完整封装,强制包含时区信息,而非 “不包含”。示例:java
运行
ZonedDateTime zdt = ZonedDateTime.now(); System.out.println(zdt.getZone()); // 输出当前时区(如Asia/Shanghai)3. 选项 C(错误)
错误原因:
java.util.Date是 Java 最早期的日期时间类,其底层存储的是 “从 1970-01-01 00:00:00 GMT(格林威治时间)开始的毫秒数”—— 虽然本身是绝对时间戳,但展示 / 转换时会默认关联系统时区,且设计上存在时区相关的歧义(如Date.toString()会输出带时区的字符串),并非 “不包含时区信息” 的设计。此外,Date类已被标记为过时(推荐用java.time包替代),其时区相关的设计也不符合 “纯无时区” 的需求。4. 选项 D(正确)
正确原因:
LocalDateTime是 Java 8+java.time包中专门为 “无时区的日期时间” 设计的类:
- 核心特性:仅封装 “年 - 月 - 日 时:分: 秒”,完全不包含时区信息,代表 “本地的、无时区关联的日期时间”;
- 设计目的:处理无需区分时区的场景(如 “2025-12-20 10:00” 这个时间本身,不关联任何时区)。示例:
java
运行
LocalDateTime ldt = LocalDateTime.now(); // LocalDateTime无获取时区的方法,验证其不包含时区 // System.out.println(ldt.getZone()); // 编译报错:无此方法补充:核心日期时间类时区特性总结
类名 时区特性 适用场景 Calendar 绑定系统默认时区 早期日期时间处理(已过时) ZonedDateTime 强制包含时区(日期 + 时间 + 时区) 跨时区的日期时间计算 Date 底层是时间戳,但展示关联时区 早期简单时间戳(已过时) LocalDateTime 完全不包含时区(仅本地日期时间) 无时区的日期时间处理 易错点提醒
- 误区:认为
Date不包含时区 →Date底层是绝对时间戳,但展示 / 转换时依赖时区,并非 “纯无时区” 设计;- 核心:Java 8+ 中,
LocalDateTime是唯一专门设计为 “不包含时区” 的日期时间类,而ZonedDateTime是专门处理带时区的类。综上,用于处理日期和时间且不包含时区信息的类是选项 D。
59. (单选题)执行下面的JAVA程序段后,输出结果是()。
int a=5; | |
while(a--); | |
System.out.println(a); |
A
0
B
4321
C
54321
D
语法错误
答案:无正确选项(若强制选则最接近的逻辑结果为 - 1,选项中无此答案,需注意题目可能的排版 / 选项疏漏)
核心原因解析
若题目选项存在疏漏(如漏了
-1选项),先明确代码执行逻辑:步骤 1:分析
while(a--)的执行规则
a--是后置自减:先判断表达式值(使用a的当前值),再将a自减 1;while(表达式)中,表达式为true(非 0)时执行循环体,为false(0)时终止循环;- 本题中
while(a--);的循环体是空语句(分号;表示循环体为空),仅执行条件判断和自减。步骤 2:逐次执行循环
循环轮次 判断时 a 的值 表达式 a--的结果a 自减后的值 循环是否执行 1 5 5(非 0,true) 4 执行(空循环体) 2 4 4(非 0,true) 3 执行(空循环体) 3 3 3(非 0,true) 2 执行(空循环体) 4 2 2(非 0,true) 1 执行(空循环体) 5 1 1(非 0,true) 0 执行(空循环体) 6 0 0(false) -1 终止循环 步骤 3:最终结果
循环终止后,
a的值为-1,执行System.out.println(a)输出-1。对题目选项的分析
- 选项 A(0):错误。循环终止时 a 已自减为 - 1,并非 0;
- 选项 B(4321):错误。循环体为空,无任何输出,且最终 a 的值不是该序列;
- 选项 C(54321):错误。同理,无输出,且 a 最终值不符;
- 选项 D(语法错误):错误。代码语法完全合法(
while(a--);是合法的空循环写法)。补充:关键易错点
- 空循环体识别:
while(a--);后的分号表示循环体为空,仅执行条件判断和自减,无任何打印操作;- 后置自减的时机:判断条件时用 “原值”,判断后立即自减,因此当 a=0 时,判断为 false,但仍会执行一次自减(0→-1);
- 题目疏漏说明:此类题目大概率是选项漏了
-1,若考试中遇到,需优先确认代码逻辑(输出 - 1),再结合考场要求选择最接近的选项(或反馈题目问题)。综上,代码执行后输出
-1,题目选项无正确答案;若仅从选项中强行选择,所有选项均错误。
71. (单选题) 在类的定义中,构造方法的作用是( )。
A
保护成员变量
B
描述类的特征
C
初始化成员变量
D
读取类的成员变量
要解决这道题,核心是理解 Java 中构造方法(构造器) 的核心作用,逐一分析选项:
选项 A:保护成员变量
- “保护成员变量” 是访问修饰符(如
private/protected)、封装机制(get/set 方法)的作用,而非构造方法的功能;- 构造方法不负责 “保护”,仅负责 “初始化”。结论:错误。
选项 B:描述类的特征
- “描述类的特征” 是成员变量(属性) 的作用(例如
class Person { String name; int age; }中,name/age 描述人的特征);- 构造方法是 “方法”,而非描述特征的载体。结论:错误。
选项 C:初始化成员变量
- 构造方法的核心定义:与类名同名、无返回值(连 void 都没有)、创建对象时自动调用,其唯一核心作用是在对象创建时,对类的成员变量进行初始化(赋值);
- 示例:
java
运行
class Person { String name; // 构造方法初始化name public Person(String n) { name = n; // 初始化成员变量 } } // 创建对象时,构造方法自动执行,完成name的初始化 Person p = new Person("张三");- 这是构造方法最本质、最核心的作用。结论:正确。
选项 D:读取类的成员变量
- “读取成员变量” 通常通过
getter方法(如public String getName() { return name; })实现;- 构造方法无返回值,也不负责 “读取” 操作。结论:错误。
最终结论
正确答案是 C。
补充:构造方法的关键特性
- 必须与类名完全相同,且无返回类型(不能写
void);- 对象通过
new关键字创建时,构造方法会自动调用,且仅调用一次;- 若未手动定义构造方法,编译器会自动生成无参空构造方法;
- 支持重载(多个构造方法,参数列表不同),用于灵活初始化成员变量。
简言之:构造方法的核心使命是在对象诞生时,完成成员变量的初始化,确保对象创建后处于合法、可用的状态。
76. (单选题) 下面说法正确的是( )。
A
abstract可修饰类、属性、方法。
B
final可修饰类、属性、方法。
C
用final修饰的变量,在程序中可对这个变量的值进行更改。
D
定义抽象方法需有方法的返回类型、名称、参数列表和方法体。
要解决这道题,核心是掌握 Java 中
abstract(抽象)和final(最终)关键字的修饰范围和核心规则,逐一分析选项:选项 A:
abstract可修饰类、属性、方法
abstract(抽象)的核心作用是定义 “未实现的抽象结构”,其修饰范围有严格限制:
- ✅ 修饰类:抽象类(不能实例化,需子类继承实现);
- ✅ 修饰方法:抽象方法(只有方法签名,无方法体,需子类重写);
- ❌ 不能修饰属性:属性是 “数据”,不存在 “抽象数据” 的概念,抽象关键字仅针对 “类 / 方法” 这类行为 / 结构。结论:错误。
选项 B:
final可修饰类、属性、方法
final(最终)的核心是 “不可修改”,其修饰范围覆盖类、属性、方法:
- ✅ 修饰类:最终类(不能被继承,如
String类);- ✅ 修饰方法:最终方法(不能被子类重写);
- ✅ 修饰属性:最终变量(初始化后值不可修改,即 “常量”)。结论:正确。
选项 C:用
final修饰的变量,在程序中可对这个变量的值进行更改
final修饰变量的核心规则:
- 一旦初始化(直接赋值 / 构造方法赋值),值不可修改(基本类型)或引用不可指向新对象(引用类型);
- 例如:
final int a = 10; a = 20;编译报错。结论:错误。选项 D:定义抽象方法需有方法的返回类型、名称、参数列表和方法体
抽象方法的定义规则:
- 抽象方法是 “只有声明,没有实现” 的方法,必须省略方法体(用分号结尾);
- 语法:
abstract 返回类型 方法名(参数列表);(无{}包裹的方法体)。结论:错误。最终结论
正确答案是 B。
核心规则总结
关键字 可修饰范围 核心限制 abstract 类、方法 抽象类不能实例化;抽象方法无方法体 final 类、方法、属性 类不可继承;方法不可重写;变量不可修改
85. (单选题) 以public修饰的类,如:public class Car{…} ,则该类( )。
A
可被其它程序包中的类使用
B
仅能被本程序包中的类使用
C
不能被任意其它类使用
D
不能被其它类继承
答案:A
核心原因解析
本题考察 Java 中
public访问修饰符对类的作用规则,核心结论是:public修饰的类是全局可见的,可跨程序包(包)被其他类访问 / 使用。逐一分析选项:
1. 选项 A(正确)
public是 Java 中最高级别的访问修饰符,用public修饰的类(如public class Car)具备以下特性:
- 可被任意程序包中的类访问、实例化、继承(只要通过
import导入该类所在包,或使用全类名);- 示例:若
Car类在包com.example下,其他包(如com.test)的类可通过import com.example.Car;导入后,直接使用Car car = new Car();。这是public类的核心特性,因此该选项完全正确。2. 选项 B(错误)
“仅能被本程序包中的类使用” 是默认访问权限(包访问权限) 的特性(类无修饰符时),而非
public类的规则:
- 无修饰符的类(如
class Bike):仅能被同一个包中的类访问;public类突破了包的限制,因此该描述与public类的规则完全相反。3. 选项 C(错误)
public类的设计目的就是 “允许被任意其他类使用”,而非 “不能被使用”,该选项违背public修饰符的核心语义。4. 选项 D(错误)
public类不仅能被其他类继承,还支持跨包继承(只要满足继承规则):
- 示例:包
com.test中的public class BMW extends com.example.Car是合法的;- 只有
final修饰的类(如public final class Car)才不能被继承,public本身不限制继承。补充:类的访问修饰符规则总结
修饰符 访问范围 示例 public 所有包中的类均可访问 public class Car默认(无修饰符) 仅本包中的类可访问 class Bikefinal 可访问,但不能被继承 public final class Carprivate 仅能修饰内部类,外部类不可用 -(外部类不能用 private) 易错点提醒
- 误区:混淆
public类和默认权限类的访问范围 → 记准 “public跨包可见,默认仅本包可见”;- 误区:认为
public类不能被继承 → 继承限制由final修饰符控制,与public无关。综上,
public修饰的类可被其它程序包中的类使用,答案为 A。
86. (单选题) Java编程所必须的默认引用包是 。
A
java.util包
B
其它都不是
C
java.sys包
D
java.lang包
答案:D
核心原因解析
本题考察 Java 核心包的默认导入规则,核心结论是:
java.lang包是 Java 编译器自动隐式导入的唯一包,无需手动写import语句即可使用其中的类,是 Java 编程的基础核心包。逐一分析选项:
1. 选项 A(错误)
java.util包包含工具类(如ArrayList、HashMap、Scanner等),属于常用包,但不会默认导入,使用时必须手动写import java.util.XXX;(如import java.util.Scanner;),否则编译报错。2. 选项 B(错误)
java.lang包是明确的默认导入包,因此 “其它都不是” 的表述不成立。3. 选项 C(错误)
Java 中不存在
java.sys这个标准包,属于干扰项(系统相关功能主要在java.lang.System、java.nio等包中,无java.sys包)。4. 选项 D(正确)
java.lang包是 Java 语言的核心包,包含最基础、最必需的类:
- 基本类型包装类(
Integer、String、Boolean等);- 核心类(
Object、System、Thread、Math等);- 异常类(
Exception、RuntimeException等)。Java 编译器会自动为所有
.java源文件隐式导入java.lang包(等价于每个文件开头默认加import java.lang.*;),因此是编程 “必须的默认引用包”。补充:核心包规则总结
包名 默认导入 核心用途 是否必须手动导入 java.lang 是 语言核心类(String、Object、System 等) 否(自动导入) java.util 否 工具类(集合、扫描器、日期等) 是 java.io 否 输入输出(文件、流等) 是 java.net 否 网络编程(Socket、URL 等) 是 易错点提醒
- 误区:认为
java.util是默认包 → 仅java.lang自动导入,其他包均需手动import;- 核心记忆:
java.lang= Java Language(Java 语言核心),是唯一默认导入的包,没有它无法完成基础的 Java 编程(如定义字符串、使用System.out.println等)。综上,Java 编程所必须的默认引用包是
java.lang包,答案为 D。
104. (单选题) Java中提供了名为 的包装类来包装原始字符串类型。
A
String
B
Integer
C
Character
D
Double
要解决这道题,核心是区分「Java 原始数据类型的包装类」和「字符串类型的本质」,先明确核心概念,再逐一分析选项:
第一步:关键概念厘清
- 原始数据类型(基本类型):Java 的 8 种基本类型(
byte/short/int/long/float/double/char/boolean),无包装、无方法,仅存值;- 包装类:为 8 种基本类型提供的 “对象版” 类(如
Integer对应int、Character对应char),用于将基本类型封装为对象;- 字符串类型(String):
String本身不是 “原始类型”,而是引用类型(对象类型),因此不存在 “包装原始字符串类型” 的说法 —— 题目表述的核心是:选项中唯一与 “字符 / 字符串” 相关的包装类是哪个(题目 “原始字符串类型” 实为笔误,应为 “原始字符类型char”)。第二步:选项逐一分析
选项 A:
String
String是字符串类,不是包装类:它封装的是字符序列,而非 8 种基本类型之一;且String本身是引用类型,不存在 “包装原始字符串类型” 的逻辑(因为没有 “原始字符串类型” 这个基本类型)。- 结论:错误。
选项 B:
Integer
Integer是基本类型int的包装类,仅用于封装整型数值,与字符串 / 字符无关。- 结论:错误。
选项 C:
Character
Character是基本类型char(字符型)的包装类:char是 Java 中唯一与 “字符” 相关的基本类型,Character通过包装char,提供了字符的对象化操作(如Character.isDigit('5')判断是否为数字);- 题目中 “原始字符串类型” 是表述误差,实际指向 “原始字符类型
char”,因此Character是唯一匹配的包装类。- 结论:正确。
选项 D:
Double
Double是基本类型double的包装类,仅用于封装浮点型数值,与字符 / 字符串无关。- 结论:错误。
最终结论
正确答案是 C。
补充:Java 基本类型与包装类对应表
原始基本类型 对应的包装类 核心用途 byte Byte 封装字节型数值 short Short 封装短整型数值 int Integer 封装整型数值(最常用) long Long 封装长整型数值 float Float 封装单精度浮点型数值 double Double 封装双精度浮点型数值 char Character 封装字符型(唯一非数字包装类) boolean Boolean 封装布尔值 关键易错点提醒
- 切勿混淆
String和Character:String是字符序列的引用类型,Character是单个字符基本类型char的包装类;- 包装类仅对应 8 种基本类型,
String不属于包装类范畴。
117. (单选题) 在异常处理中,如释放资源、关闭文件、关闭数据库等由 来完成。
A
finally
B
try
C
catch
D
throw
解析
核心考点
Java 异常处理中
try/catch/finally/throw的分工,重点是finally的核心使命 ——执行必须完成的收尾操作(如释放资源、关闭文件 / 数据库连接)。选项逐一分析
选项 A:
finally
- 正确:
finally块的核心特性是无论try块是否抛出异常、catch块是否捕获异常,都会执行,这一特性使其成为处理 “必须执行的收尾操作” 的唯一选择。例如关闭数据库连接的典型场景:java
运行
释放资源、关闭文件 / 数据库等操作,必须保证 “即使出错也执行”,因此由Connection conn = null; try { conn = DriverManager.getConnection(url, user, pwd); // 执行数据库操作(可能抛异常) } catch (SQLException e) { // 处理异常 } finally { // 无论是否抛异常,必须关闭连接释放资源 if (conn != null) { try { conn.close(); } catch (SQLException e) { e.printStackTrace(); } } }finally完成。选项 B:
try
- 错误:
try块仅用于包裹 “可能抛出异常的代码”(如打开文件、连接数据库),其执行可能被异常中断(比如打开文件失败抛异常,try后续代码不会执行),无法保证资源释放操作一定完成。选项 C:
catch
- 错误:
catch块仅在try块抛出对应类型异常时才执行,若try块无异常,catch块不会执行 —— 无法覆盖 “无异常时也需释放资源” 的场景,因此不能用于处理必须执行的收尾操作。选项 D:
throw
- 错误:
throw是手动抛出异常对象的语句(如throw new FileNotFoundException()),仅用于 “抛出异常”,而非执行资源释放等收尾操作。最终结论
正确答案是 A。
补充:异常处理各组件核心分工
组件 核心作用 能否用于资源释放 try 包裹可能抛异常的代码,触发异常检测 否(执行可能中断) catch 捕获并处理 try 块抛出的指定异常 否(仅异常时执行) finally 执行必须完成的收尾操作,无论是否抛异常 是(唯一选择) throw 手动抛出异常对象 否(仅抛异常) 简言之:资源释放的核心要求是 “无条件执行”,而
finally是唯一满足该要求的组件
119. (单选题) 我们在方法前面加上关键字( )后,该方法不需要对象就可以调用。
A
final
B
public
C
static
D
this
解析
核心考点
Java 中
static(静态)关键字的核心特性 ——静态成员(方法 / 变量)属于类本身,而非类的实例对象,因此无需创建对象,可直接通过 “类名。方法名 ()” 调用。选项逐一分析
选项 A:
final
- 错误:
final修饰方法的作用是禁止该方法被子类重写,与 “是否需要对象调用” 无关。被final修饰的非静态方法,仍需创建对象才能调用。选项 B:
public
- 错误:
public是访问修饰符,仅控制方法的访问权限(可被任意类访问),不改变方法的调用方式 ——public的非静态方法,仍需创建对象才能调用。选项 C:
static
- 正确:
static(静态)方法属于 “类级别的方法”,存储在类的方法区,不依赖对象的创建。调用方式:java
运行
这是class Test { // 静态方法 public static void sayHello() { System.out.println("Hello"); } } // 无需创建Test对象,直接通过类名调用 Test.sayHello();static方法的核心特征,完全符合 “不需要对象就可以调用” 的要求。选项 D:
this
- 错误:
this是关键字(不是修饰符),用于指代当前对象的引用,仅能在非静态方法中使用(静态方法中无this),且this无法修饰方法,语法本身不合法。最终结论
正确答案是 C。
补充:static 方法的核心规则总结
特性 具体说明 调用方式 ① 类名直接调用(推荐): 类名.静态方法名();② 对象调用(不推荐):new 类名().静态方法名()访问权限 静态方法只能直接访问静态成员(静态变量 / 静态方法),不能直接访问非静态成员(需通过对象) this/super静态方法中不能使用 this(无当前对象)、super(无父类对象)应用场景 工具方法(如 Math.random())、通用操作(无需依赖对象状态的逻辑)简言之:
static是唯一能让方法 “脱离对象直接调用” 的修饰符,其本质是将方法绑定到类,而非对象。
138. (单选题) 以下正确的描述是( )。
A
方法的定义和方法的调用均不可以嵌套
B
方法的定义不可以嵌套,但方法的调用可以嵌套
C
方法的定义可以嵌套,但方法的调用不可以嵌套
D
方法的定义和方法的调用均可以嵌套
第 138 题解析
核心考点
Java 方法的定义与调用规则(嵌套特性)。
关键规则
- 方法定义不可嵌套:Java 语法禁止在一个方法内部定义另一个方法(如
public static void m1() { public static void m2() {} }编译报错);- 方法调用可嵌套:允许在一个方法的调用语句中嵌套调用其他方法(如
System.out.println(add(1, sub(3,2)))合法)。选项分析
- A:定义和调用均不可嵌套 → 错误(调用可嵌套);
- B:定义不可嵌套,调用可嵌套 → 正确;
- C:定义可嵌套,调用不可嵌套 → 错误(定义不可嵌套,调用可嵌套);
- D:定义和调用均可嵌套 → 错误(定义不可嵌套)。
结论
答案:B。
146. (单选题) 在Java中下列关于while和do-whlie循环和for循环的说法错误的是()。
A
while循环能够实现的功能,for循环也都能够实现。
B
while循环有入口条件先判断再执行,do-while循环没有入口条件先做再判断
C
for循环能够实现的功能,while循环也都能够实现
D
do-while循环结束的条件是条件语句成立
解析
核心考点
Java 三种循环(while/do-while/for)的核心特性对比(执行逻辑、功能等价性、终止条件)。
选项逐一分析
选项 A:
while循环能够实现的功能,for循环也都能够实现
- 正确:
for循环的本质是while循环的 “语法糖”,三者(while/do-while/for)在功能上完全等价(仅语法形式不同)。例如 while 循环:java
运行
可等价转为 for 循环:int i = 0; while(i < 5) { System.out.println(i); i++; }java
运行
因此 while 能实现的功能,for 都能实现。for(int i = 0; i < 5; i++) { System.out.println(i); }选项 B:
while循环有入口条件先判断再执行,do-while循环没有入口条件先做再判断
- 正确:这是 while 和 do-while 的核心区别:
- while:先判断条件(入口条件),再执行循环体 → 若初始条件不成立,循环体一次都不执行;
- do-while:无入口条件(不预先判断),先执行循环体,再判断条件 → 无论条件是否成立,循环体至少执行 1 次。
选项 C:
for循环能够实现的功能,while循环也都能够实现
- 正确:与选项 A 逻辑一致,for 循环的三个表达式(初始化 / 条件 / 更新)均可拆解到 while 循环中实现,因此 for 能实现的功能,while 也能实现。
选项 D:
do-while循环结束的条件是条件语句成立
- 错误:所有循环(while/do-while/for)的终止条件都是 “循环条件不成立”:
- do-while 的执行逻辑:
do { 循环体 } while(条件);→ 当条件为true时,继续循环;当条件为false时,结束循环。- 例:本题中
do-while(m < 8),当m < 8(条件成立)时继续,当m >= 8(条件不成立)时结束,而非 “条件成立时结束”。最终结论
答案:D。
补充:循环核心规则总结
循环类型 执行逻辑 终止条件 功能等价性 while 先判断条件,再执行体 条件为 false 与 for 完全等价 do-while 先执行体,再判断条件 条件为 false 仅初始条件不成立时与 while 有差异 for 初始化→判断→执行→更新 条件为 false 与 while 完全等价 关键易错点:
- 所有循环的终止条件都是 “条件语句不成立(false)”,而非 “成立(true)”;
- do-while 的 “无入口条件” 仅指 “不预先判断”,并非 “没有条件”,其终止仍依赖条件判断。
147. (单选题) ( )表达式不可以作为循环条件。
A
i = 5
B
i > 5
C
name.equals(“lcg”)
D
count == i
解析
核心考点
Java 循环条件的语法要求 ——必须是返回
boolean类型(true/false)的表达式,而非赋值语句或其他类型表达式。选项逐一分析
选项 A:
i = 5
- 不可以作为循环条件 → 这是赋值语句(
=是赋值运算符),而非布尔表达式:
- 执行
i = 5的结果是 “将 5 赋值给 i,并返回赋值后的值 5(int 类型)”;- 循环条件要求必须是
boolean类型(true/false),int 类型无法作为循环条件(编译报错)。选项 B:
i > 5
- 可以作为循环条件 → 这是比较表达式,返回
boolean类型(i 大于 5 则为 true,否则为 false),符合循环条件要求。选项 C:
name.equals("lcg")
- 可以作为循环条件 →
equals()方法是String类的方法,返回boolean类型(字符串相等则为 true,否则为 false),符合要求。选项 D:
count == i
- 可以作为循环条件 →
==是比较运算符,返回boolean类型(count 等于 i 则为 true,否则为 false),符合要求。最终结论
答案:A。
补充:关键规则强化
- 循环条件的核心要求:
- 必须是
boolean类型表达式(直接值true/false、比较表达式、返回 boolean 的方法调用等);- 赋值语句(
=)、算术表达式(如i+5)、常量 / 变量(如5/i)等非 boolean 类型,均不能作为循环条件。- 易混淆点:
i == 5(比较,返回 boolean)→ 合法;i = 5(赋值,返回 int)→ 非法;- 编译报错示例:
java
运行
int i = 0; while(i = 5) { // 编译错误:不兼容的类型,int无法转换为boolean System.out.println(i); }
150. (单选题) 关于char类型的数组,说法正确的是( )。
A
其数组的默认值是'A'
B
可以储存整型数值D
C
可以仅通过数组名来访问数组
D
数组不能转换为字符串
解析
核心考点
char 类型数组的核心特性(默认值、数据存储、访问规则、类型转换)。
选项逐一分析
选项 A:
其数组的默认值是'A'
- 错误:Java 中数组的默认值由元素类型决定:
- char 类型数组的默认值是Unicode 空字符(
\u0000)(表现为不可见的空字符,而非'A');- 只有显式赋值时,char 数组元素才会是指定字符(如
arr[0] = 'A')。选项 B:
可以储存整型数值
- 正确:char 类型本质是Unicode 编码的 16 位无符号整数(范围
0~65535),因此 char 数组的元素可以存储对应范围的整型数值(赋值时会自动转换为对应 Unicode 字符)。示例:java
运行
(注:题目中 “D” 应为笔误,核心是 “可以存储整型数值” 这一结论成立)。char[] arr = new char[1]; arr[0] = 65; // 65是'A'的Unicode编码 System.out.println(arr[0]); // 输出'A'选项 C:
可以仅通过数组名来访问数组
- 错误:数组的访问必须通过下标(索引)(如
arr[0]),仅写数组名(如arr)表示数组对象的引用,无法直接访问数组元素:
- 示例:
char[] arr = {'a','b'}; System.out.println(arr);不会直接输出元素,而是输出数组的内存地址(如[C@1b6d3586)。选项 D:
数组不能转换为字符串
- 错误:char 数组可以直接转换为字符串,Java 提供了多种方式:
- 通过
String构造方法:char[] arr = {'h','e','l','l','o'}; String s = new String(arr);(s 的值为 "hello");- 通过
String.valueOf()方法:String s = String.valueOf(arr);。最终结论
答案:B。
补充:char 数组核心规则总结
特性 具体说明 默认值 \u0000(Unicode 空字符),非任意可见字符数据存储 可存储 0~65535范围内的整型数值(自动映射为 Unicode 字符),也可存储字符访问规则 必须通过下标( arr[index])访问元素,仅数组名无法访问具体元素类型转换 可通过 new String(char[])或String.valueOf(char[])转换为字符串关键易错点
- char 类型 “存储整型数值”≠“直接存储数字字符”:如赋值
arr[0] = 65,元素是'A'(而非'65');若要存储数字字符,需赋值arr[0] = '6'(对应 Unicode 编码 54)。- char 数组转字符串是 Java 高频操作(如处理字符拼接、解析文本),与 “数组不能转换为字符串” 的错误结论相反。
154. (单选题) 安装好JDK后,在其bin目录下有许多exe可执行文件,其中java.exe命令的作用是以下哪一种。
A
Java编译器
B
Java解释器
C
Java启动器
D
Java文档制作工具
第 154 题解析
核心考点
JDK bin 目录下核心可执行文件的功能区分。
选项逐一分析
- A:Java 编译器 → 对应
javac.exe(将.java源文件编译为.class字节码文件),而非java.exe;- B:Java 解释器 → 传统说法中
java.exe负责解释执行字节码,但更准确的定位是Java 启动器;- C:Java 启动器 → 正确,
java.exe的核心作用是启动 JVM,并加载执行指定的字节码文件(JDK 1.5 + 后采用混合模式,包含解释 + 编译,“启动器” 是更准确的官方定义);- D:Java 文档制作工具 → 对应
javadoc.exe(根据源码注释生成 API 文档)。结论
答案:C。
157. (单选题) 在多重catch块中同时使用下列类时,( )异常类应该最后列出。
A
ArithmeticException
B
NumberFormatException
C
ArrayIndexOutOfBoundsException
D
Exception
第 157 题解析
核心考点
多重
catch块的执行规则:子类异常在前,父类异常在后(否则父类会捕获所有子类异常,子类catch块永远无法执行)。关键规则
Exception是所有异常类的父类(根异常);ArithmeticException(算术异常)、NumberFormatException(数字格式异常)、ArrayIndexOutOfBoundsException(数组下标越界)都是Exception的子类。选项分析
- A/B/C:均为
Exception的子类,需在前序catch块中捕获;- D:
Exception是父类,必须最后列出(否则会覆盖所有子类异常的捕获)。结论
答案:D。
159. (单选题) 关于数组作为方法的参数时,向方法传递的是( )。
A
数组的引用
B
数组的栈地址
C
数组的元素
D
数组自身
第 159 题解析
核心考点
Java 数组作为方法参数的传递规则(引用传递本质)。
选项逐一分析
A:数组的引用正确。Java 中数组是引用类型,方法参数传递遵循 “值传递”:传递的是 “数组对象在堆内存中的引用地址的副本”(本质是引用)。方法内通过该引用可修改数组的元素(因为指向同一个堆内存对象)。
B:数组的栈地址错误。数组对象存储在堆内存,栈中仅保存数组的引用(地址),传递的是 “堆地址的副本”,而非 “栈地址”。
C:数组的元素错误。传递的不是元素本身,而是数组的引用:若传递元素,方法内修改元素不会影响原数组,但实际数组参数传递后,方法内修改元素会同步到原数组(因为指向同一个数组对象)。
D:数组自身错误。Java 中不存在 “传递对象本身” 的情况,引用类型参数传递的始终是 “引用的副本”,而非对象本身。
结论
答案:A。
160. (单选题) 下列数组定义中,正确的是 。
A
int a[10][10];
B
int a[][10];
C
int a[][]=new int [10][10];
D
int a[][]=new int [10,10];
第 160 题解析
核心考点
Java 二维数组的定义语法规则。
选项逐一分析
A:int a[10][10];错误。数组声明时,方括号内不能指定长度(长度只能在创建数组对象时指定)。正确声明方式:
int a[][];或int[][] a;。B:int a[][10];错误。二维数组声明时,仅能在 “创建时” 指定 “高维长度”,声明阶段不能指定任意维度的长度;且即使创建时,也需遵循 “高维先指定,低维可后指定”(如
int a[][] = new int[10][];合法)。C:int a[][]=new int [10][10];正确。这是二维数组的标准初始化方式:声明后通过
new创建,同时指定高维(10 行)和低维(10 列)长度,语法完全合法。D:int a[][]=new int [10,10];错误。数组维度的长度必须用
[]分隔,不能用逗号(,),逗号仅用于数组元素初始化(如int[] a = {1,2,3};)。结论
答案:C。
163. (单选题)
给定如下Java代码,编译运行时,结果是( )。
public static void main(String args[]){ | |
for(int i = 0; i < 3; i++){ | |
System.out.print(i); | |
} | |
System.out.print(i); | |
} |
A
正确运行,输出123
B
正确运行,输出0123
C
正确运行,输出012
D
编译时报错
第 163 题解析
核心考点
Java 局部变量的作用域(
for循环内声明的变量仅在循环体中有效)。步骤 1:分析变量作用域
int i = 0在for循环的初始化部分声明,属于循环体的局部变量,作用域仅限于for循环内部;- 循环结束后,
System.out.print(i)中的i超出作用域,编译器无法识别该变量,直接报错。选项分析
- A/B/C:均错误(编译报错,无法运行);
- D:编译时报错 → 正确。
结论
答案:D。
172. (单选题) 现有两个类:SuperClass是父类,SubClass是子类,以下属于向上转型的是( )。
A
SuperClass s = new SubClass()
B
SuperClass s = new SuperClass()
C
SubClass s = (SubClass)superClass
D
SubClass s = new SubClass()
第 172 题解析
核心考点
Java 向上转型的定义(父类引用指向子类对象)。
关键规则
- 向上转型:父类类型的引用变量,指向子类类型的对象(自动转换,无需强制类型转换);
- 向下转型:子类类型的引用变量,指向父类类型的对象(需强制类型转换,且需确保实际对象是子类类型)。
选项分析
- A:
SuperClass s = new SubClass()→ 正确,父类引用指向子类对象,典型的向上转型;- B:
SuperClass s = new SuperClass()→ 错误,父类引用指向父类对象,无转型;- C:
SubClass s = (SubClass)superClass→ 错误,强制类型转换,属于向下转型;- D:
SubClass s = new SubClass()→ 错误,子类引用指向子类对象,无转型。结论
答案:A。
第 173 题解析
核心考点
Java 多态性的本质(动态绑定)。
选项逐一分析
A:多态性是指按引用变量指向的对象,而非引用变量本身的类型决定调用哪个方法正确。多态的核心是 “动态绑定”:编译时按引用变量的类型检查方法,运行时按实际指向的对象类型执行方法(如父类引用指向子类对象时,调用子类重写的方法)。
B:多态性就是方法的覆盖错误。方法覆盖(重写)是实现多态的手段,而非多态本身;多态还依赖向上转型等条件。
C:多态性就是方法重载错误。方法重载是 “编译时多态”(静态绑定),而通常说的多态指 “运行时多态”(动态绑定,基于方法重写),且重载并非多态的核心定义。
D:多态性只存在于同名的成员变量之间错误。多态性针对方法,成员变量无多态(成员变量的访问按引用变量的类型决定,而非实际对象类型)。
结论
答案:A。
怎样向下转型?
在 Java 中,向下转型(Downcasting) 是指将父类类型的引用转换为子类类型的引用(与向上转型相反)。由于向上转型是 “自动安全” 的,而向下转型存在类型不匹配的风险,因此必须通过强制类型转换实现,且需遵循严格的规则。
一、向下转型的前提
向下转型的核心前提:父类引用实际指向的是子类对象(否则会抛出
ClassCastException)。java
运行
// 父类 class Animal {} // 子类 class Cat extends Animal {} class Dog extends Animal {} // 1. 先向上转型(父类引用指向子类对象) Animal animal = new Cat(); // 合法,animal实际指向Cat对象 // 2. 再向下转型(将Animal引用转为Cat类型) Cat cat = (Cat) animal; // 合法,因为animal实际是Cat // 错误示例:父类引用指向父类对象,向下转型报错 Animal animal2 = new Animal(); Cat cat2 = (Cat) animal2; // 运行时抛出ClassCastException二、向下转型的语法
java
运行
// 格式:子类类型 变量名 = (子类类型) 父类引用; 子类类型 子类变量 = (子类类型) 父类引用;三、安全的向下转型:结合
instanceof判断为了避免
ClassCastException,向下转型前建议先用instanceof判断 “父类引用指向的对象是否为目标子类的实例”,再执行转型。语法:
java
运行
if (父类引用 instanceof 子类类型) { // 安全转型 子类类型 子类变量 = (子类类型) 父类引用; } else { // 类型不匹配,不执行转型 System.out.println("类型不匹配,无法向下转型"); }完整示例:
java
运行
class Animal { public void eat() { System.out.println("动物吃东西"); } } class Cat extends Animal { public void catchMouse() { System.out.println("猫抓老鼠"); } } class Dog extends Animal { public void watchHouse() { System.out.println("狗看家"); } } public class Test { public static void main(String[] args) { Animal animal = new Cat(); // 向上转型 // 安全向下转型:先判断再转型 if (animal instanceof Cat) { Cat cat = (Cat) animal; cat.catchMouse(); // 调用Cat的特有方法 } else if (animal instanceof Dog) { Dog dog = (Dog) animal; dog.watchHouse(); } else { System.out.println("无法转型"); } } } // 输出:猫抓老鼠四、向下转型的用途
向下转型的核心目的:调用子类的特有方法 / 属性(父类引用只能访问父类定义的方法 / 属性,无法直接访问子类特有成员)。
java
运行
Animal animal = new Cat(); animal.eat(); // 可调用父类方法 // animal.catchMouse(); // 编译报错:Animal没有catchMouse方法 // 向下转型后,可调用子类特有方法 Cat cat = (Cat) animal; cat.catchMouse(); // 合法五、常见错误与注意事项
- 父类引用指向父类对象,直接向下转型:
java
运行
Animal animal = new Animal(); Cat cat = (Cat) animal; // 运行时抛出ClassCastException- 父类引用指向其他子类对象,向下转型:
java
运行
Animal animal = new Dog(); Cat cat = (Cat) animal; // 运行时抛出ClassCastException(animal实际是Dog,不是Cat)instanceof的作用:
instanceof判断的是 “对象的实际类型”,而非引用类型;- 若父类引用为
null,instanceof返回false,避免空指针。总结
步骤 操作 1. 前提 父类引用必须实际指向目标子类的对象(先向上转型) 2. 安全判断 用 instanceof检查父类引用是否为目标子类的实例3. 强制转型 通过 (子类类型)执行向下转型4. 调用特有方法 转型后可访问子类特有的方法 / 属性 向下转型的核心是 “先判断,再转型”,通过
instanceof规避ClassCastException,确保代码的健壮性。
怎么向上转型?
在 Java 中,向上转型(Upcasting) 是指将子类类型的对象赋值给父类类型的引用变量(也叫 “自动类型转换”),是实现多态的基础,语法上无需手动强制转换,JVM 会自动完成。
一、向上转型的核心规则
- 本质:父类引用变量指向子类对象(“看父类,用子类”);
- 语法:
父类类型 引用变量 = new 子类类型();(自动转换,无需要强制类型转换符);- 核心特点:转型后,父类引用只能访问父类中定义的成员(方法 / 属性),无法直接访问子类特有的成员(但子类重写的父类方法会执行子类实现)。
二、向上转型的语法示例
先定义父类和子类:
java
运行
// 父类:动物 class Animal { public void eat() { System.out.println("动物吃东西"); } } // 子类:猫(继承Animal) class Cat extends Animal { // 重写父类方法 @Override public void eat() { System.out.println("猫吃小鱼干"); } // 子类特有方法 public void catchMouse() { System.out.println("猫抓老鼠"); } } // 子类:狗(继承Animal) class Dog extends Animal { @Override public void eat() { System.out.println("狗啃骨头"); } // 子类特有方法 public void watchHouse() { System.out.println("狗看家"); } }基础向上转型写法:
java
运行
public class TestUpcasting { public static void main(String[] args) { // 1. 向上转型:父类引用指向Cat对象 Animal animal1 = new Cat(); // 2. 向上转型:父类引用指向Dog对象 Animal animal2 = new Dog(); // 调用重写的方法:执行子类的实现(多态核心) animal1.eat(); // 输出:猫吃小鱼干 animal2.eat(); // 输出:狗啃骨头 // 错误:父类引用无法直接调用子类特有方法 // animal1.catchMouse(); // 编译报错:Animal类没有catchMouse方法 // animal2.watchHouse(); // 编译报错:Animal类没有watchHouse方法 } }三、向上转型的常见场景
除了直接赋值,向上转型还常见于方法参数、方法返回值场景:
场景 1:方法参数(最常用,实现多态调用)
java
运行
// 定义一个接收父类类型参数的方法 public static void feedAnimal(Animal animal) { animal.eat(); // 传入不同子类对象,执行不同的eat方法 } public static void main(String[] args) { // 传入Cat对象,自动向上转型为Animal feedAnimal(new Cat()); // 输出:猫吃小鱼干 // 传入Dog对象,自动向上转型为Animal feedAnimal(new Dog()); // 输出:狗啃骨头 }场景 2:方法返回值
java
运行
// 方法返回父类类型,实际返回子类对象(自动向上转型) public static Animal getAnimal(String type) { if ("cat".equals(type)) { return new Cat(); // Cat自动转为Animal } else { return new Dog(); // Dog自动转为Animal } } public static void main(String[] args) { Animal animal = getAnimal("cat"); animal.eat(); // 输出:猫吃小鱼干 }四、向上转型的核心特性
自动转换,无需强制类型转换:因为子类是父类的 “特殊化”,JVM 默认允许子类对象赋值给父类引用,无需像向下转型那样加
(父类类型)。“看父类,用子类”:
- 编译期:编译器只认父类类型,因此只能调用父类中存在的方法 / 属性(子类特有成员不可见);
- 运行期:JVM 执行的是子类重写后的方法实现(多态的 “动态绑定”)。
安全性:向上转型是 “安全的”,不会抛出
ClassCastException(因为子类一定是父类的一种)。五、向上转型的用途
- 简化代码,提高扩展性:方法参数用父类类型,可接收任意子类对象,无需为每个子类写重载方法(如上面的
feedAnimal方法)。- 实现多态:这是向上转型的核心价值 —— 父类引用指向不同子类对象,调用同一方法时执行不同逻辑,符合 “开闭原则”(新增子类无需修改原有代码)。
六、向上转型 vs 向下转型 对比
特性 向上转型 向下转型 语法 自动转换(无需强制) 强制转换(需加 (子类类型))前提 父类引用指向子类对象 父类引用实际指向目标子类对象 访问范围 只能访问父类成员 可访问子类特有成员 安全性 安全(无异常) 不安全(需用 instanceof判断)核心目的 实现多态、简化代码 调用子类特有方法 总结
向上转型的核心写法:
父类类型 引用 = new 子类类型();核心记住两点:
- 编译期看 “父类”(只能调父类方法),运行期用 “子类”(执行子类重写的逻辑);
- 向上转型是实现 Java 多态的基础,也是代码解耦、提高扩展性的关键手段。
174. (单选题) 下面关于try块的说法正确的是( )。
A
try块后至少应有一个catch块
B
try块后必须有finally块
C
对抛出的异常的处理应放在try块中
D
可能抛出异常的方法应放在try块中
第 174 题(try 块)解析
核心考点
try 块的语法规则与核心作用。
选项逐一分析
- A:try 块后至少应有一个 catch 块❌ 错误。try 块后可仅跟
finally块(无 catch),例如:java
运行
try { /* 可能抛异常的代码 */ } finally { /* 必执行的收尾代码 */ }- B:try 块后必须有 finally 块❌ 错误。try 块后可仅跟一个 / 多个
catch块(无 finally),finally是可选的。- C:对抛出的异常的处理应放在 try 块中❌ 错误。
try块用于包裹 “可能抛出异常的代码”,异常的处理逻辑(捕获、修复、提示)需放在catch块中。- D:可能抛出异常的方法应放在 try 块中✅ 正确。
try块的核心作用就是包裹 “可能抛出异常的代码 / 方法”,以便后续catch捕获异常、finally执行收尾操作。结论
答案:D。
75. (单选题) 接口中可以包含以下内容( ) 。
A
静态变量和抽象方法
B
任何变量和任何方法
C
静态常量和抽象方法
D
任何变量和抽象方法
第 175 题(接口内容)解析
核心考点
Java 接口的成员规则(JDK 8 前的核心规则,也是考试高频考点)。
关键规则
接口中的成员默认修饰符:
- 变量:
public static final(静态常量,必须初始化,不可修改);- 方法:
public abstract(抽象方法,无方法体);(JDK 8 + 支持default/static方法,但核心考点仍聚焦 “静态常量 + 抽象方法”)。选项逐一分析
- A:静态变量和抽象方法❌ 错误。接口中的变量是 “静态常量(final)”,而非普通静态变量(可修改)。
- B:任何变量和任何方法❌ 错误。接口不能有普通变量(非 final)、普通方法(有方法体)。
- C:静态常量和抽象方法✅ 正确。符合接口成员的核心定义。
- D:任何变量和抽象方法❌ 错误。接口不能有普通变量(非 final)。
结论
答案:C。
184. (单选题) 覆盖与重载的关系是( )。
A
覆盖方法可以不同名,而重载方法必须同名
B
覆盖只有发生在父类与子类之间,而重载可以发生在同一个类中
C
覆盖与重载是同一回事
D
final修饰的方法可以被覆盖,但不能被重载
第 184 题(覆盖与重载)解析
核心考点
方法覆盖(重写)与重载的核心区别。
选项逐一分析
- A:覆盖方法可以不同名,而重载方法必须同名❌ 错误。覆盖(重写)要求方法名、参数列表、返回值(协变)完全一致;重载要求方法名相同,参数列表不同。
- B:覆盖只有发生在父类与子类之间,而重载可以发生在同一个类中✅ 正确。
- 覆盖(Override):子类重写父类的方法,仅存在于父子类之间;
- 重载(Overload):同一个类中定义多个同名、不同参数列表的方法。
- C:覆盖与重载是同一回事❌ 错误。二者语法规则、适用场景完全不同(覆盖是 “运行时多态”,重载是 “编译时多态”)。
- D:final 修饰的方法可以被覆盖,但不能被重载❌ 错误。
final修饰的方法不能被覆盖(子类无法重写),但可以被重载(同一个类中仍可定义同名、不同参数的 final 方法)。结论
答案:B。
187. (单选题) 在控制台编译一个Java程序,使用的命令正确的是( )。
A
javac Test.java
B
java Test.class
C
java Test.java
D
java Test
第 187 题(控制台编译 Java 程序)解析
核心考点
Java 编译 / 运行的命令行指令区分。
关键规则
操作 命令 说明 编译(.java→.class) javac 文件名.java如 javac Test.java,生成 Test.class;运行(.class) java 类名如 java Test,无需加.class 后缀;选项逐一分析
- A:
javac Test.java→ ✅ 正确(编译指令,将 Test.java 编译为 Test.class);- B:
java Test.class→ 错误(运行时无需加.class 后缀,正确为java Test);- C:
java Test.java→ 错误(java 命令不能直接运行.java 文件,需先编译);- D:
java Test→ 错误(这是运行指令,而非编译指令)。结论
答案:A。
205. (填空题)
使用Scanner类从键盘上输入一个整数:
Scanner sc=new Scanner(System.in);
System.out.print("请输入一个整数:");`
int n=sc. ();//输入一个整数
205 题答案与解析
答案:
nextInt核心考点
java.util.Scanner类读取基本类型数据的方法:
数据类型 Scanner 读取方法 整数 nextInt()浮点数 nextDouble()/nextFloat()布尔值 nextBoolean()字符串 next()(无空格)/nextLine()(整行)完整代码示例
java
运行
import java.util.Scanner; // 必须导入Scanner类 public class ScannerTest { public static void main(String[] args) { Scanner sc = new Scanner(System.in); System.out.print("请输入一个整数:"); int n = sc.nextInt(); // 读取控制台输入的整数 System.out.println("你输入的整数是:" + n); sc.close(); // 关闭Scanner,释放资源(建议添加) } }易错点提醒
- 若输入非整数(如字母、小数),会抛出
InputMismatchException;nextInt()不会读取换行符,若后续调用nextLine(),需注意处理残留的换行符(可先调用sc.nextLine()清空);- 必须导入
java.util.Scanner包,否则编译报错。
209. (填空题)
LocalDateTime now = LocalDateTime.now();
DateTimeFormatter fm = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
String time=fm. (now);
String s="2020-05-01";
LocalDateTime date=fm. (s);
第1空
第2空
209 题完整答案与解析
空号 答案 核心考点 第 1 空 format 将日期时间对象格式化为字符串 第 2 空 parse 将字符串解析为日期时间对象 第 1 空:format
解析
DateTimeFormatter的format方法用于将日期时间对象(如 LocalDateTime)转换为指定格式的字符串,语法:java
运行
String format(TemporalAccessor temporal)
- 入参
now是LocalDateTime类型,实现了TemporalAccessor接口,符合方法入参要求;- 执行后
time会得到如2025-12-19 15:30:20格式的字符串。第 2 空:parse
解析
DateTimeFormatter的parse方法用于将符合格式的字符串解析为日期时间对象,语法:java
运行
TemporalAccessor parse(CharSequence text)
- 入参
s是字符串类型,符合CharSequence入参要求;- 方法返回
TemporalAccessor,需强转为LocalDateTime(或直接用LocalDateTime.parse(s, fm))。注意(题干小瑕疵修正)
题干中
s="2020-05-01"的格式(仅日期)与fm指定的yyyy-MM-dd HH:mm:ss(日期 + 时间)不匹配,实际开发中需修正格式化器:java
运行
// 修正后完整代码 LocalDateTime now = LocalDateTime.now(); // 适配字符串s的格式(仅日期) DateTimeFormatter fm = DateTimeFormatter.ofPattern("yyyy-MM-dd"); String time = fm.format(now); // 格式化对象为字符串 String s = "2020-05-01"; // 解析字符串为LocalDateTime(需强转或用LocalDateTime.parse) LocalDateTime date = (LocalDateTime) fm.parse(s); // 更推荐的写法: LocalDateTime date = LocalDateTime.parse(s, fm);核心方法对比
方法名 作用 入参类型 返回值类型 format 对象 → 字符串(格式化) TemporalAccessor(如 LocalDateTime) String parse 字符串 → 对象(解析) CharSequence(如 String) TemporalAccessor 易错点提醒
- 方法名拼写:
format(非formate)、parse(非parase);- 格式匹配:解析时字符串格式必须与
ofPattern指定的格式完全一致,否则抛出DateTimeParseException;- 类型转换:
parse返回TemporalAccessor,需强转为LocalDateTime才能赋值给date变量。
215. (填空题) 由 修饰的方法叫做 ,可以在本类直接使用。
第1空
第2空
215 题完整答案与解析
空号 答案 核心考点 第 1 空 static 静态方法的修饰关键字 第 2 空 静态方法 被 static 修饰的方法的名称 第 1 空:static
解析
static(静态)是 Java 的核心关键字之一,用于标识属于类本身的成员(方法 / 变量),而非属于类的某个对象实例。
- 被
static修饰的方法,不依赖对象即可调用,可直接在本类中使用(无需创建类的实例);- 对比:非 static 方法(实例方法)必须通过
new创建对象后,才能通过对象调用。第 2 空:静态方法
解析
被
static修饰的方法统称为静态方法(也叫类方法),核心特性:
- 调用方式:
- 本类中:直接写方法名即可调用(无需
this或对象);- 其他类中:通过
类名.方法名()调用(如Math.random())。- 访问限制:静态方法只能直接访问类中的静态成员(静态变量 / 静态方法),不能直接访问实例成员(非 static 的变量 / 方法)。
示例代码
java
运行
public class StaticMethodDemo { // 静态方法(第1空:static修饰,第2空:静态方法) public static void sayHello() { System.out.println("Hello, static method!"); } public static void main(String[] args) { // 本类中直接使用静态方法(无需创建对象) sayHello(); // 输出:Hello, static method! } }易错点提醒
- 关键字拼写:
static(小写,非Static/STATIC);- 概念区分:
- 静态方法 ≠ 实例方法:实例方法需
new对象调用,静态方法直接调用;- 静态方法不能使用
this/super关键字(因为无对象关联)。- 补充:若题干语境允许,第 2 空也可填 “类方法”(静态方法的另一种称呼),但 “静态方法” 是更通用的标准答案。
244. (填空题)
修饰的成员变量或方法的可见范围为当前类。
没有权限修饰符修饰的成员变量或方法的可见范围为当前包。
修饰的成员变量或方法的可见范围是当前包及该类的子类,即可以被同一个包、该类的子类(可以不同包)的方法访问。
修饰的成员变量或方法可以被所有包中所有类中的方法访问。
第1空
第2空
第3空
244 题完整答案与解析
空号 答案 核心考点 第 1 空 private 私有权限,仅当前类可见 第 2 空 protected 受保护权限,包内 + 子类可见 第 3 空 public 公有权限,所有包 / 类可见 逐空解析
第 1 空:private
private(私有)是最严格的权限修饰符:
- 仅当前类内部可访问该成员(变量 / 方法);
- 即使是同一个包的其他类、子类(无论是否同包),都无法直接访问;
- 典型用法:封装对象的核心属性(如
private String name;),仅通过公有方法暴露访问。第 2 空:protected
protected(受保护)权限介于 “默认权限” 和 “public” 之间:
- 同包内的所有类可直接访问;
- 不同包的子类(通过继承)可访问(需通过子类对象 /
super调用);- 不同包的非子类无法访问;
- 核心作用:为子类开放必要的访问权限,同时限制非子类的访问。
第 3 空:public
public(公有)是最宽松的权限修饰符:
- 所有包中的所有类,无论是否同包、是否子类,都可直接访问;
- 典型用法:对外提供的接口方法(如
public void show())。权限修饰符完整对比表
修饰符 当前类 同包类 不同包子类 不同包非子类 private ✅ ❌ ❌ ❌ 默认(无) ✅ ✅ ❌ ❌ protected ✅ ✅ ✅ ❌ public ✅ ✅ ✅ ✅ 易错点提醒
- 关键字拼写:
private(非Privite/PRIVATE);protected(非protect/Protected);public(非Public);- 易混概念:
protected的 “子类可见” 仅针对不同包的子类,同包子类本质是 “同包可见”;- 默认权限(无修饰符)也叫 “包访问权限”,无需填写任何关键字。
252. (填空题) 在Java中引入包的关键字是 。
第1空
答案:import
补充说明:
在 Java 中,
import关键字用于引入其他包中的类或接口,方便在当前类中直接使用,无需写全限定类名。例如:java
运行
// 引入java.util包下的ArrayList类 import java.util.ArrayList; // 引入java.util包下的所有类/接口 import java.util.*;需要注意区分:
package是用于定义当前类所属包的关键字(写在类文件的第一行);import是用于引入其他包的关键字。
什么时候填package?
当题目考查定义 / 声明当前类所属包的关键字时,需要填写
package。核心区分(结合场景理解)
关键字 作用场景 填写时机(题目考点) 示例 package声明当前类属于哪个包(规定类的归属) 题目问 “定义包 / 声明类所属包的关键字”“Java 中声明包的关键字” 等 package com.example.demo;(写在 Java 文件第一行)import引入其他包中的类 / 接口(复用其他包的代码) 题目问 “引入包 / 导入类的关键字”“Java 中引入其他包的关键字” 等 import java.util.ArrayList;典型考题示例(填 package 的情况)
- 填空题:在 Java 中,用于声明当前类所在包的关键字是________。(答案:package)
- 选择题:下列哪个关键字用于定义 Java 类所属的包?(A. import B. package C. class D. static)(答案:B)
补充规则
package语句必须是 Java 源文件的第一条可执行语句(注释除外);- 一个 Java 文件只能有一个
package语句;- 如果没有写
package,类默认属于 “无名包”(默认包)。
278. (填空题) Java运行环境的英文缩写是 。(全部大写)
第1空
答案:JRE
核心考点
Java 运行环境的英文全称与缩写对应关系:
- 英文全称:Java Runtime Environment
- 英文缩写:JRE(要求全部大写)
补充说明
- JRE 的作用:包含 Java 虚拟机(JVM)和 Java 核心类库,是运行 Java 程序的最小环境,无需包含编译工具(如
javac)。- 与 JDK 的区别:
- JDK(Java Development Kit):Java 开发工具包,包含JRE + 编译、调试等开发工具(
javac、java等命令);- 开发 Java 程序需要安装 JDK,仅运行 Java 程序安装 JRE 即可。
需要我帮你整理Java 核心环境(JDK/JRE/JVM)的关系速记表吗?
Java 核心环境(JDK/JRE/JVM)关系速记表
名称 英文全称 缩写 核心作用 包含关系 Java 虚拟机 Java Virtual Machine JVM 执行字节码文件(.class),实现跨平台特性(一次编写,到处运行) JRE 的核心组件 Java 运行环境 Java Runtime Environment JRE 提供 Java 程序运行的最小环境,包含 JVM + 核心类库(如 java.lang 包) JDK 包含 JRE;运行程序只需 JRE Java 开发工具包 Java Development Kit JDK 提供 Java 程序开发 + 运行的完整环境,包含 JRE + 开发工具(javac、java 等命令) 最上层,开发必备 关键关联总结
- 依赖关系:
JDK ⊃ JRE ⊃ JVM- 使用场景
- 仅运行 Java 程序 → 安装JRE即可;
- 开发 Java 程序 → 必须安装JDK(自带 JRE,无需单独安装);
- 跨平台核心:JVM是跨平台的关键,不同系统(Windows/Linux)有不同的 JVM 实现,但都能执行相同的字节码。
283. (填空题) 在Java中构造方法的定义,对于A类的无参构造方法的声明是 。
第1空
答案:public A () {}
核心解析:
Java 中构造方法的定义需满足 3 个核心规则,以 A 类的无参构造方法为例:
- 方法名与类名完全一致:必须是
A(类名),不能是a/A1等;- 无返回值类型:不能写
void/int等,连return类型声明都没有;- 无参:括号内为空,无参数列表。
补充说明:
访问修饰符:示例中用
public(最常用),也可根据需求用protected/private(如单例模式),若省略则为默认访问权限(包访问权限),完整声明如:
- 默认权限:
A() {}- 私有:
private A() {}题目未指定访问权限时,public A() {}是最标准、通用的答案。无参构造的特殊点:
- 若类中未显式定义任何构造方法,Java 编译器会自动生成一个默认的无参构造方法;
- 若类中定义了有参构造,默认无参构造会失效,需手动声明(否则无法通过
new A()创建对象)。错误示例(避坑):
- ❌
public void A() {}(多了void,变成普通方法);- ❌
public A(int a) {}(有参,不符合 “无参” 要求);- ❌
public a() {}(方法名小写,与类名不一致)。
314. (填空题) Java中,将基本数据类型转换为对应的对象类型的过程称为__________,例如int类型对应的包装类是__________。
第1空
第2空
第 1 空答案
装箱(也可填 “自动装箱”,但核心答案为 “装箱”)
第 2 空答案
Integer
核心解析:
装箱(第 1 空)Java 中 “基本数据类型 → 对应的包装类对象” 的过程称为装箱;反之,“包装类对象 → 基本数据类型” 的过程称为拆箱。其中 JDK 5 + 支持的 “自动装箱” 是装箱的简化形式(如
int a = 10; Integer b = a;),题目未限定 “自动” 时,核心答案填 “装箱” 即可。Integer(第 2 空)Java8 大基本数据类型对应的包装类需精准记忆,核心对应关系:
基本数据类型 包装类(全大写开头,特殊:int→Integer、char→Character) int Integer char Character byte Byte short Short long Long float Float double Double boolean Boolean 易错提醒:
- 第 1 空切勿填 “封装”(封装是面向对象特性,与类型转换无关);
- 第 2 空切勿小写(
integer错误,必须首字母大写Integer)。
334. (判断题) 一个类继承了抽象类,则抽象类中的抽象方法需要在其子类中覆写。
A
对
B
错
答案
B(错)
核心解析:
该判断题的关键在于子类的类型—— 抽象类的抽象方法并非在所有子类中都必须覆写,分两种情况:
- 若子类是普通类:必须覆写抽象父类中所有抽象方法(否则编译报错);
- 若子类是抽象类:可以不覆写抽象父类的抽象方法(抽象类允许包含未实现的抽象方法)。
题目中仅说 “一个类继承了抽象类”,未限定子类是 “普通类”,默认包含 “抽象子类” 的情况,因此 “抽象方法需要在其子类中覆写” 的表述过于绝对,答案为错。
补充提醒:
- 抽象方法的核心规则:只有 “普通子类继承抽象类” 时,才强制覆写所有抽象方法;
- 易错点:忽略 “抽象子类可不覆写” 的特殊情况,容易误判为 “对”。
370. 阅读以下程序,写出运行结果_______________________________。
class SupperClass { | |
public SupperClass () { | |
fun(); | |
} | |
public void fun() { | |
System.out.println("in SupperClass "); | |
} | |
} | |
public class SubClass extends SupperClass { | |
public void fun() { | |
System.out.println("in SubClass "); | |
} | |
public static void main(String[] args) { | |
new SubClass(); | |
} | |
} |
程序运行结果
plaintext
in SubClass核心解析(更通俗的分步拆解)
想要理解这个结果,核心抓住 “Java 的多态(动态绑定)+ 子类构造的执行规则”,我们拆成 4 个关键步骤:
步骤 1:创建子类对象,先触发父类构造
执行
new SubClass()时,Java 规定:子类构造方法执行前,必须先执行父类的无参构造方法(哪怕子类没写构造,编译器也会自动生成默认构造,且第一行隐含super()调用父类构造)。步骤 2:父类构造里调用
fun()方法父类
SupperClass的构造方法里写了fun(),这里的关键是:fun()不是 “绑定父类”,而是绑定 “实际创建的对象类型”。步骤 3:多态(动态绑定)生效
因为最终创建的是
SubClass对象(子类对象),且子类重写了fun()方法,所以运行时会 “跳过父类的fun(),直接执行子类重写的fun()”—— 这就是 Java 的多态特性:方法调用看 “实际对象”,不是看 “当前代码所在的类”。步骤 4:执行子类
fun(),输出结果子类的
fun()方法打印in SubClass,因此最终输出这个结果。易错点彻底讲透
❌ 常见误区:“父类构造里的方法,肯定执行父类自己的版本”✅ 正确逻辑:只要方法被子类重写,且创建的是子类对象,无论这个方法调用写在父类哪里(构造、普通方法),都会执行子类的重写版本。
反向验证(帮你巩固)
如果把子类的
fun()方法删掉(子类不重写),代码变成:java
运行
class SupperClass { public SupperClass () { fun(); } public void fun() { System.out.println("in SupperClass "); } } public class SubClass extends SupperClass { public static void main(String[] args) { new SubClass(); } }此时运行结果会是
in SupperClass(因为没有子类重写,只能执行父类的fun())。
371. (程序阅读题)
阅读以下程序,写出输出结果_____________________________。
public class T1 { | |
static int x = 20; | |
public void amethod(int i) { | |
x = x*2; | |
i = i*2; | |
} | |
public static void main(String[] args) { | |
int i = 10; | |
T1 t1 = new T1(); | |
t1.amethod(i); | |
System.out.println(i + " and " + x); | |
} | |
} |
程序输出结果
plaintext
10 and 40核心解析(逐行拆解,通俗易懂)
要搞懂结果,核心分清 静态变量
x和 基本类型参数i的不同特性,我们一步步看:1. 变量初始化(程序启动时)
- 静态变量
x:属于T1类本身,全局唯一,初始化值为20;main方法中的局部变量i:仅在main方法内有效,初始化值为10。2. 调用
amethod(i)方法的关键过程java
运行
t1.amethod(i); // 把main里的i=10传给方法参数
- ✨ 核心规则(值传递):Java 中基本数据类型(int、double 等)作为方法参数时,传递的是值的副本,不是变量本身。也就是说:方法里的
i是main中i的 “复印件”,两者是独立的变量,修改复印件不会影响原件。- 方法内执行:
x = x*2:静态变量x是全局的,修改后真实值从20变成40(全局生效);i = i*2:仅修改方法内的 “副本 i”(变成20),main里的 “原件 i” 还是10。3. 输出结果
执行
System.out.println(i + " and " + x)时:
main中的i:没被修改,还是10;- 静态变量
x:已被改为40;最终打印:10 and 40。易错点彻底讲透
❌ 常见误区:以为方法里改了
i,main里的i也会变✅ 正确逻辑:
- 基本类型参数是 “值传递”→ 传副本,方法内修改不影响原变量;
- 静态变量是 “类级变量”→ 全局共享,任何地方修改都会改变真实值。
验证小实验(帮你巩固)
如果想让
main里的i也变成20,可以让方法返回修改后的值:java
运行
public class T1 { static int x = 20; // 新增返回值 public int amethod(int i) { x = x*2; i = i*2; return i; // 返回修改后的i } public static void main(String[] args) { int i = 10; T1 t1 = new T1(); i = t1.amethod(i); // 接收返回值,覆盖原i System.out.println(i + " and " + x); // 输出20 and 40 } }
创建一个TCP服务程序,该程序运行在port为6000,完成以下代码填空。
_______【1】_________ ss = new ________【2】____________; //创建服务器套接字对象 | |
while(true){ | |
Socket clientRequest = ________【3】_____________ ; //监听客户端连接请求 | |
|
|
可以通过使用URL和URLConnection类型来完成基于HTTP/FTP的远程通讯,完成以下代码读取百度网站www.baidu.com的首页内容:
URL baiduFirstPage = 【1】 ; | |
InputStream is = baiduFirstPage. 【2】 ; | |
BufferedReader br = 【3】 ; | |
String line = null; | |
while((line = br.readLine()) != null) | |
System.out.println(line); |
(琐碎知识点 期末复习笔记自用)&spm=1001.2101.3001.5002&articleId=156064122&d=1&t=3&u=7447ae1337544928b85f3a96e48c6c66)
914

被折叠的 条评论
为什么被折叠?



