当前位置: 首页 > news >正文

Java试题-选择题(1)

Java试题-选择题(1)

题目

  1. Java Application 中的主类需包含main方法,以下哪项是main方法的正确形参?
    A:String args
    B:String[] args
    C:Char arg
    D:StringBuffer[] args

  2. Java要在session对象中保存属性,可以使用以下哪个语句( ) ?
    A:session.getAttribute(“key”,”value”)
    B:session.setAttribute(“key”,”value”)
    C:session.setAttribute(“key”)
    D:session.getAttribute(“key”)

  3. HashSet子类依靠( )方法区分重复元素 ?
    A:toString(),equals()
    B:clone(),equals()
    C:hashCode(),equals()
    D:getClass(),clone()

  4. 下面关于 new 关键字的表述错误的是() ?
    A:new关键字在生成一个对象时会为对象开辟内存空间
    B:new关键字在生成一个对象时会调用类的构造方法
    C:new关键字在生成一个对象时会将生成的对象的地址返回
    D:Java中只能通过new关键字来生成一个对象

  5. 假设 A 类有如下定义,设 a 是 A 类的一个实例,下列语句调用哪个是错误的?()
    A:System.out.println(a.i);
    B:a.method1();
    C:A.method1();
    D:A.method2();

  6. 下列关于修饰符混用的说法,错误的是( ) ?
    A:abstract不能与final并列修饰同一个类
    B:abstract 类中不建议有private的成员
    C:abstract 方法必须在abstract类或接口中
    D:static方法中能直接处理非static的属性

  7. 下列关于Java中类的构造方法的描述,正确的是() ?
    A:构造方法的返回类型为void
    B:可以定义一个类而在代码中不写构造方法。
    C:在同一个类中定义的重载构造方法不可以相互调用。
    D:子类不允许调用父类的构造方法。

  8. 简述以下的变量定义语句中,合法的是() ?
    A:byte a =128;
    B:boolean b =null;
    C:long c=123L;
    D:float d = 0.9239;

  9. 有这样一段程序,请问运行主要的程序会打印出的是什么() ?
    A:2,2
    B:2,3
    C:3,2
    D:3,3

public class Test{public static void main(String [] args){List list=new ArrayList();list.add("a");list.add("b");list.add("a");Set set=new HashSet();set.add("a");set.add("b");set.add("a");System.out.println(list.size()+","+set.size());}
}
  1. 简述在jdk 1.7中,以下说法正确的是( ) ?
    A:Java中所有的非抽象方法都必须在类内定义
    B:Java中主方法可以不在类内定义,其他方法都必须定义在类内
    C:Java中主方法必须定义在类内,其他方法可以不必定义在类内
    D:Java中所有方法都不必在类内定义

  2. 简述运用下列哪个命令能够获取JVM的内存映像 ?
    A:jinfo
    B:jmap
    C:jhat
    D:jstat

  3. 简述以下代码输出什么 ?
    A:0
    B:1
    C:2
    D:不能执行,因为编译有错

class Foo {final int i;int j;public void doSomething() {System.out.println(++j + i);}
}
  1. 简述以下代码输出的是 ?
    A:6
    B:10
    C:都不对
    D:16
public class SendValue{public String str="6";public static void main(String[] args) {SendValue sv=new SendValue();sv.change(sv.str);System.out.println(sv.str);}public void change(String str) {str="10";}
}
  1. 简述下面有关SPRING的事务传播特性,说法错误的是 ?
    A:PROPAGATION_SUPPORTS:支持当前事务,如果当前没有事务,就以非事务方式执行
    B:PROPAGATION_REQUIRED:支持当前事务,如果当前没有事务,就抛出异常
    C:PROPAGATION_REQUIRES_NEW:新建事务,如果当前存在事务,把当前事务挂起
    D:PROPAGATION_NESTED:支持当前事务,新增Savepoint点,与当前事务同步提交或回滚

  2. 简述一个容器类数据结构,读写平均,使用锁机制保证线程安全。如果要综合提高该数据结构的访问性能,最好的办法是______ ?
    A:只对写操作加锁,不对读操作加锁
    B:读操作不加锁,采用copyOnWrite的方式实现写操作
    C:分区段加锁
    D:无法做到

  3. 简述以下Java代码最后输出什么 ?
    A:19
    B:20
    C:21
    D:22

