阶段复习一 Java基础(全)(琐碎知识点 期末复习笔记自用)

Python3.8

Python 是一种高级、解释型、通用的编程语言,以其简洁易读的语法而闻名,适用于广泛的应用,包括Web开发、数据分析、人工智能和自动化脚本

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.langjava.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

本题中arrint类型数组,因此所有元素默认值为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 数组元素默认值为0arr[1]的值是0,因此输出0

补充:关键易错点

  1. 数组下标从0开始:arr[1]是数组第二个元素,未越界;
  2. 静态变量初始化优先级:类变量在 main 方法执行前完成初始化,无需手动赋值即可访问;
  3. 基本类型 vs 引用类型数组默认值:切勿混淆(如int[]默认0String[]默认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),而当originalnull时,相当于尝试访问null引用的成员变量,直接触发NullPointerException

步骤 3:排除干扰项

  • A 选项IllegalArgumentException是 “参数合法但值非法”(比如给substring传负数),但null不是 “合法值”,而是空引用,因此不触发;
  • B 选项:Java 标准库中无此异常,直接排除;
  • D 选项:代码无算术运算,完全不相关,排除;
  • C 选项strnull,传入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异常处理结构,声明最终执行的代码块(无论是否抛异常都会执行),与 “常量” 无关。
finalizeObject类的一个方法(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_SCOREPIfinal修饰后,赋值后无法修改,符合 “成员常量” 的定义。

最终结论

答案是 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()实例化的核心原因

  1. 类的类型合法:去掉abstract后,J_Class变为普通类(非抽象类),普通类允许通过new直接实例化;
  2. 构造方法匹配:类中显式定义了public J_Class()无参构造方法,完全匹配new J_Class()的调用形式(无参构造调用);
  3. 访问权限合规:构造方法是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/xb/y)不同,参数列表(int + float)完全一致 —— 方法重载要求参数列表 “实质不同”,参数名只是标识符,不影响重载判定,因此编译报错(重复定义方法)。

2. 选项 B(错误)

java

运行

float fun1(int a,float b){  }
float fun2(int a,float b){  }

错误原因:方法名(fun1 vs fun2)不同 —— 方法重载的前提是 “方法名相同”,此为两个不同名的普通方法,并非重载。

3. 选项 C(错误)

java

运行

int fun(int a,float b){  }
float fun(int a,float b){  }

错误原因仅返回值类型(int vs float)不同,参数列表完全一致 —— 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++ 等主流语言为例),合法标识符需满足:

  1. 由字母(A-Z/a-z)、数字(0-9)、下划线(_)、美元符($)组成;
  2. 不能以数字开头
  3. 不能是语言的关键字 / 保留字
  4. 区分大小写(本题不涉及)。
选项分析
  • 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 的方式输出,也无法正常执行完成。

补充:关键易错点

  1. 数组索引规则:长度为 n 的数组,索引范围是 0 ~ n-1,这是 Java 数组的核心规则,越界会直接抛出运行时异常;
  2. int 数组默认值int 类型数组未显式赋值时,每个元素的默认值为 0,而非 1 或其他数值;
  3. 循环边界:本题循环条件 count<=5 是典型错误,正确的循环条件应为 count<5(避免越界)。

扩展:修正后的代码与输出

若将循环条件改为 count<5,则循环执行 5 次,输出 5 个00 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 个。

补充:关键规则总结

  1. 对象的判定标准
    • 引用类型(数组、类、接口、String 等)通过 new 创建的实例 = 对象;
    • 基本数据类型(int/byte/short/long/float/double/char/boolean)的变量 = 数值 / 字符,不是对象;
  2. 特殊说明:
    • 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 0case 1case 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 核心规则总结

  1. default 执行时机:所有 case 都不匹配时执行(位置不影响,即使写在最前面,也会先判断 case 再执行 default);
  2. 穿透规则:分支后无 break,会按顺序执行后续所有分支,直到遇到 break 或 switch 结束;
  3. 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 自减后的值循环是否执行
