Java试题-选择题(1)
Java试题-选择题(1)
题目
-
Java Application 中的主类需包含main方法,以下哪项是main方法的正确形参?
A:String args
B:String[] args
C:Char arg
D:StringBuffer[] args -
Java要在session对象中保存属性,可以使用以下哪个语句( ) ?
A:session.getAttribute(“key”,”value”)
B:session.setAttribute(“key”,”value”)
C:session.setAttribute(“key”)
D:session.getAttribute(“key”) -
HashSet子类依靠( )方法区分重复元素 ?
A:toString(),equals()
B:clone(),equals()
C:hashCode(),equals()
D:getClass(),clone() -
下面关于 new 关键字的表述错误的是() ?
A:new关键字在生成一个对象时会为对象开辟内存空间
B:new关键字在生成一个对象时会调用类的构造方法
C:new关键字在生成一个对象时会将生成的对象的地址返回
D:Java中只能通过new关键字来生成一个对象 -
假设 A 类有如下定义,设 a 是 A 类的一个实例,下列语句调用哪个是错误的?()
A:System.out.println(a.i);
B:a.method1();
C:A.method1();
D:A.method2(); -
下列关于修饰符混用的说法,错误的是( ) ?
A:abstract不能与final并列修饰同一个类
B:abstract 类中不建议有private的成员
C:abstract 方法必须在abstract类或接口中
D:static方法中能直接处理非static的属性 -
下列关于Java中类的构造方法的描述,正确的是() ?
A:构造方法的返回类型为void
B:可以定义一个类而在代码中不写构造方法。
C:在同一个类中定义的重载构造方法不可以相互调用。
D:子类不允许调用父类的构造方法。 -
简述以下的变量定义语句中,合法的是() ?
A:byte a =128;
B:boolean b =null;
C:long c=123L;
D:float d = 0.9239; -
有这样一段程序,请问运行主要的程序会打印出的是什么() ?
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());}
}
-
简述在jdk 1.7中,以下说法正确的是( ) ?
A:Java中所有的非抽象方法都必须在类内定义
B:Java中主方法可以不在类内定义,其他方法都必须定义在类内
C:Java中主方法必须定义在类内,其他方法可以不必定义在类内
D:Java中所有方法都不必在类内定义 -
简述运用下列哪个命令能够获取JVM的内存映像 ?
A:jinfo
B:jmap
C:jhat
D:jstat -
简述以下代码输出什么 ?
A:0
B:1
C:2
D:不能执行,因为编译有错
class Foo {final int i;int j;public void doSomething() {System.out.println(++j + i);}
}
- 简述以下代码输出的是 ?
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";}
}
-
简述下面有关SPRING的事务传播特性,说法错误的是 ?
A:PROPAGATION_SUPPORTS:支持当前事务,如果当前没有事务,就以非事务方式执行
B:PROPAGATION_REQUIRED:支持当前事务,如果当前没有事务,就抛出异常
C:PROPAGATION_REQUIRES_NEW:新建事务,如果当前存在事务,把当前事务挂起
D:PROPAGATION_NESTED:支持当前事务,新增Savepoint点,与当前事务同步提交或回滚 -
简述一个容器类数据结构,读写平均,使用锁机制保证线程安全。如果要综合提高该数据结构的访问性能,最好的办法是______ ?
A:只对写操作加锁,不对读操作加锁
B:读操作不加锁,采用copyOnWrite的方式实现写操作
C:分区段加锁
D:无法做到 -
简述以下Java代码最后输出什么 ?
A:19
B:20
C:21
D:22
public void test() {int a = 10;System.out.println(a++ + a--);
}
-
以下哪个类包含方法flush() ?
A:InputStream
B:OutputStream
C:A 和B 选项都包含
D:A 和B 选项都不包含 -
简述要使某个类能被同一个包中的其他类访问,但不能被这个包以外的类访问,可以( ) ?
A:让该类不使用任何关键字
B:使用private关键字
C:使用protected关键字
D:使用void关键字 -
关于Java中参数传递的说法,哪个是错误的 ?
A:在方法中,修改一个基础类型的参数不会影响原始参数值
B:在方法中,改变一个对象参数的引用不会影响到原始引用
C:在方法中,修改一个对象的属性会影响原始对象参数
D:在方法中,修改集合和Maps的元素不会影响原始集合参数 -
下面代码的输出是什么 ?
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。