public void test() {int a = 10;System.out.println(a++ + a--);
}
  1. 以下哪个类包含方法flush() ?
    A:InputStream
    B:OutputStream
    C:A 和B 选项都包含
    D:A 和B 选项都不包含

  2. 简述要使某个类能被同一个包中的其他类访问,但不能被这个包以外的类访问,可以( ) ?
    A:让该类不使用任何关键字
    B:使用private关键字
    C:使用protected关键字
    D:使用void关键字

  3. 关于Java中参数传递的说法,哪个是错误的 ?
    A:在方法中,修改一个基础类型的参数不会影响原始参数值
    B:在方法中,改变一个对象参数的引用不会影响到原始引用
    C:在方法中,修改一个对象的属性会影响原始对象参数
    D:在方法中,修改集合和Maps的元素不会影响原始集合参数

  4. 下面代码的输出是什么 ?
    A:null
    B:sub
    C:base

public class Base
{private String baseName = "base";public Base(){callName();}public void callName(){System. out. println(baseName);}static class Sub extends Base{private String baseName = "sub";public void callName(){System. out. println (baseName) ;}}public static void main(String[] args){Base b = new Sub();}
}

答案

1-5:BBCDC
6-10:DBCCA
11-15:BDABC
16-20:CBADA

解析

1. B

Java Application 的主类中,main方法的正确形参为‌B:String[] args‌。以下为详细解析:

Java规范要求‌:main方法必须声明为public static void main(String[] args),其中形参类型必须是String数组(String[]),用于接收命令行输入的参数序列。

参数名称可自定义(如args或ar),但数据类型和数组形式不可更改。
两种声明方式(String[] args或String args[])均有效,但String[] args更符合Java面向对象规范。

选项对比分析‌:

A:String args‌:缺少数组标识符[],仅为单个字符串参数,不符合语法要求。
B:String[] args‌:正确,符合String数组的声明标准。
C:Char arg‌:类型错误(应为String[]而非char)。
D:StringBuffer[] args‌:数组元素类型错误(应为String而非StringBuffer)。

综上,‌B:String[] args‌是唯一符合Java规范的选项。

2. B

在Java中,要在session对象中保存属性,应使用session.setAttribute(“key”, “value”)语句,该方法接受两个参数:键(key)和值(value),用于将属性与指定名称关联存储。 这一方法是保存属性的标准方式,确保数据在整个会话期间可访问。

对于用户提供的选项:

A: session.getAttribute(“key”, “value”)‌ — 错误,因为getAttribute方法仅用于检索属性值,且只接受一个参数(键),不能用于保存属性。
B: session.setAttribute(“key”, “value”)‌ — 正确,符合保存属性的语法要求。
C: session.setAttribute(“key”)‌ — 错误,因为setAttribute方法必须提供键和值两个参数,缺少值参数会导致语法错误。
D: session.getAttribute(“key”)‌ — 错误,该方法仅用于读取属性值,而非保存属性。

因此,正确选项是‌B‌。

3. C

HashSet 区分重复元素的核心机制依赖以下两个方法的组合:

hashCode()‌:
添加元素时,首先调用对象的 hashCode() 方法计算哈希值,确定该元素在哈希表中的存储位置(桶)。
若该桶位置为空,直接存储新元素。
equals()‌:
若目标桶位置非空(即存在哈希冲突),则调用 equals() 方法逐个比较桶内元素的内容。
仅当 hashCode() 值相同且 equals() 返回 true 时,判定为重复元素,拒绝添加。
选项对比:
A:toString(),equals()‌:toString() 仅用于生成字符串表示,不参与重复性判断。
B:clone(),equals()‌:clone() 用于对象克隆,与哈希计算无关。
C:hashCode(),equals()‌:正确组合,符合哈希集合的底层实现逻辑。
D:getClass(),clone()‌:getClass() 返回运行时类信息,clone() 不用于比较操作。

