Java试题-选择题(10)
Java试题-选择题(10)
题目
-
虚拟内存是基于程序的局部性原理而设计的。下面关于局部性原理描述正确的是()
A.程序代码顺序执行
B.程序按照非一致性方式访问内存
C.程序连续地访问许多变量
D.程序在一段时间内访问相对小的一段地址空间 -
Java Application 中的主类需包含main方法,以下哪项是main方法的正确形参?
A:String args
B:String[] args
C:Char arg
D:StringBuffer[] args -
若有定义:byte[]x={11,22,33,﹣66};其中0≤k≤3,则对x数组元素错误的引用是() ?
A:x[5-3]
B:x[k]
C:x[k+5]
D:x[0] -
下列关于Java语言中String和char的说法,正确的是() ?
A:String是Java定义的一种基本数据类型。
B:String是以“\0”结尾的char类型的数组char[]。
C:使用equals()方法比较两个String是否内容一样(即字符串中的各个字符都一样)。
D:Char类型在Java语言里面存储的是ASCII码。 -
java中,要表示10个学生的成绩,下列声明并初始化数组正确的是() ?
A:int[] score=new int[ ]
B:int score[10]
C:int score[]=new int[10] -
设int x=1,float y=2,则表达式x/y的值是:() ?
A:0
B:1
C:2
D:以上都不是 -
下列java程序的输出结果为____ ?
A:hello and ab
B:hello and cb
C:hello and a
D:test ok and ab
public class Example{String str=new String("hello");char[]ch={'a','b'};public static void main(String args[]){Example ex=new Example();ex.change(ex.str,ex.ch);System.out.print(ex.str+" and ");System.out.print(ex.ch);}public void change(String str,char ch[]){str="test ok";ch[0]='c';}
}
- 下列循环语句序列执行完成后,i的值是() ?
A:2
B:10
C:11
D:不确定
int i;
for(i=2;i<=10;i++){System.out.println(i);
}
-
下面关于垃圾收集的说法正确的是 ?
A:一旦一个对象成为垃圾,就立刻被收集掉。
B:对象空间被收集掉之后,会执行该对象的finalize方法
C:finalize方法和C++的析构函数是完全一回事情
D:一个对象成为垃圾是因为不再有引用指着它,但是线程并非如此 -
以下关于集合类ArrayList、LinkedList、HashMap描述错误的是() ?
A:HashMap实现Map接口,它允许任何类型的键和值对象,并允许将null用作键或值
B:ArrayList和LinkedList均实现了List接口
C:添加和删除元素时,ArrayList的表现更佳
D:ArrayList的访问速度比LinkedList快 -
子类要调用继承自父类的方法,必须使用super关键字 ?
A正确
B错误 -
在 Java 中,属于整数类型变量的是() ?
A:single
B:double
C:byte
D:char -
关于抽象类与最终类,下列说法错误的是?
A:抽象类能被继承,最终类只能被实例化。
B:抽象类和最终类都可以被声明使用
C:抽象类中可以没有抽象方法,最终类中可以没有最终方法
D:抽象类和最终类被继承时,方法可以被子类覆盖 -
假设 A 类有如下定义,设 a 是 A 类同一个包下的一个实例,下列语句调用哪个是正确的 ?(多选)
A:System.out.println(a.i);
B:a.method1();
C:A.method1();
D:A.method2()
class A{int i;static String s;void method1() { }static void method2() { }
}
- 定义如下程序:程序执行结果是?
A:1
B:1f
C:运行报错
D:编译报错
public static void main(String[] args){Double x=1.2;long l = 1.2;float f = x/l;System.out.println(f);
}
-
下列哪个选项是正确计算42度(角度)的余弦值?
A:double d = Math.cos(42)
B:double d = Math.cosine(42)
C:double d = Math.cos(Math.toRadians(42))
D:double d = Math.cos(Math.toDegrees(42)) -
下列说法正确的是() ?
A:WebLogic中开发消息Bean的non-persistent 方式可以保证消息的可靠
B:EJB容器发生错误,non-persistent方式下JMS容器仍然会将消息发送
C:EJB容器发生错误,persistent方式下JMS容器仍然会将消息发送
D:EJB容器发生错误,两种方式下JMS容器仍会在MDB可用的时候将消息发送 -
下列代码执行结果为() ?
A:21
B:12
C:可能为12,也可能为21
D:以上答案都不对
public static void main(String args[])throws InterruptedException{Thread t=new Thread(new Runnable() {public void run() {try {Thread.sleep(2000);} catch (InterruptedException e) {throw new RuntimeException(e);}System.out.print("2");}});t.start();t.join();System.out.print("1");
}
- 下面代码运行结果是 ?
A:15 0 20
B:15 0 15
C:20 0 20
D:0 15 20
class Value{public int i=15;
}
public class Test{public static void main(String argv[]){Test t=new Test( );t.first( );}public void first( ){int i=5;Value v=new Value( );v.i=25;second(v,i);System.out.println(v.i);}public void second(Value v,int i){i = 0;v.i = 20;Value val = new Value( );v = val;System.out.println(v.i+" "+i);}
}
- jdk1.8中,下面有关java 抽象类和接口的区别,说法错误的是 ?(多选)
A:抽象类可以有构造方法,接口中不能有构造方法
B:抽象类中可以包含非抽象的普通方法,接口中的方法必须是抽象的,不能有非抽象的普通方法
C:一个类可以实现多个接口,但只能继承一个抽象类
D:接口中可以有普通成员变量,抽象类中没有普通成员变量
答案
1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 |
---|---|---|---|---|---|---|---|---|---|
D | B | C | C | C | D | B | C | D | C |
11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 |
---|---|---|---|---|---|---|---|---|---|
B | C | D | ABD | D | C | C | A | A | BD |
解析
1. D
局部性原理是计算机程序访问内存时表现出的集中趋势,该原理分为时间局部性和空间局部性两个方面:时间局部性指程序在短时间内重复访问相同的内存位置(如循环指令),空间局部性指程序倾向于访问邻近的内存单元(如顺序访问数组)。虚拟内存的设计正是基于这一原理,通过预测程序行为的集中性,高效管理内存资源。
针对题目中的选项分析:
A. 程序代码顺序执行:不正确。局部性原理包含顺序执行(体现空间局部性),但并非仅限顺序执行;例如,循环结构中的非顺序跳转也能体现局部性(如重复调用相同函数)。
B. 程序按照非一致性方式访问内存:不正确。局部性原理强调访问模式的一致性(集中性),即内存访问集中在特定区域而非随机分散。
C. 程序连续地访问许多变量:描述片面。空间局部性涉及连续访问,但核心是“访问相对小的一段地址空间”(如数组元素),而非简单地访问“许多变量”;时间局部性还可能涉及少量变量的重复访问(如循环计数器)。
D. 程序在一段时间内访问相对小的一段地址空间:正确。这直接对应局部性原理的本质,即程序运行时内存访问局限于特定区域(如工作集),减少缺页中断,支撑虚拟内存效率。
2. B
Java Application 的主类中,main 方法的正确形参必须是 String 类型的数组。 因此,正确选项为 B:String[] args,因为它符合 Java 语法要求,参数声明为 String[] 或等效形式(数组符号 [] 可在类型后或变量名后)。
3.C
给定数组定义:byte[] x = {11, 22, 33, -66},数组长度为4,有效索引范围为0到3。
4. C
选项 A 错误:String 在 Java 中不是基本数据类型,而是一个类(引用类型)。Java 的基本数据类型包括 byte、short、int、long、float、double、char 和 boolean 八种,String 不在其中。
选项 B 错误:String 在 Java 中不以“\0”结尾的 char 数组形式存储。虽然 String 内部使用 char 数组(char[])实现,但 Java 的字符串处理不依赖空字符终止符,这与 C 语言不同。
选项 C 正确:使用 equals() 方法可以比较两个 String 对象的内容是否一致,即字符串中的每个字符及其顺序完全相同。equals() 方法覆盖了 Object 类的实现,专门用于字符串内容比较。
选项 D 错误:char 类型在 Java 中存储的是 Unicode 编码(UTF-16),而不是 ASCII 码。ASCII 码仅涵盖 0-127 的字符,而 Java char 支持全球语言字符集,使用 16 位 Unicode 表示。
5. C
在Java中,要表示10个学生的成绩(即需要一个长度为10的整型数组),正确的数组声明并初始化方式必须满足:
数组类型为 int(成绩通常为整数)。
数组长度必须明确指定为10。
语法符合Java规范:声明时数组大小不能出现在变量名后(如 int score[10] 无效),且动态初始化必须使用 new 关键字并指定长度或提供初始化列表。
6.D
表达式 x/y 中,x 是 int 类型,值为 1;y 是 float 类型,值为 2.0。在大多数编程语言(如C、C++、Java等)中,当整数和浮点数进行二元运算时,整数会隐式提升为浮点数,然后执行浮点除法。因此,表达式 x/y 等价于 1.0 / 2.0,结果为浮点数 0.5。
7.B
代码分析
成员变量:
str 是 String 类型,初始值为 “hello”。
ch 是 char 数组,初始值为 {‘a’, ‘b’}。
main 方法:
创建 Example 实例 ex。
调用 ex.change(ex.str, ex.ch),传入 str 和 ch。
打印 ex.str 和 ex.ch。
change 方法:
接收 String str 和 char[] ch 参数。
修改 str = “test ok”(但不会影响原 ex.str,因为 String 是不可变的,且 str 是局部变量)。
修改 ch[0] = ‘c’(会影响原数组,因为数组是引用类型)。
关键点
String 不可变:change 方法里的 str = “test ok” 不会影响 ex.str(仍然是 “hello”)。
数组可变:ch[0] = ‘c’ 会修改原数组,因此 ex.ch 变为 {‘c’, ‘b’}。
输出结果
ex.str 仍然是 “hello”。
ex.ch 变为 {‘c’, ‘b’},打印时输出 cb。
最终输出:hello and cb
8. C
逐步模拟循环执行:
i = 2:条件 2 <= 10 为真,执行循环体(打印 2),然后 i++ 使 i = 3。
i = 3:条件 3 <= 10 为真,执行循环体(打印 3),然后 i++ 使 i = 4。
依此类推,当 i = 10 时:条件 10 <= 10 为真,执行循环体(打印 10),然后 i++ 使 i = 11。
i = 11:条件 11 <= 10 为假,循环终止。
9. D
选项A错误:对象成为垃圾后并不会立即被收集掉。垃圾回收的时机由JVM决定,具有不确定性,通常发生在内存不足或CPU空闲时,而非对象成为垃圾的瞬间。
选项B错误:对象的finalize()方法在垃圾回收之前调用,而非对象空间被收集掉之后。JVM在准备回收对象时,若对象重写了finalize()方法,会在销毁前调用它进行清理工作。
选项C错误:Java的finalize()方法与C++的析构函数不完全相同。finalize()是非确定性的,由垃圾回收器在不确定的时间调用;而C++析构函数是确定性的,在对象离开作用域或显式删除时立即执行。
选项D正确:
对象成为垃圾的标准是它不再被任何引用指向(即从GC Roots不可达),这是垃圾回收的基本判定依据。
但线程(此处指执行线程,而非Thread对象)并非基于引用计数或可达性判断其“垃圾”状态。线程的生命周期由其执行任务决定,结束时由操作系统或JVM管理资源回收,与对象引用机制无关。
10. C
A: HashMap实现Map接口,它允许任何类型的键和值对象,并允许将null用作键或值
正确。HashMap实现了Map接口,支持任意类型的键和值(包括null键和null值),这是其核心特性。
B: ArrayList和LinkedList均实现了List接口
正确。ArrayList和LinkedList都是List接口的实现类,用于存储有序集合。
C: 添加和删除元素时,ArrayList的表现更佳
错误。LinkedList基于双向链表实现,插入或删除元素(尤其在头部或中间位置)仅需调整指针(O(1)时间复杂度),而ArrayList基于动态数组,需要移动后续元素(O(n)时间复杂度),因此LinkedList在添加/删除操作上更优。
D: ArrayList的访问速度比LinkedList快
正确。ArrayList支持随机访问(通过索引直接定位,O(1)时间复杂度),而LinkedList需遍历链表(O(n)时间复杂度),因此ArrayList访问速度更快。
11. B
直接调用继承方法:
当子类未重写父类方法时,可直接通过方法名调用继承的方法,无需super。
super 关键字的适用场景:
主要用于子类重写方法后需调用父类原实现时(如super().method())。
12. C
在 Java 中,基本数据类型分为整数类型、浮点类型、字符类型和布尔类型。根据 Java 规范:
整数类型(用于存储整数值)包括:
byte(8 位有符号整数)、short(16 位)、int(32 位)、long(64 位)。
浮点类型(用于存储小数)包括:
float(单精度浮点数)、double(双精度浮点数)。
字符类型:
char(16 位 Unicode 字符,不属于整数类型)。
布尔类型:
boolean(true/false)。
13. D
抽象类:不能被直接实例化,只能被继承。它可以包含抽象方法(没有实现)和具体方法(有实现)。抽象类可以没有抽象方法(即所有方法都有实现,但类本身被声明为抽象)。当子类继承抽象类时,可以覆盖其非 final 方法。
最终类:不能被继承(即不能被扩展),只能被实例化。它可以包含方法,但这些方法不需要声明为 final;最终类中可以没有 final 方法。由于最终类不能被继承,因此没有子类可以覆盖其方法。
A:抽象类能被继承,最终类只能被实例化。
正确。抽象类的设计目的是被继承,而最终类禁止继承,只能通过实例化使用。
B:抽象类和最终类都可以被声明使用。
正确。抽象类可以被声明(例如作为类型引用或用于继承),最终类可以被声明并实例化。两者在代码中均可被使用。
C:抽象类中可以没有抽象方法,最终类中可以没有最终方法。
正确。抽象类不一定需要包含抽象方法(例如,一个抽象类可以全部是具体方法,但类本身标记为 abstract)。最终类中的方法也不需要声明为 final(例如,一个最终类可以全部是普通方法,但类本身标记为 final)。
D:抽象类和最终类被继承时,方法可以被子类覆盖。
错误。
14. ABD
选项 A:System.out.println(a.i);
i 是实例变量,必须通过实例访问。a 是 A 类的实例,且在同一包下(满足默认包访问权限),正确。
选项 B:a.method1();
method1() 是实例方法,必须通过实例调用。a 是有效实例,且在同一包下,正确 。
选项 C:A.method1();
method1() 是实例方法,不能通过类名 A 直接调用(必须通过实例),错误。
选项 D:A.method2();
method2() 是静态方法,可以通过类名 A 直接调用,且无需实例,正确。
15. D
错误原因:
long l = 1.2; 导致编译失败:
1.2 是 double 类型字面量,而 long 是整型。Java要求从高精度(double)到低精度整型(long)必须显式强制转换,否则编译器报错。
正确写法应为:long l = (long)1.2;(结果为 l=1)。
16. C
角度与弧度的区别:
Math.cos() 的参数要求是弧度,而题目中的 42 是角度值,直接传入会导致计算错误(选项A错误)。
必须先将角度转换为弧度,再计算余弦值。
选项分析:
A:Math.cos(42)
直接计算42弧度的余弦值(错误,因42是角度而非弧度)。
B:Math.cosine(42)
Java中不存在Math.cosine()方法(语法错误)。
C:Math.cos(Math.toRadians(42))
正确!Math.toRadians(42)将42度转换为弧度,再计算余弦值。
D:Math.cos(Math.toDegrees(42))
Math.toDegrees(42)会将42弧度转为角度(约2406度),逻辑反了(错误)。
17. C
A:错误。WebLogic中开发消息Bean的non-persistent方式无法保证消息的可靠性,因为非持久化消息仅存储在内存中,若系统故障(如EJB容器或JMS服务器异常),消息会被直接丢弃,无法恢复或重传。
B:错误。EJB容器发生错误时,在non-persistent方式下,JMS容器通常不会将消息发送给MDB,因为非持久化消息未被持久化存储(如磁盘),故障可能导致消息永久丢失,JMS容器无法在后续恢复传递。
C:正确。persistent方式通过将消息持久化存储(如数据库或磁盘),确保即使EJB容器发生错误,JMS容器仍能保留消息,并在MDB可用时重新发送,从而保障消息传递的可靠性。
D:错误。non-persistent方式在EJB容器错误时无法保证消息传递(消息可能被丢弃),仅persistent方式支持在MDB可用时恢复发送;因此“两种方式下”的表述不成立。
18. A
代码执行流程:
创建并启动线程 t:
线程 t 启动后,会睡眠 2000 毫秒(2秒),然后打印 “2”。
t.join() 的作用:
t.join() 会使 主线程(main)等待线程 t 执行完毕。
主线程在调用 t.join() 后阻塞,直到线程 t 结束。
执行顺序:
线程 t 先睡眠 2 秒 → 打印 “2” → 线程 t 结束。
主线程在 t.join() 处等待 t 结束后,继续执行 → 打印 “1”。
输出结果:
先输出线程 t 打印的 “2”,再输出主线程打印的 “1”,结果为 “21”。
19. A
代码执行流程:
main 方法:
创建 Test 对象 t,调用 t.first()。
first 方法:
局部变量 i = 5(与成员变量无关)。
创建 Value 对象 v,初始 v.i = 15(类默认值)。
修改 v.i = 25。
调用 second(v, i),传入引用 v 和值 i(值传递)。
second 方法:
修改局部参数 i = 0(不影响 first 中的 i)。
修改传入的 v.i = 20(此时原 v 对象的 i 变为 20)。
新建 Value 对象 val(val.i = 15),并让局部变量 v 指向 val(不影响 first 中的 v)。
打印 v.i(即 val.i)和局部 i:输出 15 0。
返回 first 方法:
打印 v.i:此时 v 仍指向原对象(i 已被 second 改为 20),输出 20。
输出顺序:
second 中打印:15 0
first 中打印:20
关键点:
Java 是值传递:second 方法中的 v 是引用的副本,重新赋值 v = val 不影响原调用方的 v。
对象属性可修改:即使传递的是引用副本,通过副本修改属性(如 v.i = 20)会影响原对象。
20. BD
A:抽象类可以有构造方法,接口中不能有构造方法
该描述正确。抽象类可以定义构造方法用于初始化,而接口不能包含任何构造方法。
B:抽象类中可以包含非抽象的普通方法,接口中的方法必须是抽象的,不能有非抽象的普通方法
该描述在 JDK 1.8 中错误。接口从 JDK 1.8 开始支持默认方法(default methods)和静态方法,这些是非抽象的普通方法(有具体实现),因此接口中的方法不必须是抽象的。
C:一个类可以实现多个接口,但只能继承一个抽象类
该描述正确。Java 支持单继承(只能继承一个抽象类),但允许多个接口实现。
D:接口中可以有普通成员变量,抽象类中没有普通成员变量
该描述错误。接口中的成员变量默认为 public static final 常量,不能有普通成员变量(即实例变量);而抽象类可以包含普通成员变量。