简介:《Java题库.docx》是一份面向Java初级开发者与求职面试备考者的单选题练习资料,围绕语法基础、变量与数据类型、标识符规则、方法定义、循环与switch语句、类型转换及面向对象等高频考点组织题目,适合用于面试前自测、课堂练习与知识点查漏补缺。压缩包内共1个docx文件,大小约91KB,篇幅集中,便于直接打开练习和对照答案复习。资料已有283人学习,内容包含题干、选项与参考答案,并覆盖for无限循环、do...while执行次数、boolean取值、强制类型转换截断小数、带参方法返回值、程序调试方法等典型易错点,可帮助读者快速检验基础掌握程度,梳理面试常见陷阱与答题思路。
1. 先看清出题人的心思:Java题库面试客观题到底在筛什么
翻开这份Java题库的面试真题,第一眼像送分题,实际考点很集中:标识符、数据类型、循环次数、switch编译规则、类与对象、方法返回值和字符串API。90分钟100分、每题2分的客观题,真正拉开差距的不是谁背得多,而是谁能在选项里快速识别“编译错误”和“执行结果”这两类陷阱。比如switch里写case 0,1:,看着像合写条件,实际直接编译失败;再比如String s; System.out.println(s);,不是输出null,而是未初始化报错。这场考试适合准备Java初级面试、校招笔试或认证客观题的人,拿分关键是先判断“能不能编译”,再算“运行结果”。
2. 语法与标识符:从合法变量名到编译错误的第一道送分线
2.1 标识符、关键字与注释:先排除“看起来像”的选项
标识符题在这份题库里反复出现,题3、题9、题36、题50都属于同一类考法。面试官出这类题不是考你背定义,而是看你有没有形成排除顺序:先看首字符,再看字符组成,最后看是不是关键字。合法标识符可以由字母、下划线、美元符号开头,后面可以跟字母、数字、下划线和美元符号;不能以数字开头,不能含#、*、&、-这类符号,也不能直接拿关键字当变量名。
题3问合法标识符,选项里A123$和s123_Name可以选,#A123栽在特殊符号,588TTT栽在数字开头。题9里34qy数字开头,-ABC负号开头,&mark特殊符号开头,只有inta虽然看起来像int加a,但它整体不是关键字,所以合法。题36同理,$mark是合法的,3Total、*ABC、145都不行。这里最容易翻车的是把“像关键字”当成“就是关键字”:inta、p234、Main这类只要整体不是关键字,就可能是合法标识符。
| 选项示例 | 判定 | 原因 |
|---|---|---|
A123$ | 合法 | 字母开头,后续含数字和美元符号 |
s123_Name | 合法 | 字母开头,含下划线和数字 |
#A123 | 非法 | 不能以#开头 |
588TTT | 非法 | 不能以数字开头 |
inta | 合法 | 整体不是关键字 |
short | 非法 | 是Java关键字 |
注释题也走同一逻辑。题20和题31都考注释写法,//、/* */、/** */是合法形式,/单独开头不是注释。答题时不要纠结注释内容,先看符号是否成对、开头是否合法。面试里如果被问“文档注释和普通块注释区别”,点到/** */常用于生成文档即可,不要展开成一大段。
提示:标识符题先做“首字符检查”,再做“特殊符号检查”,最后查关键字表。三步走完,比逐项读解释快。
2.2 数据类型与转换:char、boolean、强制转换的边界
数据类型部分的高频点集中在char、boolean、整型和浮点型的转换。题2问保存字符'a'用什么类型,答案是char;题6问boolean取值,只有true和false,1和0不能直接当布尔值。题8给double exc=60.8; int avg=(int)exc;,强制转换截掉小数部分,得到60,不是四舍五入。题37问类型转换错误的是,(int)"a"把字符串强转成int,编译不通过;char a=(char)3;反而是合法的,因为3是整型常量,可以强转成字符编码。
这里要建立一个判断顺序:基本类型之间能不能转,看精度和兼容性;引用类型和基本类型之间,不能随便强转。int到double可以自动提升,double到int必须强转且丢小数,String到int要用Integer.parseInt,不能写(int)"123"。题19正好考这个:Integer.parseInt("123")是正确写法,String.valueOf("123")得到的是字符串,(int)"123"编译失败,int.parse("123")没有这个静态方法。
public class TypeCastDemo { public static void main(String[] args) { double exc = 60.8; int avg = (int) exc; // 强制转换,截断小数部分 char c = (char) 97; // 整型常量可以强转为char int num = Integer.parseInt("123"); // 字符串转int的正确入口 System.out.println(avg); // 输出60 System.out.println(c); // 输出a System.out.println(num); // 输出123 } }这段代码里,(int) exc的关键是“截断”而不是“四舍五入”,所以60.8变60;(char) 97说明字符和整数编码之间存在转换关系,但前提是整型常量在可接受范围内;Integer.parseInt的参数必须是数字字符串,传"a"会在运行时抛异常。面试题里如果出现int i=(int)"a";,不要算运行结果,直接判编译错误。
2.3 真题演练:五道选择题的排除路径与答题模板
题1问正确叙述,答案是D。A错在Java一行可以写多条语句;B错在Abc和abc大小写敏感,是两个不同变量;C错在赋值a=b后a拿到b的值,b本身不丢失;D说float变量可以存放整型数,a=10合法,因为整型可以自动提升到浮点型。这类题答题模板是:先找“绝对化”词,如“只能”“相同”“丢失”,再逐项验证。
题2答案D,保存字符'a'选char。题3答案AD,按首字符和特殊符号排除。题9答案B,inta整体不是关键字。题36答案C,$mark合法。题37答案C,(int)"a"错误。题50问变量命名规则,答案是D:第一个字母后可以是字母、数字和下划线组成的序列。这里注意,题50的A说“必须以字母或下划线或数字开头”,数字开头错误;B说“第一个字母必须是字母或下划线”,漏了美元符号;C说“不区分大小写”,正好相反。
注意:遇到“以下正确的有”“错误的是”“选择两项”时,先把题干关键词圈出来。多选漏选往往不是不会,而是没看清“错误”还是“正确”。
3. 控制结构:循环、switch与运算符优先级的高频陷阱
3.1 for/while/do-while:先数执行次数,再算变量
循环题是这份题库的得分核心,题5、题11、题17、题20、题34、题42、题46、基础二第3题、第14题、第27题、第35题、第36题、第43题、第44题、第47题都在考循环。答题时不要一上来就背答案,先做三件事:找初始值、看条件、看更新表达式。for(int i=0;true;i++)条件永远为真,所以无限次;do{++i;}while(i<1);先执行一次再判断,所以至少一次;int n=2; while(n==0){...}一开始条件就假,所以0次。
题17是典型翻车题:int m=3,n=6,k=0; while((m++)<(--n)){ ++k; }。第一次比较时m++取3,m变4;--n先减,n变5,3<5为真,k变1。第二次m++取4,m变5;--n先减,n变4,4<4为假,循环结束。答案k=1。这题错的人多半是把m++和--n的取值时机看反了。
题20for(j=1;j<10;j+=2) System.out.print(j);输出1 3 5 7 9,因为每次加2。题34int j=2; for(int i=7;i>0;i-=2){ j*=2; },i取7、5、3、1共四次,j从2乘四次2,得到32。题42while(n==0)一次也不执行。题46do{ b-=a; a++; }while(b--<0);先做再判断,且b--先用后减,最后输出8。题47输入6,for(i=1;i<=10;i++)里当i+num>10时break,也就是i>4时跳出,输出1到4。
提示:循环题写在草稿上列三列——轮次、条件判断前的值、循环体后的值。不要心算跳步。
3.2 switch:合法参数、穿透和编译错误
switch在这份题库里既是高频考点,也是易错重灾区。题7给switch(i){ case 0,1: j=1; case 2: j=2; },答案A编译出错,因为Java的case后面只能跟一个常量,不能写case 0,1:,要写成case 0: case 1:。题10问哪些x定义能让switch(x)输出100,答案是byte x=100;和char x='d';,因为'd'的编码是100;float和long不能作为switch表达式类型。题11在JDK1.6背景下考switch,字符和整型变量可以做等值判断,字符串不行;题38考穿透,day=3匹配case 3后没有break,会继续执行case 5,输出“学钢琴”,遇到break结束。
public class SwitchDemo { public static void main(String[] args) { int i = 0; int j = -1; switch (i) { case 0: case 1: j = 1; // case 0和case 1共用逻辑,不能写成case 0,1: break; case 2: j = 2; break; default: j = 0; } System.out.println("j=" + j); // 输出j=1 } }这段代码说明两件事:第一,多个case共用逻辑要连续写case标签,不能写逗号;第二,break决定是否穿透。参数i是int,case后必须是编译期常量。如果题目把i换成long或float,不是结果变不变的问题,而是编译不通过。题7原题直接写case 0,1:,所以答案不是j=1,而是编译出错。
3.3 真题串讲:六道循环与分支题的答题模板
题5for(int i=0;true;i++);答案B无限次,因为条件恒真。题11do{++i;}while(i<1);答案A一次,因为先执行后判断。题18int a=2; System.out.println(a*3>10?1:2);,6>10为假,输出2。题23打印三角形,内层循环要填int j=1;j<=i;j++,因为第i行打印i个星。题32逻辑表达式表示a和b同时正或同时负,最简洁的是a*b>0。题49j=2,k=3; v=j-- - ++k;,j--取2后j变1,++k先加得4,v=2-4=-2。
public class LoopTrace { public static void main(String[] args) { int m = 3, n = 6, k = 0; while ((m++) < (--n)) { // 先取m再自增,n先自减再比较 ++k; } System.out.println("k=" + k); // 输出k=1 System.out.println("m=" + m); // 输出m=5 System.out.println("n=" + n); // 输出n=4 } }这段代码的关键参数是m++和--n:m++是后置自增,参与比较的是旧值;--n是前置自减,参与比较的是新值。循环只进入一次,所以k为1。答题时把每轮比较前后的值写出来,比背“前置先加、后置后用”更稳。题27这种for(i++; i++<10; i++);也是同一套路,条件里的i++会先取旧值再自增,最后打印++i,答案13。
4. 面向对象与方法:类、对象、返回值、静态变量和字符串
4.1 类与对象:属性、方法、实例化与抽象层次
面向对象题在题库里占比不低,题12、题13、题25、题26、题27、题34、题40、题41、基础二第33题、第34题都在考类与对象。核心判断只有一句:类是模板,对象是实例;类规定属性和方法,对象拥有具体状态。题12问面向对象优点,答案是“以上全部”:模拟现实实体、隐藏信息、增加重用性。题13和题26问错误描述,答案都落在“程序语言都支持面向对象”这句话上,因为不是所有语言都支持。题27问对象说法错误,类和对象一样,只是说法不同是错的,类不是对象。
题25问类的成员包括什么,答案是属性和方法。题40问对象静态特征在类中表示为什么,答案是属性。题41问类和对象描述错误,选“对象实例化后就是一个类”“对象更抽象类更具体”,这两项把关系和抽象层次说反了。基础二第33题创建对象,正确写法是Car myCar = new Car();后再给属性赋值,不能漏括号,也不能不实例化就直接点属性。基础二第34题问类与对象关系不正确的是“类包含对象”,因为对象是类的实例,不是类里面装对象。
注意:对象题不要被“类”“对象”两个词绕晕,先问自己“这是模板还是实例”。模板不能直接赋属性,实例化后才能操作成员。
4.2 方法定义与调用:返回值、参数、值传递
方法题的高频点有三个:返回值类型、参数列表、值传递。题4问方法描述,return用于返回值,无返回值方法也可以用return;提前结束;题14问带参数方法错误说法,带参数方法的返回值不能为void是错的,因为带参数和有没有返回值是两件事。题35public ___ count(int i,double d){ return i*d*2.0; },返回表达式是double,所以填double,不能填int或void。
题22是值传递经典题:change(int x){ x+=5; },main里x=5,调用后输出还是5。因为基本类型传的是值的副本,方法内改的是副本。题30String s; System.out.println("s="+s);编译报错,局部变量未初始化不能使用。题39int i; System.out.println("i="+i);同样编译错误。题26int i; System.out.println("i="++i);也编译错误,因为i没有初值。题47public static void main()缺少String[] args参数,程序入口签名不对,答案选“程序不正确”。
public class PassByValueDemo { public static void change(int x) { x += 5; // 修改的是副本,不影响调用方 } public static void main(String[] args) { int x = 5; change(x); System.out.println(x); // 输出5 } }这段代码的参数是基本类型int,Java方法调用采用值传递,change里的x和main里的x是两个不同的局部变量。面试官常把String也拿来做同类题:String str="Hello Java"; str.substring(0,6); System.out.println(str);输出仍是Hello Java,因为字符串不可变,substring返回新字符串但没有接收。题21就考这个点,答案选原字符串。
4.3 字符串与常用API:substring、charAt、parseInt、equalsIgnoreCase
字符串题集中在题19、题21、题24、题30、题31、题46、题47。题19考Integer.parseInt("123"),这是字符串转整型的标准写法。题21考substring(0,6),但打印的是str而不是s,所以输出原字符串。题24要输出“相等”,s1和s2大小写不同,用equalsIgnoreCase忽略大小写;equals区分大小写,equalsIgnoreCase返回布尔值,不能再和0比较。题31s="y"; s+1+2得到y12,1+2+s先算加法得到3,再拼字符串得到3y,所以输出y12 3y。题46charAt(6)取索引6的字符,索引从0开始,也就是第7个字符;如果字符串第7位是a,答案就是'a',不是空格。
public class StringApiDemo { public static void main(String[] args) { String s = "y"; System.out.println(s + 1 + 2); // 从左到右,先拼字符串,输出y12 System.out.println(1 + 2 + s); // 先算1+2,再拼字符串,输出3y String str = "Hello Java"; String sub = str.substring(0, 6); // 返回新字符串,原字符串不变 System.out.println(str); // 输出Hello Java System.out.println(sub); // 输出Hello } }这段代码的参数说明:substring(0,6)的区间是左闭右开,取索引0到5;s+1+2和1+2+s的差别在于运算符从左到右结合,前面是字符串就拼接,前面是数字就先算加法。题31答案A,题21答案D,题24答案C。字符串题不要凭语感,按“从左到右、有没有接收返回值、是否忽略大小写”三步走。
5. 易错点与失分点:五类一错再错的客观题
5.1 标识符与关键字混着选
错在哪:看到inta、p234、$mark就犹豫,看到short、int又不敢排除。为什么错:把“包含关键字”当成“是关键字”,或者只记“字母开头”忘了美元符号和下划线。怎么答对:先看首字符,再看字符组成,最后查关键字表。题9的inta合法,题36的$mark合法,题3的A123$和s123_Name合法;short是关键字,不能当变量名。多选题里如果两个选项都符合规则,不要只选一个。
5.2 switch的case值类型与变量类型不匹配
错在哪:把case 0,1:当成合法写法,或者认为float、long也能进switch。为什么错:Java的case后只能跟一个常量,多个值要连续写case;switch表达式支持的类型有限,float、long不行。怎么答对:先看case标签有没有逗号,再看变量类型。题7直接编译出错,答案不是j=1;题10里byte x=100和char x='d'可以,float和long不行。题11在JDK1.6背景下,字符和整型可以做等值判断,字符串不行。
5.3 变量未初始化就使用
错在哪:String s; System.out.println("s="+s);以为输出s=null,int i; System.out.println("i="+i);以为输出0。为什么错:成员变量有默认值,局部变量没有默认值,未初始化不能使用。怎么答对:看变量声明位置。方法体内声明的局部变量必须先赋值;类成员变量才有默认值。题30、题39、题26都因局部变量未初始化而编译错误。题26的++i还涉及先自增,但根子仍是i没有初值。
public class InitDemo { public static void main(String[] args) { int i; // 局部变量,没有默认值 i = 0; // 先初始化 System.out.println("i=" + (++i)); // 输出i=1 } }这段代码把“先初始化再使用”写清楚了。参数i是局部变量,声明后不赋值就参与运算会编译失败;赋初值0后再++i,输出1。题30的String s、题39的int i都是同一类失分点,看到“方法内声明后直接用”先判编译错误。
5.4 循环条件与更新表达式看错
错在哪:while((m++)<(--n))里把m++当成先加,for(i++; i++<10; i++);里漏看条件中的自增。为什么错:前置和后置的取值时机不同,for的三个表达式执行顺序固定但容易心算跳步。怎么答对:列轮次表,写清“判断前值、判断后值、循环体后值”。题17只进一次循环,k=1;题27最后输出13;题46先执行后判断,且b--先用后减,输出8。循环题不要背答案,草稿上走两轮就能看出来。
5.5 值传递、字符串不可变与方法返回类型
错在哪:change(x)后以为x变10;str.substring(0,6)后以为str被截短;方法返回表达式是double却填int。为什么错:基本类型传副本,字符串不可变,返回类型要看表达式实际类型。怎么答对:基本类型方法调用先画两个变量框;字符串API看有没有接收返回值;返回类型看return后面的表达式。题22输出5,题21输出原字符串,题35填double。题24的equalsIgnoreCase返回布尔值,不能写==0。
6. 最后90分钟的答题顺序:先拿稳客观题,再回头啃编译错误
6.1 时间分配:两轮答题,不在第一轮死磕
这套卷子100分、90分钟,平均每题不到2分钟,但客观题里有大量“编译错误”和“执行结果”判断,第一轮死磕很容易超时。我的建议是两轮:第一轮40到50分钟,把标识符、数据类型、注释、类与对象、字符串API这些能直接排除的题拿掉;第二轮20到30分钟,集中处理循环次数、switch穿透、前置后置自增这类需要草稿的题;最后10分钟检查多选题和“错误”类题干。
| 题型 | 常见题号区间 | 目标用时 | 策略 |
|---|---|---|---|
| 标识符、关键字、注释 | 题3、题9、题20、题36、题50 | 8分钟 | 首字符→特殊符号→关键字,三步排除 |
| 数据类型与转换 | 题2、题6、题8、题19、题37 | 10分钟 | 先判能不能编译,再算截断结果 |
| 循环与分支 | 题5、题11、题17、题20、题34、题46 | 25分钟 | 列轮次表,写清前置后置 |
| 类与对象、方法 | 题12、题14、题22、题27、题35、题41 | 20分钟 | 先分模板和实例,再看值传递 |
| 字符串API | 题21、题24、题31、题46 | 12分钟 | 看是否接收返回值,是否忽略大小写 |
| 检查多选与题干 | 全卷 | 10分钟 | 圈“正确/错误/两项”,防漏选 |
6.2 押题思路:把“编译错误”放在第一位
这类Java题库面试客观题有一个稳定套路:很多题不是让你算结果,而是让你判断“根本跑不起来”。case 0,1:、(int)"a"、int i; System.out.println(i);、public static void main()缺参数,都是编译阶段就结束。答题时先问一句“这行能不能过编译”,能过再算运行结果。多选题里,如果两个选项都符合规则就都选,不要因为“只选一个更稳”而漏分。
我早年做这类卷子时吃过一次血泪经验:在一道switch题上算了半天穿透,最后发现case写法本身编译不过,整道题的方向都错了。从那以后我每次看到switch、字符串强转、局部变量直接使用,都强制先走一遍“能不能编译”,再动笔算结果。希望帮到你。
本文还有配套的精品资源,点击获取