底层原理补充‌:
HashSet 的哈希表结构(数组+链表/红黑树)通过 hashCode() 快速定位桶位置,再通过 equals() 精确校验内容,兼顾效率与准确性。

4. D

A:new关键字在生成一个对象时会为对象开辟内存空间‌
该表述正确。new运算符负责在堆内存中为新对象分配空间,这是对象创建的基础步骤。、

B:new关键字在生成一个对象时会调用类的构造方法‌
该表述正确。使用new创建对象时,系统会自动调用构造方法进行初始化,无论构造方法是显式定义还是由编译器提供的默认无参构造方法。、

C:new关键字在生成一个对象时会将生成的对象的地址返回‌
该表述正确。new操作返回新对象在堆内存中的引用(即地址),该引用会被赋值给变量,从而允许程序访问对象。、

D:Java中只能通过new关键字来生成一个对象‌
该表述错误。new是Java中创建对象的常用方式,但并非唯一途径;其他方法包括反射(如Class.newInstance())、克隆(clone()方法)、反序列化(如从字节流重建对象)等。(仅强调new为"常用的创建对象的方法",未排除其他机制)

5. C

根据给出的类定义(A 类包含实例变量 i、静态变量 s、实例方法 method1() 和静态方法 method2()),下列语句调用分析如下:

A:System.out.println(a.i);‌ — 正确,因为 i 是实例变量,可通过实例 a 直接访问。
B:a.method1();‌ — 正确,因为 method1() 是实例方法,必须通过实例 a 调用。
C:A.method1();‌ — ‌错误‌,因为 method1() 是非静态方法(实例方法),不能通过类名 A 直接调用;必须通过对象实例访问。
D:A.method2();‌ — 正确,因为 method2() 是静态方法,可通过类名 A 直接调用。

因此,错误选项为 ‌C:A.method1();‌。原因是非静态方法依赖于对象实例的上下文,而静态方法属于类本身,可通过类名调用。

6. D

关于修饰符混用的说法,错误选项分析如下:

A. abstract不能与final并列修饰同一个类‌:正确。abstract类必须被继承才能使用,而final类禁止被继承,二者语义冲突,Java编译器会禁止同时使用。
B. abstract类中不建议有private的成员‌:此说法不准确。abstract类允许包含private成员(如字段或非抽象方法),private修饰符不影响类的抽象性,且能用于封装内部实现细节。
C. abstract方法必须在abstract类或接口中‌:正确。抽象方法只能声明在abstract类或接口中;普通类(非抽象类)不能包含抽象方法。
D. static方法中能直接处理非static的属性‌:错误。static方法属于类层级,而非static属性属于实例层级;调用static方法时可能不存在对象实例,因此无法直接访问非static属性,必须通过对象实例间接操作。

综上,错误的说法是D选项。‌

7. B

下列关于Java中类的构造方法的描述,正确的是‌B‌。以下为各选项的详细分析:

A:构造方法的返回类型为void‌
错误。构造方法不能声明任何返回类型(包括void),否则会被编译器视为普通方法而非构造方法。
(例如:定义public void ClassName(){…}会编译为普通方法,无法作为构造方法使用)

B:可以定义一个类而在代码中不写构造方法‌
正确。如果一个类未显式定义任何构造方法,Java编译器会自动提供一个默认的无参构造方法,因此程序仍能正确执行。
(默认构造方法的作用是初始化对象,但开发者可选择不显式编写)

C:在同一个类中定义的重载构造方法不可以相互调用‌
错误。重载构造方法可通过this()相互调用,但必须作为构造方法内的第一条语句。
(例如:在带参构造方法中调用无参构造方法:this();)