155(非 0,true)4执行(空循环体)
244(非 0,true)3执行(空循环体)
333(非 0,true)2执行(空循环体)
422(非 0,true)1执行(空循环体)
511(非 0,true)0执行(空循环体)
600(false)-1终止循环
步骤 3:最终结果

循环终止后,a 的值为 -1,执行 System.out.println(a) 输出 -1

对题目选项的分析

  • 选项 A(0):错误。循环终止时 a 已自减为 - 1,并非 0;
  • 选项 B(4321):错误。循环体为空,无任何输出,且最终 a 的值不是该序列;
  • 选项 C(54321):错误。同理,无输出,且 a 最终值不符;
  • 选项 D(语法错误):错误。代码语法完全合法(while(a--); 是合法的空循环写法)。

补充:关键易错点

  1. 空循环体识别while(a--); 后的分号表示循环体为空,仅执行条件判断和自减,无任何打印操作;
  2. 后置自减的时机:判断条件时用 “原值”,判断后立即自减,因此当 a=0 时,判断为 false,但仍会执行一次自减(0→-1);
  3. 题目疏漏说明:此类题目大概率是选项漏了 -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

补充:构造方法的关键特性

  1. 必须与类名完全相同,且无返回类型(不能写void);
  2. 对象通过new关键字创建时,构造方法会自动调用,且仅调用一次;
  3. 若未手动定义构造方法,编译器会自动生成无参空构造方法
  4. 支持重载(多个构造方法,参数列表不同),用于灵活初始化成员变量。

