2026/11/3 6:47:27

Java初级笔试题解析:高频失分点与看代码说输出

Java初级笔试题解析:高频失分点与看代码说输出 简介面向Java初学者与准备技术笔试的求职者这份金航数码Java笔试题围绕基础语法与面向对象核心考点整理可用于自测语法掌握程度、熟悉单项选择题的出题方式并查漏补缺。压缩包内共1个doc文件约98KB题目以单项选择题为主体覆盖do-while循环、字符串与整数拼接、变量命名规则、抽象方法声明、继承关系、数组与Object类型转换、静态变量作用域及try-catch-finally异常处理等内容并附有逐题解析便于对照答案理解执行流程与易错细节。已有396人学习适合面试前进行短时练习也可作为Java入门阶段的测验材料或课堂练习适合打印后练习或直接在电脑上作答通过复盘循环控制、构造器调用顺序、异常捕获匹配和多层继承等常见考点快速定位薄弱环节并巩固基础。1. 开场这套 Java 初级笔试题真正卡人的不是概念而是“输出结果”很多人拿到这套 Java 初级笔试题的第一反应是初级嘛语法题背背概念就过了。真坐下来做一遍就会发现20 道选择题里超过一半是“给你一段代码问输出什么”而最容易被扣分的恰恰是初始化顺序、值传递、finally 执行时机、抽象方法有没有实现这几类“看着眼熟、一写就错”的题。这场笔试考的不是你知不知道synchronized这个词而是你能不能在一分钟内把Super1, Super2, Super3, Sub2的顺序排对。后面按考点模块拆语法与流程控制、面向对象与初始化、异常线程与 SQL、五个高频失分点最后给一套考场上的答题节奏和押题优先级。适合正在准备 Java 初级岗笔试、或者想用一套真题把基础漏洞一次性补掉的人。2. 表达式与流程控制七道“看代码说输出”的题怎么秒判这一章对应原卷的第 1、2、3、6、7、9 题加上机上第 22 题的递归。它们看起来分散实际考的是同一件事你能不能按 Java 的真实执行顺序一步一步把变量的值推出来而不是靠“感觉像”。2.1 字符串拼接与变量命名先看类型再看字符集第 2 题是送分题也是最容易多想的一道String s Hello 9 1; System.out.println(s); // Hello91规则只有一条从左往右结合只要参与运算的某一端是String这一整段就退化成字符串拼接。Hello 9先得到Hello9再 1得到Hello91。很多人会下意识算成Hello10是因为脑子里先做了9 1。如果题目改成9 1 Hello答案才是10Hello。第 3 题考标识符四个声明里挑编译错误String #name Jane Doe; // 非法# 不能做首字符 int $age 24; // 合法$ 是允许的 Double _height 123.5; // 合法_ 是允许的 double ~temp 37.5; // 非法~ 不在允许字符集里Java 标识符的允许开头只有三类字母、下划线_、美元符$后续字符可以再加数字。#和~都不在集合内所以是 2 处编译错误选 C。这类题不要逐个“读起来怪不怪”直接按字符集过一遍比语感可靠。2.2 do-while 与 for-break边界到底落在哪第 1 题是整卷最能拉开差距的一道选择题int i 10; do { i i / 2; } while (i-- 1); System.out.println(i); // -1do-while先执行后判断而i--是“先取值比较再自减”。把每一轮写清楚就不难轮次进入时 ii i/2 后判断 i-- 1判断后 i11055 1 真42422 1 真13100 1 假退出-1最后打印的是判断之后、已经自减过的i所以是 -1选 D。这道题的坑不在循环而在i--与--i的区别以及“退出循环后变量还保持着最后一次自减的结果”。第 6 题换个方向考 breakfor (int i 0; i 10; i) { if (i 6) break; } System.out.println(i);循环变量i定义在 for 的括号里按理说出了循环就不可见——但这段代码本身在System.out.println(i)处就已经编译不过。退一步讲就算把i提到外面声明break发生在i 7的那一刻跳出后i仍然是 7不是 6 也不是 10。很多人答 6是把“最后一次正常执行循环体的值”和“触发 break 的值”混了。2.3 数组、Object 与值传递三题连着的陷阱第 7 题是典型的“被类型转换吓住”Object obj new int[] { 1, 2, 3 }; // line 1 int[] someArray (int[]) obj; // line 2 for (int i : someArray) { // line 3 System.out.print(i ); }数组在 Java 里是对象int[]向上转型成Object合法第 2 行是向下强转运行期 obj 指向的确实是一个int[]所以也合法第 3 行增强 for 遍历int[]同样合法。输出1 2 3选 A。这道题失分的人多半是记成了“基本类型数组不能转 Object”实际上不能转的是基本类型本身不是数组。第 9 题考值传递private static int a; public static void main(String[] args) { modify(a); System.out.println(a); // 0 } public static void modify(int a) { a; }modify的形参a和类里的静态字段a同名但它是方法栈里的一个副本a改的是副本静态字段纹丝不动输出 0选 A。Java 只有值传递方法内部拿到的永远是拷贝——对象拷贝的是引用地址所以能改对象内容但改不了“指向谁”。2.4 递归斐波那契那道上机题先讲清楚它为什么慢上机第 22 题要求用递归求第 30 位public class TestNum { static int ComputNum(int index) { // 前两项固定为 1递归出口 return index 2 ? 1 : ComputNum(index - 1) ComputNum(index - 2); } }写法没错index 2是递归出口index - 1和index - 2是规模缩小。但直接这么交第 30 项要算几十万次重复子问题耗时肉眼可见。想加分就补一句记忆化static long[] memo new long[100]; static long fib(int n) { if (n 2) return 1; if (memo[n] ! 0) return memo[n]; // 命中缓存直接返回 memo[n] fib(n - 1) fib(n - 2); return memo[n]; }参数说明n是第几项从 1 开始memo下标与项号对齐memo[0]空着不用。复杂度从指数级降到 O(n)。笔试里能把“递归 缓存”一起写出来比只写三行递归更能说明你考虑过性能。3. 面向对象继承、抽象、构造器与单例四类题的固定答法这一块对应第 4、5、8、12、13、14、15、16、19、20 题以及上机第 24 题的单例。题目数量最多但套路最固定——几乎每道题都能用一张顺序表或一句规则收掉。3.1 abstract 与抽象类第 4 题和第 13 题是一对第 4 题问关于 abstract 的说法哪个正确答案是 D声明抽象方法不可写出大括号。展开记三条abstract可以修饰类和方法不能修饰字段所以 A 错抽象方法没有方法体连空的一对{}都不能写所以 B、C 错有抽象方法的类必须是抽象类抽象类不能实例化。第 13 题就是这条规则的实战版abstract class MineBase { abstract void amethod(); static int i 1; } public class Sub extends MineBase { public static void main(String[] args) { int[] ar new int[5]; for (i 0; i ar.length; i) { System.out.print(ar[i]); } } }Sub不是抽象类却没有实现amethod()编译直接失败选 C。很多人看到new int[5]默认全是 0就顺手选了00000这属于被表面输出带跑。看到“抽象父类 具体子类”的组合第一反应应该是数抽象方法有没有全部实现而不是先看 main 里在打印什么。3.2 继承与构造器第 8 题、第 12 题共用一张顺序表第 8 题简单考默认构造器会往上调class Base { Base() { System.out.print(Base); } } public class Alpha extends Base { public static void main(String[] args) { new Alpha(); // 先调父类构造器输出 Base new Base(); // 再输出一个 Base } }结果BaseBase选 B。子类构造器第一行默认是super()就算你没写编译器也会补上。第 12 题把静态初始化、实例初始化、父类构造器全叠在一起class Super { Super(int i) { System.out.print(Super i ,); } } public class Sub extends Super { static Super s1 new Super(1); // 静态字段类加载时执行一次 Super s2 new Super(3); // 实例字段每次 new 都执行 Sub(int i) { super(i); System.out.print(Sub i ,); } public static void main(String[] args) { Super c1 new Sub(2); } }按顺序拆类加载时静态字段s1输出Super1new Sub(2)进入构造器第一句super(2)输出Super2回到子类做实例字段初始化s2输出Super3最后执行Sub构造器体输出Sub2。合起来是Super1,Super2,Super3,Sub2选 A。这类题我一般让人直接背顺序父类静态 → 子类静态 → 父类实例字段与实例块 → 父类构造器体 → 子类实例字段与实例块 → 子类构造器体。背下来之后任何初始化顺序题都是往这张表里填。3.3 单继承与“白盒复用”第 5、16 题考的是同一件事第 5 题答案是 C一个子类只能有一个直接父类一个父类可以有多个子类。Java 不支持类的多继承但支持多层继承所以“多个间接父类”是存在的别说成“完全不能多继承”。第 16 题问关于继承表述错误的是答案 D。D 说“继承是白盒复用对父类的修改不会影响到子类”前半句对、后半句错——正因为父类的实现细节对子类可见父类一改子类行为可能跟着变这才叫打破封装。答题时抓住关键词白盒、暴露实现、强耦合三个词出现基本就是“继承的缺点”。第 14、15 题属于设计原则与设计模式的常识题。开闭原则选 A对扩展开放、对修改关闭。设计模式两大主题这题给的是 B对象组合与类的继承——答这类题不要纠结教材版本抓“复用靠继承、扩展靠组合”这条主线即可。3.4 单例模式上机题三种写法与阅卷人看什么第 24 题要求写一个类名为Singleton的单例。原卷给的答案骨架对但有两处硬伤getInstance少了方法括号而且没有考虑多线程。基础版这样写public class Singleton { // 类加载时就创建天生线程安全 private static final Singleton INSTANCE new Singleton(); private Singleton() {} // 私有构造器堵住外部 new public static Singleton getInstance() { return INSTANCE; } }想写懒加载就加双重检查注意volatile不能省public class Singleton { private static volatile Singleton instance; // 禁止指令重排 private Singleton() {} public static Singleton getInstance() { if (instance null) { synchronized (Singleton.class) { if (instance null) { instance new Singleton(); } } } return instance; } }阅卷人看三点构造器是不是私有、实例是不是静态、获取方法是不是静态且带括号。这三点齐了就是及格线再补上volatile和同步块就是加分项。3.5 static 与构造方法第 19、20 题一句话记忆第 19 题问构造函数描述错误的答案 A。构造函数没有返回类型不是“返回 void”——void都不能写写了就变成普通方法。第 20 题问哪个关键字修饰的方法可以直接用类名调用答案 Astatic。这两题属于必须拿下的送分题记两句就够构造器与类同名、无返回类型静态方法属于类不属于对象。4. 异常、线程与 SQL三类“必须按顺序想”的题这一章的题有个共同点不能凭印象答必须按执行顺序或者语法结构一步步推。第 10、11 题考异常流转第 17、18 题考线程基础第 23 题考 SQL 三连问。4.1 try-catch-finally第 10 题的输出到底是几个字母public static void main(String[] args) { try { method1(); System.out.print(A); } catch (Exception ex) { System.out.print(B); } finally { System.out.print(C); } System.out.print(D); } public static void method1() { int j 0; int i 10 / j; }method1()里除零抛ArithmeticExceptiontry里后面的A不会执行直接进catch打印Bfinally无论是否异常都执行打印Cfinally结束后方法继续往下走打印D。结果是BCD选 D。失分点很集中很多人答BC把finally当成了方法出口。finally只保证“离开 try/catch 结构前一定执行”不负责终止后面的代码——除非你在里面写了return。4.2 异常匹配第 11 题为什么是父类 catch 接住class Exc0 extends Exception {} class Exc1 extends Exc0 {} try { throw new Exc1(); } catch (Exc0 e0) { System.out.println(Ex0 caught); } catch (Exception e) { System.out.println(exception caught); }抛出的是Exc1第一个 catch 的参数是它的父类Exc0向上转型成立所以匹配成功输出Ex0 caught选 A后面的 catch 不再执行。catch 是从上往下匹配一旦命中就跳出。延伸考点如果把两个 catch 顺序调换先写catch (Exception e)再写catch (Exc0 e0)会直接编译失败因为父类异常已经把子类异常全覆盖了后面的分支永远不可达。这个规则和第 4 题“抽象方法不能有大括号”一样属于必须条件反射的硬规则。4.3 线程run() 与 synchronized 的分工第 17 题问哪个方法定义线程执行体答案 Crun()。第 18 题问哪个关键字给对象加互斥锁答案 Dsynchronized。这两题本身不难但答完最好能补一句区别面试官顺着往下问时你就占先手对比项start()run()是否开新线程是否就是普通方法调用调用次数只能一次可重复调用底层动作启动线程后由 JVM 回调 run()直接在当前线程执行方法体synchronized修饰实例方法锁的是当前对象修饰静态方法锁的是 Class 对象修饰代码块锁的是括号里的对象。三个位置对应三把锁考试里经常拿“锁的是谁”做文章。4.4 SQL 三题子查询、having、分组统计的写法第 23 题给了部门表和员工表三小问分别考子查询、分组过滤、多表连接。第一问薪金比“张某某”多的员工姓名SELECT Ename FROM EMP WHERE Sal (SELECT Sal FROM EMP WHERE Ename 张某某);子查询返回单值可以直接用比较运算符接。注意内层如果可能返回多行就要改成 ALL或 ANY这题因为姓名唯一单值没问题。第二问最低薪金大于 2000 的各种职位。原卷答案写的是WHERE sal 2000这是典型的把“行级过滤”当成了“组级过滤”。正确写法必须先分组再过滤SELECT Job FROM EMP GROUP BY Job HAVING MIN(Sal) 2000;WHERE在分组前筛行HAVING在分组后筛组题目问的是“每个职位的最低薪金”属于组级条件只能用HAVING。第三问每个部门的名称、员工数量、平均薪水SELECT d.Dname, COUNT(e.Empno) AS 员工数量, AVG(e.Sal) AS 平均薪水 FROM EMP e INNER JOIN DEPT d ON e.Deptno d.Deptno GROUP BY d.Dname;原卷答案有两处要改平均薪水算的是avg(d.Deptno)拿部门编号求平均没有意义应该是AVG(e.Sal)连接条件写在WHERE里虽然能跑但规范写法是ON。另外COUNT(e.Empno)统计的是有编号的员工数比COUNT(*)更严谨因为前者会忽略 NULL。5. 易错点五个最容易在考场上丢分的地方下面五条每一条都对应这套卷子里真实出现过的坑。不是“注意细心”这种废话是具体到某道题为什么会答错。5.1 循环边界break 跳出后变量到底等于几错在哪第 6 题答成 6 或 10。为什么错把“最后一次进入循环体的值”和“触发 break 的值”混为一谈i 6成立时i已经是 7。怎么答对在草稿纸上写“判断发生在 i7break 不改变 i”跳出后打印的就是 7同时先扫一眼变量作用域for 括号里声明的i出了循环根本不可见这题严格说编译失败。5.2 finally 之后还有代码错在哪第 10 题只写到BC。为什么错把finally当成了方法结束标记。怎么答对记住执行链是“try 剩余部分跳过 → catch → finally → 结构之后的语句”只要finally里没有return或System.exit后面的D一定会打印。5.3 抽象类的子类没实现抽象方法错在哪第 13 题选00000。为什么错被 main 方法里的数组打印吸引了注意力忘了检查Sub有没有实现amethod()。怎么答对读题顺序固定为“先看类声明再看方法体”子类非抽象就必须实现全部抽象方法少一个都是编译错误。5.4 SQL 用 WHERE 代替 HAVING错在哪第 23 题第二问写成WHERE sal 2000。为什么错没区分“筛行”和“筛组”题目问的是“最低薪金大于 2000 的职位”条件作用在MIN(Sal)上。怎么答对看到“每/各/最低/最高/平均”这类词先想GROUP BY再想聚合函数条件挂在HAVING上。5.5 单例的括号与线程安全错在哪上机第 24 题写成public static Singleton getInstance且方法体没有括号或者懒汉式不加同步。为什么错前者是语法错误后者在多线程下会 new 出多个实例。怎么答对方法声明必须带()懒汉式加synchronized或双重检查加volatile最稳的是饿汉式类加载即初始化天然线程安全。6. 答题节奏与押题把会做的分先全部拿到手这套卷子的分值结构很清楚20 道选择题覆盖面广但单题分值低4 道上机题才是真正拉开差距的地方。考场上我建议的时间分配是选择题 35 分钟、上机题 50 分钟、检查 5 分钟。选择题遇到初始化顺序、异常流转这种需要推演的先在草稿纸上写顺序表再选不要靠语感实在卡住的先标记跳过别在一道 2 分题上耗 5 分钟。押题优先级按出现频率排优先级考点常见问法必须掌握的动作高初始化顺序静态块、实例块、父子构造器谁先谁后默写六步顺序表高异常流转try-catch-finally 输出几个字母画执行链标出 finally 位置高抽象类与接口子类未实现抽象方法能否编译先数方法再看类声明中值传递方法内改变量外面变不变区分基本类型与引用类型中SQL 分组求每类最高最低平均GROUP BYHAVING成对出现中单例模式手写线程安全单例私有构造 静态实例 静态获取方法上机题还有一条血泪经验先把方法签名和返回值写对再补逻辑。第 21 题的sort方法要求返回String第 22 题要求递归第 24 题类名固定为Singleton——这些硬性要求写错逻辑再漂亮也是零分。字符串排序那题别忘了split(,)之后要trim()再用Integer.parseInt转数字最后String.join拼回去否则输出里带空格直接判错。最后说个习惯。从那以后我每次带人刷这套题都强制让对方先把“父类静态 → 子类静态 → 父类实例 → 父类构造 → 子类实例 → 子类构造”这张表默一遍再把finally的执行链画一遍两件事做完选择题基本不会翻车。考场上没有后悔药能提前固化成肌肉记忆的就别留给临场发挥。希望帮到你。本文还有配套的精品资源点击获取