D:子类不允许调用父类的构造方法‌
错误。子类必须调用父类构造方法(显式或隐式),通常通过super()实现,且需作为子类构造方法的第一条语句。
(若父类无无参构造方法,子类必须显式调用super(参数))

8. C

在Java变量定义中,合法语句的判断需基于数据类型特性和语法规则,正确选项为‌C:long c=123L;‌。各选项解析如下:

选项分析‌:
A:byte a =128;‌
不合法。byte类型范围为-128~127,128超出最大值,编译错误。
B:boolean b =null;‌
不合法。boolean是基本类型,只能赋值true或false;null仅适用于引用类型。
C:long c=123L;‌
合法‌。long类型需显式添加L后缀(不区分大小写),123L符合语法规则。
D:float d = 0.9239;‌
不合法。0.9239默认是double类型,赋值给float需强制转换或添加F后缀(如0.9239f)。
关键知识点‌:
字面值后缀规则‌:
long类型必须用L(如123L);
float类型必须用F(如0.9239f)。
数据类型范围‌:
byte范围:-128~127;
基本类型(如boolean)不可赋null。

9. C

list.size()‌:ArrayList 允许重复元素,三次添加操作后包含 ‌3 个元素‌(索引:0-“a”, 1-“b”, 2-“a”)。
set.size()‌:HashSet 基于哈希表实现,‌不允许重复元素‌。第二次添加 “a” 时因已存在相同元素,操作被忽略,最终包含 ‌2 个元素‌(“a” 和 “b”)。

正确答案‌:‌C:3,2‌

10. A

在JDK 1.7环境下,选项A正确:‌Java中所有的非抽象方法都必须在类内定义‌。以下是详细分析:

选项A正确‌:在JDK 1.7中,接口仅支持定义抽象方法,因此所有非抽象方法(包括静态方法、实例方法等)必须在类内部定义,无法独立于类存在。例如,主方法(main)作为非抽象方法,也必须定义在类内。

选项B错误‌:主方法作为非抽象方法,同样必须在类内定义,不可独立于类外存在。其他方法(如抽象方法可在接口中定义)也未完全符合此描述。

选项C错误‌:所有方法(包括主方法和其他方法)都必须在类或接口内定义,不存在“其他方法不必在类内定义”的情况。主方法仅是一个特例,但未改变Java的语法规则。

选项D错误‌:Java语言强制要求所有方法必须定义在类或接口内部,不允许独立于类存在。这与Java面向对象的设计原则一致。

综上,正确答案为A。此结论基于JDK 1.7的特性:接口功能受限,非抽象方法必须由类实现。

11. B

获取JVM内存映像的命令是 ‌B:jmap‌。
jmap(Memory Map for Java)工具专门用于生成JVM的堆转储快照(heap dump文件),该文件记录了Java堆中所有存活对象的内存状态,便于后续分析内存使用情况或检测内存泄漏。

其他选项的作用简述:
A:jinfo‌:用于查看或调整JVM运行时配置参数(如系统属性、JVM标志),不涉及内存映像生成。
C:jhat‌:用于分析已生成的堆转储文件(如通过jmap生成的dump),提供Web界面可视化内存对象,但本身不生成内存映像。
D:jstat‌:监控JVM内存统计信息(如垃圾回收频率、堆空间使用率),属于实时性能监控工具,无法导出内存映像文件。

12. D

final 成员变量未初始化‌

final int i; 声明为 final,但‌未在声明时初始化‌,也‌未在构造方法中赋值‌。
Java 要求 final 变量必须被显式初始化(直接赋值或在所有构造方法中初始化),否则编译报错。

13. A

字符串传递机制‌:

sv.str作为参数传递给change()方法时,传递的是‌字符串对象引用的副本‌(值传递),而非原始引用本身‌。
方法内str="10"仅修改了副本的指向,不影响原成员变量sv.str的值‌。

输出逻辑‌:

