计挑赛-Java
一、2019真题
1.以下关于Java程序初始化顺序的描述,正确的是
父类静态代码块先于父类静态变量(错误):父类的静态代码块和静态变量的初始化顺序取决于它们在类中的定义顺序,而非固定的 “代码块先于变量”
静态变量晚于非静态变量(错误):静态变量在类加载时初始化,非静态变量(实例变量)在对象创建时初始化。类加载早于对象创建,因此静态变量初始化更早。
与成员变量的定义顺序无关(错误):成员变量(包括静态和非静态)的初始化顺序与定义顺序一致(例如,非静态变量和非静态代码块按定义顺序执行)
父类先于子类进行初始化(正确)
2.关于类修饰符final和abstract关键字说法不正确的是
一个类不能同时是abstract 和 final(正确):abstract 类需要被继承以实现抽象方法,而 final 类不允许被继承,二者矛盾,因此不能同时修饰一个类。
final关键字可以应用于类,也可以应用于方法(正确):final 可修饰类(该类不能被继承)、方法(该方法不能被重写)、变量(该变量为常量,不可修改)。
一个方法可以既是abstract又是final:abstract 方法需要子类重写以实现具体逻辑,而 final 方法禁止子类重写,二者语义冲突,因此一个方法不能同时被 abstract 和 final 修饰。
final关键字应用于方法时,表明任何子类不能重写该方法(正确)
3.以下关于Java程序初始化顺序的描述,不正确的是
静态对象先于非静态对象初始化(正确):静态对象(静态成员)在类加载时初始化,非静态对象(实例成员)在对象创建时初始化。类加载早于对象创建,因此静态对象先于非静态对象初始化。
静态对象只初始化一次(正确):静态对象属于类级别,类加载过程仅执行一次,因此静态对象的初始化也只进行一次。
非静态对象可能会初始化很多次(正确):非静态对象属于实例级别,每创建一个类的实例,都会重新初始化非静态对象,因此多次创建实例时,非静态对象可能被初始化多次。
子类先于父类进行初始化(错误):Java 中初始化遵循 “先父类后子类” 的顺序。无论是类加载阶段的静态初始化,还是对象创建阶段的实例初始化,都必须先完成父类的初始化,再进行子类的初始化。
4.关于下列代码说法正确的是( ) public class Test{ public void a(){} public void a(int i){} public int a(){} }
方法重载的核心规则是:在同一个类中,方法名相同,且参数列表(参数的个数、类型、顺序)不同,与返回值类型、访问修饰符无关。
方法重写(Override) 是指子类继承父类后,对父类中已存在的方法进行重新定义实现,使子类的该方法具有与父类同名方法不同的具体逻辑(但方法签名保持一致)。
-
第一个方法
public void a(){}和第二个方法public void a(int i){}:方法名相同(都是a),且参数列表不同(一个无参数,一个有int类型参数),符合重载规则,因此是方法重载。 -
第三个方法
public int a(){}与第一个方法对比:方法名相同(都是a),但参数列表完全相同(均无参数),仅返回值类型不同(一个void,一个int)。仅返回值不同不能构成重载,反而会导致编译错误(编译器无法区分调用的是哪个方法),因此第三个方法与第一个方法不构成重载。
上述三个a方法是方法重载(错误):
上述三个a方法是方法重写(错误):静态对象属于类级别,类加载过程仅执行一次,因此静态对象的初始化也只进行一次。
上述三个方法是第一个和第二个a方法是方法的重载,第三个不是(正确)
上述三个方法是第一个和第三个a方法是方法的重载,第二个不是(错误)
5.以下关于Java语句,描述不正确的是
assert是断言,用于进行程序调试。(正确):assert 关键字用于在程序开发阶段进行调试,检查某个条件是否为真,若为假则抛出 AssertionError。默认情况下断言是关闭的,可通过 -ea 参数开启。
continue用来提前跳出一个块。(错误):continue 的作用是跳过当前循环的剩余语句,直接进入下一次循环(仅用于循环中);而 “提前跳出一个块” 是 break 的功能(break 可跳出循环或 switch 块)。
final用来说明最终属性。(正确):final 可修饰变量(包括成员变量和局部变量),被修饰的变量为 “最终属性”(常量),一旦赋值后不可修改。此外,final 还可修饰方法(不可重写)和类(不可继承)。
catch用在异常处理中,用来捕获异常。(正确):异常处理的基本结构为 try-catch-finally,catch 块用于捕获 try 块中抛出的异常,并对异常进行处理。
6.以下关于异常类的描述,不正确的是
Error是程序无法处理的错误(正确):Error 属于严重错误(如系统级错误),通常由 JVM 抛出,代表程序无法恢复的异常状态(如 OutOfMemoryError、StackOverflowError),程序本身无法处理,一般需要终止运行。
Exception也称为非致命性异常类(正确):Exception 是程序运行中可能出现的非致命性异常,通常是由于程序逻辑错误或外部环境问题导致(如 NullPointerException、IOException),可以通过异常处理机制(try-catch)捕获并处理,程序可继续执行。
Exception是程序自身可以处理的异常(正确):Exception 及其子类(除 RuntimeException 等非检查异常外,多数为检查异常)需要程序显式处理(捕获或声明抛出),属于程序自身可控制的异常范围。
Error分为AWTError和VirtualMachineError两种(错误):Error 是一个抽象类,其下有多个子类,除了 AWTError(与 AWT 组件相关的错误)和 VirtualMachineError(JVM 相关错误,如 OutOfMemoryError),还有 ThreadDeath(线程终止错误)、LinkageError(类链接错误)等,并非仅分为这两种。
7.以下关于异常捕获机制的描述,正确的是
每个try块都必须有一个catch子句(错误):Java 中,try块后面可以跟一个或多个 catch 子句,也可以跟一个 finally 子句(或两者都有)。
每个try块都必须有一个finally子句(错误):try块可以仅搭配 catch 子句(try-catch),无需 finally 子句。finally 的作用是无论是否发生异常都执行代码(如资源释放),但并非必需。
catch子句后如果只有一个语句,可以不使用子句开始和结束标记“{ }”(错误):在Java中,catch子句必须使用大括号{}包裹代码块,即使只有一个语句。省略大括号会导致编译错误。
如果任何封闭try块都未捕获到异常,Java解释器将退出(正确):Java中,如果异常在抛出后没有被任何封闭的try块(包括调用堆栈中的上层try块)捕获,该异常会导致当前线程终止。如果终止的线程是主线程(main thread),Java虚拟机(JVM)会退出,程序停止运行,并打印未捕获异常的堆栈跟踪。
8.设 i, j, k, l 均为 int 型的变量,并已赋值,下列表达式的结果属于非逻辑值的是
选项:
A: i!=j&k%l<i
B: i++==i+j+k+l
C: ++i*j--+k
D: i+j>=k+l
正确答案: C
解析: A、B、D都是比较表达式,返回布尔值(逻辑值)。C是算术表达式,返回数值,是非逻辑值。
9.阅读下列代码,选出该代码段正确的文件名( )。
class Student{
void method1(){ }
}
public class Teacher{
void method2(){ }
public static void main(String[] args){
System.out.println("main()");
}
}
选项:
A: Student.java
B: Student.class
C: Teacher.java
D: Teacher.class
正确答案: C
解析: Java源文件必须与public类同名,因此文件名应为Teacher.java。
10.关于以下程序段,正确的说法是( )
1 String Seq_1 = "abc"+"def";
2 String Seq_2 = new String(Seq_1);
3 if (Seq_1.equals(Seq_2))
4 System.out.println("equals()");
5 if (Seq_1 == Seq_2)
6 System.out.println("==");
选项:
A: 输出为equals()和==
B: 输出为空
C: 输出为==
D: 输出为equals()
正确答案: D
解析: Seq_1和Seq_2内容相同,equals()返回true,输出"equals()"。但Seq_1在字符串常量池中,Seq_2是new String在堆中的新对象,==比较引用返回false,不输出"=="。
11.下列类的定义中,错误的是( )。
选项:
A: class AB { .... }
B: public CD extends AB { .... }
C: public class CD extends AB { .... }
D: class EF extends AB implements CD { .... }
正确答案: B
解析: B中语法错误,应为public class CD extends AB。A、C、D正确。
12.Java应用程序中的主类需包含main(),以下哪项是main()的正确形参?
选项:
A: Char arg
B: String args
C: String args[]
D: StringBuffer args[]
正确答案: C
解析: main方法的参数是String[] args。
13.Java Application 源程序的主类是指包含有( )方法的类
选项:
A: init()
B: main()
C: toString()
D: actionPerformed()
正确答案: B
解析: 主类包含main方法。
14.下列代码实例化写法不正确的是( )
class A{
public A(String i){}
public A(int i){}
public A(int i,int j){}
}
选项:
A: A a = new A("lpf");
B: A a = new A();
C: A a = new A(4);
D: A a = new A(1,2);
正确答案: B
解析: 类A没有无参构造方法,因此B会编译错误。
15. 以下关于类的继承属性叙述正确的是( )。
选项:
A: 在Java中一个类不能同时继承一个类和实现一个接口
B: 在Java中一个类只能实现一个接口
C: 在Java中接口只允许单一继承
D: 在Java中类只允许单一继承
正确答案: D
解析: Java中类只允许单继承,但可以实现多个接口。A错误,类可以继承一个类并实现多个接口;B错误;C错误,接口可以多继承。
第16题
题目: 下列常见的系统定义的异常中,有可能是网络原因导致的异常是( )。
选项:
A: IOException
B: ClassNotFoundException
C: FileNotFoundException
D: UnknownHostException
正确答案: D
解析: UnknownHostException是网络异常,当无法解析主机名时抛出。其他选项不特定于网络。
第17题
题目: 在Java程序中,以下哪个关键字是用于抛出异常? ( )
选项:
A: transient
B: finally
C: throw
D: static
正确答案: C
解析: throw用于抛出异常。
transient 是用于修饰类的成员变量的关键字,作用是阻止该变量被序列化。
finally 是 Java 异常处理机制的一部分,通常与 try、catch 配合使用,用于定义无论是否发生异常都必须执行的代码块。例如,资源释放(关闭文件、数据库连接等)通常放在 finally 块中,确保即使 try 块中发生异常或 catch 块中处理异常时,资源也能被正确释放。它的作用是 “保证代码执行”,而非 “抛出异常”。
第18题
题目: 关于Java语言的异常捕获机制,以下说法描述正确的是:( )
选项:
A: try语句块后必须至少存在一个catch语句块
B: try语句块后可以存在不限数量的catch语句块
C: try语句块后必须至少存在一个finally语句块
D: 如果catch和finally语句块同时存在,则catch语句块必须位于finally语句块之后
正确答案: B
解析: try后可以有多个catch块。A错误,try后可以有finally而没有catch;C错误;D错误,catch在finally之前。
第19题
题目: 下列关于抽象类说法正确的是( )
选项:
A: 抽象类不能被继承
B: 抽象类不能实例化
C: 抽象类使用interface关键字
D: 抽象类中一定要有抽象方法
正确答案: B
解析: 抽象类不能实例化。A错误,抽象类可以被继承;C错误,抽象类使用abstract class;D错误,抽象类不一定有抽象方法。
第20题
题目: 下列选项中关于Java中关键字的说法错误的是( )。
选项:
A: default是用于switch语句中的默认分支
B: extends只能作用于类,不能作用于接口
C: import表明要访问指定的类或者包
D: super表明当前对象的父类型的引用
正确答案: B
解析: extends可以用于类继承类,也可以用于接口继承接口。因此B错误。
第21题
题目: Java虚拟机中,哪个数据区存储的是所有线程共享的数据( )
选项:
A: Java堆
B: Java虚拟机栈
C: 程序计数器
D: 以上都不是
正确答案: A
解析: Java堆是所有线程共享的,用于存储对象实例。
第22题
题目: 以下不是Java虚拟机(JVM)构成的是( )
选项:
A: 类加载器
B: 字节确认器
C: 码流分析器
D: JIT实时编译器
正确答案: C
解析: JVM包括类加载器、字节码验证器、执行引擎(含JIT)等,但码流分析器不是标准组成部分。
第23题
题目: Java编译器会将代码源程序转换为( )
选项:
A: 字节码
B: 机器代码
C: 可直接执行代码
D: 以上都不正确
正确答案: A
解析: Java编译器将源程序编译为字节码。
第24题
题目: 在Java程序中,如果不赋给类的成员变量初始值,编译器会给出它们的默认值,以下解释中错误的是( )。
选项:
A: byte的默认值是0
B: boolean的默认值是false
C: long类型的默认值是0.0L
D: char类型的默认值是’\0’
正确答案: C
解析: long的默认值是0L,不是0.0L(0.0L是float或double的)。
第25题
题目: 关于字符串,下列说法不正确的是( )
选项:
A: String对象可用“”界定多个字符初始化。
B: String类是用final修饰的。
C: String变量之间可以用‘+’号进行拼接。
D: String类的对象长度是可以随意改变的。
正确答案: D
解析: String对象是不可变的,长度不能改变。
第26题
题目: 下列两个名词之间的关系,适合表示父类和子类关系的是( )。
选项:
A: 运动和运动员
B: 餐厅和菜单
C: 课堂和学生
D: 运输工具和卡车
正确答案: D
解析: 运输工具是父类,卡车是子类。
第27题
题目: 下列两个名词之间的关系符合类和对象关系的是( )。
选项:
A: 军营和士兵
B: 图书馆和书
C: 灰熊和棕熊
D: 运动员和姚明
正确答案: D
解析: 运动员是类,姚明是对象。
第28题
题目: 下列两个名词之间的关系描述中,符合类和对象关系的是( )。
选项:
A: 团长和士兵
B: 书和书架
C: 狼和老虎
D: 作家和曹雪芹
正确答案: D
解析: 作家是类,曹雪芹是对象。
第29题
题目: 下列两个名词之间的关系符合父类和子类关系的是( )。
选项:
A: 教师和学生
B: 房子和家具
C: 狗和猫
D: 交通工具和飞机
正确答案: D
解析: 交通工具是父类,飞机是子类。
第30题
题目: 下列两个名词之间的关系符合类和对象关系的是( )
选项:
A: 铁路和火车
B: 诗人和李商隐
C: 楼房和房间
D: 图书馆和图书
正确答案: B
解析: 诗人是类,李商隐是对象。
第31题
题目: 下面关于工程机械和铺路机械之间的关系描述中,最贴切的是:( )
选项:
A: 拥有同样的基类
B: 父类和子类
C: 类和对象
D: 类的重载
正确答案: B
解析: 铺路机械是工程机械的一种,是子类关系。
第32题
题目: 以下关于火车和高铁动车之间的关系描述中,最贴切的是:( )
选项:
A: 拥有同样的基类
B: 父类和子类
C: 类和对象
D: 类的重载
正确答案: B
解析: 高铁动车是火车的一种,是子类关系。
第33题
题目: 以下关于电梯和智能电梯之间的关系描述中,最贴切的是:( )
选项:
A: 拥有同样的基类
B: 父类和子类
C: 类和对象
D: 类的重载
正确答案: B
解析: 智能电梯是电梯的一种,是子类关系。
第34题
题目: 下面描述楼梯和手扶电梯之间的关系中,最贴切的是:( A )
选项:
A: 拥有同样的基类
B: 父类和子类
C: 类和对象
D: 类的重载
正确答案: A
解析: 楼梯和手扶电梯都是垂直运输工具,有共同的基类(如运输工具)。
第35题
题目: 下列描述宾馆和宿舍之间的关系中,最准确的是( )
选项:
A: 拥有同样的基类
B: 父类和子类
C: 类和对象
D: 类的关联
正确答案: A
解析: 宾馆和宿舍都是住宿设施,有共同的基类。
第36题
题目: 下面的选项中,哪项不宜作为“机械类”的属性( )
选项:
A: 材料
B: 用途
C: 湿度
D: 价格
正确答案: C
解析: 湿度是环境属性,不是机械本身的属性。
第37题
题目: 下面的选项中,哪项不宜作为“家具类”的属性( )
选项:
A: 材料
B: 风格
C: 尺寸
D: 运输能力
正确答案: D
解析: 运输能力不是家具的属性,是运输工具的属性。
第38题
题目: 下面的选项中,哪项不适合作为“飞机类”的属性( )
选项:
A: 高度
B: 速度
C: 温度
D: 重量
正确答案: C
解析: 温度不是飞机的固有属性,可能是环境温度。
第39题
题目: 下面的选项中,哪项不宜作为“楼房类”的属性( )
选项:
A: 建筑层数
B: 建筑绿化
C: 建筑材料
D: 建筑面积
正确答案: B
解析: 建筑绿化不是楼房的直接属性,可能是环境属性。
第40题
题目: 下面的选项中,哪项不宜作为“小学生类”的属性( )。
选项:
A: 姓名
B: 学号
C: 年龄
D: 专业
正确答案: D
解析: 小学生没有专业,专业是大学或职业教育的属性。
第41题
题目: 在Java语言中,采用私有属性的主要优势在于( )
选项:
A: 便于提供给其它实例进行访问
B: 便于区别不同的实例
C: 便于类之间的数据交换
D: 便于保护实例数据的安全
正确答案: D
解析: 私有属性封装数据,保护数据安全。
第42题
题目: 在Java语言中,采用数组表达数据的主要优势在于( )
选项:
A: 容易记住变量名
B: 便于程序成批处理同类数据
C: 避免定义大量变量名
D: 便于编译程序理解代码
正确答案: B
解析: 数组用于批量处理同类数据。
第43题
题目: 在Java语言中,以下说法不正确的是( )
选项:
A: 类的方法名可以和变量重名。
B: 类的公开方法可以被其它类直接访问。
C: 方法重载中参数列表的不同只能是参数个数的不同。
D: 如果类定义了构造方法,也可以用该类的默认构造方法。
正确答案: C
解析: 方法重载参数列表不同可以是参数类型、顺序或个数不同。因此C错误。D错误,如果定义了构造方法,默认无参构造不再自动提供。
第44题
题目: 下列关于Java语言的特点说法错误的是( )
选项:
A: Java是一种面向对象语言。
B: Java具有较好的可移植性。
C: 垃圾回收机制是核心技术。
D: Java源程序可以在各类平台上运行。
正确答案: D
解析: Java源程序需要编译为字节码,然后在JVM上运行,不能直接在各平台运行。
第45题
题目: 下列关于Java的运行环境说法错误的是( )
选项:
A: Java虚拟机分析并解释执行字节码程序。
B: Java原程序通过集成开发环境(IDE)翻译为字节码程序。
C: Java是一种平台无关的语言。
D: Java保留了大部分与C++相似的语法。
正确答案: B
解析: Java源程序通过编译器(javac)翻译为字节码,IDE不是必须的。
第46题
题目: 以下哪个不是Java的程序控制关键字?( )
选项:
A: do
B: break
C: default
D: transient
正确答案: D
解析: transient是修饰符,不是程序控制关键字。
第47题
题目: 给定一个只包含0-9、‘+’、‘*’的合法数学表达式(长度<1000),规定加号‘+’的优先级高于乘号‘*’,请输出计算结果。
输入样例: 12*3+12*2
输出样例: 360
解题思路:
由于‘+’优先级高于‘*’,需要先计算加法部分,再计算乘法。算法步骤:
-
将表达式按‘*’分割成多个部分(tokens)。
-
对于每个部分,如果包含‘+’,则按‘+’分割并求和;否则直接转换为数字。
-
将所有部分的结果相乘。
-
输出结果。
package com.test;
import java.util.Scanner;
public class p19_47 {
public static void main(String[] args){
Scanner sc = new Scanner(System.in);
String expr = sc.nextLine();
//分割
String[] arr = expr.split("\\*");
double result = 1.0;
//遍历
for(String s : arr){
if(s.contains("+")){
String[] arr2 = s.split("\\+");
double sum =0.0;
for(String s2 : arr2){
sum += Double.parseDouble(s2);
}
result *= sum;
}else {
result *= Double.parseDouble(s);
}
}
System.out.println((int)result);
}
}
第48题
题目: 仓库新进了几批物资,只知道每批物资的数量和单价,请编写程序,按照每种物资的总价值,由高到低次序输出。
输入样例:
5
A 5 10.00
B 3 2.00
A 5 8.00
B 3 2.50
C 10 3.50
输出样例:
A 90.00
C 35.00
B 13.50
解题思路:
-
读取整数N。
-
使用Map存储物资类别和总价值。
-
遍历每行数据,计算每批物资价值(数量 * 单价),并累加到对应类别的总价值中。
-
将Map条目按总价值降序排序。
-
输出每个类别和总价值(保留两位小数)。
import java.util.*;
public class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int n = scanner.nextInt();
Map<String, Double> map = new HashMap<>();
for (int i = 0; i < n; i++) {
String category = scanner.next();
int quantity = scanner.nextInt();
double price = scanner.nextDouble();
double value = quantity * price;
map.put(category, map.getOrDefault(category, 0.0) + value);
}
List<Map.Entry<String, Double>> list = new ArrayList<>(map.entrySet());
list.sort((a, b) -> Double.compare(b.getValue(), a.getValue()));
for (Map.Entry<String, Double> entry : list) {
System.out.printf("%s %.2f\n", entry.getKey(), entry.getValue());
}
}
}
第49题
题目: 给定一个只包含0-9、‘-’、‘*’的合法数学表达式(长度<1000),规定减号‘-’的优先级高于乘号‘*’,请输出计算结果。
输入样例: 12*3-12*2
输出样例: -216
解题思路:
与第47题类似,但运算符是‘-’和‘*’,且‘-’优先级高。算法步骤:
-
将表达式按‘*’分割成多个部分。
-
对于每个部分,如果包含‘-’,则按‘-’分割,第一个数字作为被减数,后续数字作为减数依次减去;否则直接转换为数字。
-
将所有部分的结果相乘。
-
输出结果。
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
String expr = scanner.nextLine();
String[] parts = expr.split("\\*");
double result = 1.0;
for (String part : parts) {
if (part.contains("-")) {
String[] subtrahends = part.split("-");
double value = Double.parseDouble(subtrahends[0]);
for (int i = 1; i < subtrahends.length; i++) {
value -= Double.parseDouble(subtrahends[i]);
}
result *= value;
} else {
result *= Double.parseDouble(part);
}
}
System.out.println((int) result);
}
}
第50题
题目: 数字连连看,给出一个整数数组和一个目标值,请在数组中找到三个元素,它们的和为该目标值。
输入样例:
7 12
2 8 7 6 3 4 3
输出样例: 1 3 5
解题思路:
需要找到三个元素和等于目标值T,输出它们的位置(索引从1开始),且位置字典序最小。算法步骤:
-
读取N和T,以及数组arr。
-
使用Map存储每个元素的所有出现位置(排序)。
-
遍历i从1到N,j从i+1到N,计算need = T - arr[i-1] - arr[j-1]。
-
在Map中查找need,找到最小位置k > j。
-
记录所有解(i, j, k),选择字典序最小的解。
-
输出解或-1。
import java.util.*;
public class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int n = scanner.nextInt();
int t = scanner.nextInt();
int[] arr = new int[n];
Map<Integer, List<Integer>> map = new HashMap<>();
for (int i = 0; i < n; i++) {
arr[i] = scanner.nextInt();
map.computeIfAbsent(arr[i], k -> new ArrayList<>()).add(i + 1);
}
for (List<Integer> list : map.values()) {
Collections.sort(list);
}
int[] best = null;
for (int i = 1; i <= n; i++) {
for (int j = i + 1; j <= n; j++) {
int need = t - arr[i - 1] - arr[j - 1];
if (map.containsKey(need)) {
List<Integer> list = map.get(need);
int k = binarySearch(list, j + 1);
if (k != -1) {
int[] candidate = {i, j, k};
Arrays.sort(candidate);
if (best == null || compare(candidate, best) < 0) {
best = candidate;
}
}
}
}
}
if (best != null) {
System.out.println(best[0] + " " + best[1] + " " + best[2]);
} else {
System.out.println(-1);
}
}
private static int binarySearch(List<Integer> list, int min) {
int left = 0, right = list.size() - 1;
int result = -1;
while (left <= right) {
int mid = left + (right - left) / 2;
if (list.get(mid) >= min) {
result = list.get(mid);
right = mid - 1;
} else {
left = mid + 1;
}
}
return result;
}
private static int compare(int[] a, int[] b) {
for (int i = 0; i < 3; i++) {
if (a[i] != b[i]) return a[i] - b[i];
}
return 0;
}
}
更多推荐
所有评论(0)