简言之:构造方法的核心使命是在对象诞生时,完成成员变量的初始化,确保对象创建后处于合法、可用的状态。

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 Bike
final可访问,但不能被继承public final class Car
private仅能修饰内部类,外部类不可用-(外部类不能用 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 包包含工具类(如 ArrayListHashMapScanner 等),属于常用包,但不会默认导入,使用时必须手动写 import java.util.XXX;(如 import java.util.Scanner;),否则编译报错。

2. 选项 B(错误)

java.lang 包是明确的默认导入包,因此 “其它都不是” 的表述不成立。

3. 选项 C(错误)

Java 中不存在 java.sys 这个标准包,属于干扰项(系统相关功能主要在 java.lang.Systemjava.nio 等包中,无 java.sys 包)。

4. 选项 D(正确)

java.lang 包是 Java 语言的核心包,包含最基础、最必需的类:

  • 基本类型包装类(IntegerStringBoolean 等);
  • 核心类(ObjectSystemThreadMath 等);
  • 异常类(ExceptionRuntimeException 等)。

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 原始数据类型的包装类」和「字符串类型的本质」,先明确核心概念,再逐一分析选项:

第一步:关键概念厘清

  1. 原始数据类型(基本类型):Java 的 8 种基本类型(byte/short/int/long/float/double/char/boolean),无包装、无方法,仅存值;
  2. 包装类:为 8 种基本类型提供的 “对象版” 类(如Integer对应intCharacter对应char),用于将基本类型封装为对象;
  3. 字符串类型(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 基本类型与包装类对应表

原始基本类型对应的包装类核心用途
byteByte封装字节型数值
shortShort封装短整型数值
intInteger封装整型数值(最常用)
longLong封装长整型数值
floatFloat封装单精度浮点型数值
doubleDouble封装双精度浮点型数值
charCharacter封装字符型(唯一非数字包装类)
booleanBoolean封装布尔值

关键易错点提醒

  • 切勿混淆StringCharacterString是字符序列的引用类型,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

    运行

    int i = 0;
    while(i < 5) {
        System.out.println(i);
        i++;
    }
    
    可等价转为 for 循环:

    java

    运行

    for(int i = 0; i < 5; i++) {
        System.out.println(i);
    }
    
    因此 while 能实现的功能,for 都能实现。
选项 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

补充:关键规则强化

  1. 循环条件的核心要求:
    • 必须是boolean类型表达式(直接值true/false、比较表达式、返回 boolean 的方法调用等);
    • 赋值语句(=)、算术表达式(如i+5)、常量 / 变量(如5/i)等非 boolean 类型,均不能作为循环条件。
  2. 易混淆点:
    • i == 5(比较,返回 boolean)→ 合法;
    • i = 5(赋值,返回 int)→ 非法;
  3. 编译报错示例:

    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

    运行

    char[] arr = new char[1];
    arr[0] = 65; // 65是'A'的Unicode编码
    System.out.println(arr[0]); // 输出'A'
    
    (注:题目中 “D” 应为笔误,核心是 “可以存储整型数值” 这一结论成立)。
选项 C:可以仅通过数组名来访问数组
  • 错误:数组的访问必须通过下标(索引)(如arr[0]),仅写数组名(如arr)表示数组对象的引用,无法直接访问数组元素:
    • 示例:char[] arr = {'a','b'}; System.out.println(arr); 不会直接输出元素,而是输出数组的内存地址(如[C@1b6d3586)。
选项 D:数组不能转换为字符串
  • 错误:char 数组可以直接转换为字符串,Java 提供了多种方式:
    1. 通过String构造方法:char[] arr = {'h','e','l','l','o'}; String s = new String(arr);(s 的值为 "hello");
    2. 通过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 = 0for循环的初始化部分声明,属于循环体的局部变量,作用域仅限于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(); // 合法

五、常见错误与注意事项

  1. 父类引用指向父类对象,直接向下转型

    java

    运行

    Animal animal = new Animal();
    Cat cat = (Cat) animal; // 运行时抛出ClassCastException
    
  2. 父类引用指向其他子类对象,向下转型

    java

    运行

    Animal animal = new Dog();
    Cat cat = (Cat) animal; // 运行时抛出ClassCastException(animal实际是Dog,不是Cat)
    
  3. instanceof的作用
    • instanceof判断的是 “对象的实际类型”,而非引用类型;
    • 若父类引用为nullinstanceof返回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(); // 输出:猫吃小鱼干
}

四、向上转型的核心特性

  1. 自动转换,无需强制类型转换:因为子类是父类的 “特殊化”,JVM 默认允许子类对象赋值给父类引用,无需像向下转型那样加(父类类型)

  2. “看父类,用子类”

    • 编译期:编译器只认父类类型,因此只能调用父类中存在的方法 / 属性(子类特有成员不可见);
    • 运行期:JVM 执行的是子类重写后的方法实现(多态的 “动态绑定”)。
  3. 安全性:向上转型是 “安全的”,不会抛出ClassCastException(因为子类一定是父类的一种)。

五、向上转型的用途

  1. 简化代码,提高扩展性:方法参数用父类类型,可接收任意子类对象,无需为每个子类写重载方法(如上面的feedAnimal方法)。
  2. 实现多态:这是向上转型的核心价值 —— 父类引用指向不同子类对象,调用同一方法时执行不同逻辑,符合 “开闭原则”(新增子类无需修改原有代码)。

六、向上转型 vs 向下转型 对比

特性向上转型向下转型
语法自动转换(无需强制)强制转换(需加(子类类型)
前提父类引用指向子类对象父类引用实际指向目标子类对象
访问范围只能访问父类成员可访问子类特有成员
安全性安全(无异常)不安全(需用instanceof判断)
核心目的实现多态、简化代码调用子类特有方法

总结

向上转型的核心写法:父类类型 引用 = new 子类类型();

核心记住两点:

  1. 编译期看 “父类”(只能调父类方法),运行期用 “子类”(执行子类重写的逻辑);
  2. 向上转型是实现 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 文件名.javajavac 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,释放资源(建议添加)
    }
}
易错点提醒
  1. 若输入非整数(如字母、小数),会抛出InputMismatchException
  2. nextInt()不会读取换行符,若后续调用nextLine(),需注意处理残留的换行符(可先调用sc.nextLine()清空);
  3. 必须导入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
解析

DateTimeFormatterformat方法用于将日期时间对象(如 LocalDateTime)转换为指定格式的字符串,语法:

java

运行

String format(TemporalAccessor temporal)
  • 入参nowLocalDateTime类型,实现了TemporalAccessor接口,符合方法入参要求;
  • 执行后time会得到如2025-12-19 15:30:20格式的字符串。
第 2 空:parse
解析

DateTimeFormatterparse方法用于将符合格式的字符串解析为日期时间对象,语法:

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
易错点提醒
  1. 方法名拼写:format(非formate)、parse(非parase);
  2. 格式匹配:解析时字符串格式必须与ofPattern指定的格式完全一致,否则抛出DateTimeParseException
  3. 类型转换:parse返回TemporalAccessor,需强转为LocalDateTime才能赋值给date变量。

215. (填空题) 由                     修饰的方法叫做                     ,可以在本类直接使用。

第1空

第2空

215 题完整答案与解析

空号答案核心考点
第 1 空static静态方法的修饰关键字
第 2 空静态方法被 static 修饰的方法的名称
第 1 空:static
解析

static(静态)是 Java 的核心关键字之一,用于标识属于类本身的成员(方法 / 变量),而非属于类的某个对象实例。

  • static修饰的方法,不依赖对象即可调用,可直接在本类中使用(无需创建类的实例);
  • 对比:非 static 方法(实例方法)必须通过new创建对象后,才能通过对象调用。
第 2 空:静态方法
解析

static修饰的方法统称为静态方法(也叫类方法),核心特性:

  1. 调用方式:
    • 本类中:直接写方法名即可调用(无需this或对象);
    • 其他类中:通过类名.方法名()调用(如Math.random())。
  2. 访问限制:静态方法只能直接访问类中的静态成员(静态变量 / 静态方法),不能直接访问实例成员(非 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!
    }
}
易错点提醒
  1. 关键字拼写:static(小写,非Static/STATIC);
  2. 概念区分:
    • 静态方法 ≠ 实例方法:实例方法需new对象调用,静态方法直接调用;
    • 静态方法不能使用this/super关键字(因为无对象关联)。
  3. 补充:若题干语境允许,第 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