System.out.println(sv.str)直接访问的是未被修改的成员变量str,其值始终为初始化的"6"‌。
易混淆点‌:
若str为可变对象(如StringBuilder)并通过方法修改其内容(如append),则会影响原对象‌。但本题中String的不可变性决定了结果必然为"6"‌。

总结‌:Java方法参数传递为值传递,对基本类型和对象引用的副本修改均不影响原变量‌。

14. B

A:PROPAGATION_SUPPORTS:支持当前事务,如果当前没有事务,就以非事务方式执行‌
该描述正确。当存在事务时加入当前事务,无事务时以非事务方式执行,符合定义。
B:PROPAGATION_REQUIRED:支持当前事务,如果当前没有事务,就抛出异常‌
该描述错误。实际行为是:如果当前存在事务则加入,若不存在事务则新建一个事务;抛出异常是PROPAGATION_MANDATORY的行为,而非PROPAGATION_REQUIRED。
C:PROPAGATION_REQUIRES_NEW:新建事务,如果当前存在事务,把当前事务挂起‌
该描述正确。始终新建独立事务,若当前有事务则将其挂起。
D:PROPAGATION_NESTED:支持当前事务,新增Savepoint点,与当前事务同步提交或回滚‌
该描述正确。嵌套事务基于保存点实现,回滚仅影响子操作,提交与当前事务同步。

15. C

对于读写操作平均的容器类数据结构,使用锁机制保证线程安全时,综合提高访问性能的最好办法是‌分区段加锁(选项C)‌。
理由如下:

选项A(只对写操作加锁,不对读操作加锁)‌:会导致读操作可能获取脏数据,破坏数据一致性,不适合高并发场景。
选项B(读操作不加锁,采用CopyOnWrite方式实现写操作)‌:适用于读多写少的场景(如读操作远多于写操作),但在读写频率相近时,频繁复制数据会增加开销,反而降低性能。
选项C(分区段加锁)‌:通过将数据划分为多个独立段,每个段单独加锁(例如使用读写锁),仅在操作影响特定段时加锁。这减少了锁竞争范围,提高了读写并行度,从而显著提升整体性能。
选项D(无法做到)‌:由于分区段加锁可有效优化性能,该选项不成立。

综上,在读写平均的场景下,分区段加锁(C)是平衡线程安全和性能的最佳方案。

16. C

执行过程解析:
初始值‌:a = 10
表达式计算‌:a++ + a–
a++‌(后置自增):先使用当前值 10 参与加法运算,随后 a 自增为 11。
a–‌(后置自减):此时 a 已变为 11,先使用 11 参与加法运算,随后 a 自减为 10。
总和‌:10 + 11 = 21
输出结果‌:System.out.println(21)
关键点:
后置操作符(++/–)会先使用变量当前值参与运算,再修改变量值。
运算顺序为从左到右,且表达式中的 a 值会实时更新。

其他选项(19/20/22)均不符合实际计算逻辑。

17. B

flush() 方法的作用‌

用于强制将缓冲区中的字符流、字节流等输出,确保数据完全写入目标(如文件、网络)。
通常在关闭输出流(OutputStream)前调用,避免缓冲区未满导致数据滞留。

OutputStream 包含 flush()‌:作为所有输出流的基类,OutputStream 定义了 flush() 方法(需子类实现)。

public abstract class OutputStream {public void flush() throws IOException { /* ... */ }
}

InputStream 不包含 flush()‌:输入流(如 FileInputStream)负责读取数据,无需刷新缓冲区,因此未定义该方法。

18. A

默认访问权限(无关键字)‌:
当类‌不声明任何访问修饰符‌时,自动获得包级访问权限(又称默认访问权限)。
此时,同一包内的其他类可访问该类,但包外类无法访问。

B:private关键字‌:
private仅能修饰类成员(如变量或方法),不能修饰顶层类本身。
C:protected关键字‌:
protected修饰符适用于类成员或内部类,不能用于顶层类。
D:void关键字‌:
void用于标识方法无返回值,与类访问权限完全无关。