易错点提醒
  1. 关键字拼写:
    • private(非Privite/PRIVATE);
    • protected(非protect/Protected);
    • public(非Public);
  2. 易混概念:
    • 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 的情况)

  1. 填空题:在 Java 中,用于声明当前类所在包的关键字是________。(答案:package)
  2. 选择题:下列哪个关键字用于定义 Java 类所属的包?(A. import B. package C. class D. static)(答案:B)

补充规则

  • package 语句必须是 Java 源文件的第一条可执行语句(注释除外);
  • 一个 Java 文件只能有一个package语句;
  • 如果没有写package,类默认属于 “无名包”(默认包)。

278. (填空题) Java运行环境的英文缩写是           。(全部大写)

第1空

答案:JRE

核心考点

Java 运行环境的英文全称与缩写对应关系:

  • 英文全称:Java Runtime Environment
  • 英文缩写:JRE(要求全部大写)
补充说明
  1. JRE 的作用:包含 Java 虚拟机(JVM)和 Java 核心类库,是运行 Java 程序的最小环境,无需包含编译工具(如javac)。
  2. 与 JDK 的区别
    • JDK(Java Development Kit):Java 开发工具包,包含JRE + 编译、调试等开发工具(javacjava等命令);
    • 开发 Java 程序需要安装 JDK,仅运行 Java 程序安装 JRE 即可。

需要我帮你整理Java 核心环境(JDK/JRE/JVM)的关系速记表吗?

Java 核心环境(JDK/JRE/JVM)关系速记表

名称英文全称缩写核心作用包含关系
Java 虚拟机Java Virtual MachineJVM执行字节码文件(.class),实现跨平台特性(一次编写,到处运行)JRE 的核心组件
Java 运行环境Java Runtime EnvironmentJRE提供 Java 程序运行的最小环境,包含 JVM + 核心类库(如 java.lang 包)JDK 包含 JRE;运行程序只需 JRE
Java 开发工具包Java Development KitJDK提供 Java 程序开发 + 运行的完整环境,包含 JRE + 开发工具(javac、java 等命令)最上层,开发必备

关键关联总结

  1. 依赖关系JDK ⊃ JRE ⊃ JVM
  2. 使用场景
    • 仅运行 Java 程序 → 安装JRE即可;
    • 开发 Java 程序 → 必须安装JDK(自带 JRE,无需单独安装);
  3. 跨平台核心JVM是跨平台的关键,不同系统(Windows/Linux)有不同的 JVM 实现,但都能执行相同的字节码。