19. D

A:在方法中,修改一个基础类型的参数不会影响原始参数值‌
正确。基本类型(如int、double)参数传递是值传递(传值副本),方法内修改形参不会影响实参值。
B:在方法中,改变一个对象参数的引用不会影响到原始引用‌
正确。对象参数传递的是引用的副本(即对象地址的副本),方法内让形参指向新对象时,实参的引用不变。
C:在方法中,修改一个对象的属性会影响原始对象参数‌
正确。对象参数传递的是引用副本,形参和实参指向同一对象。通过形参修改对象属性(如obj.name=“new”)会影响原始对象。
D:在方法中,修改集合和Map的元素不会影响原始集合参数‌
错误‌。集合和Map作为对象参数传递时,传递的是引用副本。修改其元素(如list.add()或map.put())会直接影响原始集合,因为操作的是同一内存对象。

总结‌:Java参数传递本质是‌值传递‌,基本类型传值副本,引用类型传引用副本。
注意事项:
修改引用副本的指向(如obj = new Object())不影响实参;
通过引用副本修改对象内容(属性、集合元素)会影响实参。

20. A

关键执行流程
对象初始化顺序‌:
当执行 new Sub() 时,首先调用父类 Base 的构造函数(因为子类未显式调用父类构造方法,默认调用无参构造)。
在 Base 的构造函数中,callName() 被调用。由于子类 Sub 重写了 callName() 方法,实际执行的是子类的 callName()(多态)。

字段初始化时机‌:
父类 Base 的 baseName 字段初始化为 “base”,但此时子类 Sub 的 baseName 尚未初始化(字段初始化在构造函数执行‌之后‌完成)。
因此,子类 callName() 中打印的 baseName 是默认值 null(String 类型未初始化时的默认值)。

输出结果‌:
最终打印的是子类 Sub 中未初始化的 baseName,即 null。

http://www.dtcms.com/a/306876.html

相关文章:

  • 【C++】适配器模式手搓STL的stack和queue
  • LeetCode Hot 100:15. 三数之和
  • Nuxt3 全栈作品【通用信息管理系统】角色管理(含配置权限 -- 菜单权限 vs 操作权限)
  • 差分数组前缀和优化,降低时间复杂度
  • vue+elementui+vueCropper裁剪上传图片背景颜色为黑色解决方案
  • ‌我的第一个开源项目:跃动的心
  • 物流分拣漏检率↓78%!陌讯动态光流算法在包裹移动识别的技术突破
  • GCC链接技术深度解析:性能与空间优化
  • [mcp: McpSchema]-源码分析
  • 第1课:向量与矩阵运算
  • 搭建实时足球比分系统从零到一的实战指南
  • Day 4-1: 机器学习算法全面总结
  • 全新AI工具小程序源码 全开源(源码下载)
  • 深入浅出:在 Spring Boot 中构建实时应用 - 全面掌握 WebSocket
  • 解决 Docker 报错 “exec: no such file or directory”
  • 文件权限值的表示方法
  • PHP/Java/Python实现:如何有效防止恶意文件上传
  • Go 语言make函数
  • 输电线路绝缘子泄漏电流在线监测装置的技术解析与应用价值
  • Python读取获取波形图波谷/波峰
  • Directory Opus 使用优化
  • 30道JS高频经典笔试题集合+详解(一)
  • 视觉系统引导冲床冲压:工业自动化的“智能之眼”
  • Dify 从入门到精通(第 4/100 篇):快速上手 Dify 云端:5 分钟创建第一个应用
  • AI培训项目《人工智能大模型应用工程师》课程学习大纲分享!
  • 【sklearn(01)】数据集加载、划分,csv文件创建,特征工程,无量纲化
  • 【编号65】广西地理基础数据(道路、水系、四级行政边界、地级城市、DEM等)
  • 我的世界模组开发教程——资源(1)
  • JeecgBoot(1):前后台环境搭建
  • C#_创建自己的MyList列表