283. (填空题) 在Java中构造方法的定义,对于A类的无参构造方法的声明是               

第1空

答案:public A () {}

核心解析:

Java 中构造方法的定义需满足 3 个核心规则,以 A 类的无参构造方法为例:

  1. 方法名与类名完全一致:必须是A(类名),不能是a/A1等;
  2. 无返回值类型:不能写void/int等,连return类型声明都没有;
  3. 无参:括号内为空,无参数列表。

补充说明:

  1. 访问修饰符:示例中用public(最常用),也可根据需求用protected/private(如单例模式),若省略则为默认访问权限(包访问权限),完整声明如:

    • 默认权限:A() {}
    • 私有:private A() {}题目未指定访问权限时,public A() {} 是最标准、通用的答案。
  2. 无参构造的特殊点

    • 若类中未显式定义任何构造方法,Java 编译器会自动生成一个默认的无参构造方法;
    • 若类中定义了有参构造,默认无参构造会失效,需手动声明(否则无法通过new A()创建对象)。
  3. 错误示例(避坑)

    • ❌ public void A() {}(多了void,变成普通方法);
    • ❌ public A(int a) {}(有参,不符合 “无参” 要求);
    • ❌ public a() {}(方法名小写,与类名不一致)。

314. (填空题) Java中,将基本数据类型转换为对应的对象类型的过程称为__________,例如int类型对应的包装类是__________。

第1空

第2空

第 1 空答案

装箱(也可填 “自动装箱”,但核心答案为 “装箱”)

第 2 空答案

Integer

核心解析:

  1. 装箱(第 1 空)Java 中 “基本数据类型 → 对应的包装类对象” 的过程称为装箱;反之,“包装类对象 → 基本数据类型” 的过程称为拆箱。其中 JDK 5 + 支持的 “自动装箱” 是装箱的简化形式(如int a = 10; Integer b = a;),题目未限定 “自动” 时,核心答案填 “装箱” 即可。

  2. Integer(第 2 空)Java8 大基本数据类型对应的包装类需精准记忆,核心对应关系:

    基本数据类型包装类(全大写开头,特殊:int→Integer、char→Character)
    intInteger
    charCharacter
    byteByte
    shortShort
    longLong
    floatFloat
    doubleDouble
    booleanBoolean

易错提醒:

  • 第 1 空切勿填 “封装”(封装是面向对象特性,与类型转换无关);
  • 第 2 空切勿小写(integer错误,必须首字母大写Integer)。

334. (判断题) 一个类继承了抽象类,则抽象类中的抽象方法需要在其子类中覆写。

A

B

答案

B(错)

核心解析:

该判断题的关键在于子类的类型—— 抽象类的抽象方法并非在所有子类中都必须覆写,分两种情况:

  1. 若子类是普通类:必须覆写抽象父类中所有抽象方法(否则编译报错);
  2. 若子类是抽象类:可以不覆写抽象父类的抽象方法(抽象类允许包含未实现的抽象方法)。

题目中仅说 “一个类继承了抽象类”,未限定子类是 “普通类”,默认包含 “抽象子类” 的情况,因此 “抽象方法需要在其子类中覆写” 的表述过于绝对,答案为错。

补充提醒:

  • 抽象方法的核心规则:只有 “普通子类继承抽象类” 时,才强制覆写所有抽象方法;
  • 易错点:忽略 “抽象子类可不覆写” 的特殊情况,容易误判为 “对”。

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 等)作为方法参数时,传递的是值的副本,不是变量本身。也就是说:方法里的imaini的 “复印件”,两者是独立的变量,修改复印件不会影响原件。
  • 方法内执行:
    • 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

易错点彻底讲透

❌ 常见误区:以为方法里改了imain里的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);

您可能感兴趣的与本文相关的镜像

Python3.8

Python3.8

Conda
Python

Python 是一种高级、解释型、通用的编程语言,以其简洁易读的语法而闻名,适用于广泛的应用,包括Web开发、数据分析、人工智能和自动化脚本

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值