错题集锦(选择题)

1

以下程序的输出结果为

class Base{
	public Base(String s){
		System.out.print("B");
	}
}

public class Derived extends Base{
	public Derived (String s) {
		System.out.print("D");
    }
    
	public static void main(String[] args){
		new Derived("C");
	}
}

A: BD
B: DB
C: C
D: 编译错误

解析:子类在构造之前首先要为父类构造,否则会调用不带参数的构造方法,而此时如果父类没有无参的构造方法就会编译报错~故选D

2

结构化程序的三种基本结构是( )
A: 递归、迭代和回溯
B: 过程、函数和子程序
C: 顺序、选择和循环
D: 调用、返回和选择

解析:仅使用顺序、选择、循环三种基本控制结构就足以表达出各种其他形式结构的程序设计方法。故本题答案为 C 选项。

3

在Java中下面Class的声明哪些是错误的?
A public abstract final class Test { abstract void method(); }
B public abstract class Test { abstract final void method(); }
C public abstract class Test { abstract void method() { } }
D public class Test { final void method() { }}

解析:abstract不能与final同时出现,并且抽象类中抽象方法不需要具体实现,因此不需要大括号,故选ABC

4

下面哪些赋值语句是正确的()
A long test=012
B float f=-412
C int other =(int)true
D double d=0x12345678
E byte b=128

解析:A是一个8进制,可以赋值~ B是赋值一个负数也可以 ~ C Java布尔类型就是布尔类型不能强转~ D是一个16进制也能赋值~ E byte的取值是[ -128, 127]因此超出范围不正确~

5

class A{
    int val;
    public A(int val){
        setValue(val);
    }

    public void setValue(int val) {
        this.val = val;
    }
}
class B extends A{

    public B(int val) {
        super(val);
    }

    public void setValue(int val){
        super.setValue(2 * val);
    }
}
public class demo1 {
    public static void main(String[] args) {
        B b = new B(10);
        System.out.println(b.val);
    }
}

以上代码输出是____

解析:这道题首先需要知道代码发生了啥~
构造B时首先会为父类A构造,而A在构造方法中使用了一个子类重写过的方法就会发生动态绑定在这里插入图片描述因次他会使用子类的重写方法结果返回就是20了~

6

JAVA语言的下面几种数组复制方法中,哪个效率最高?
A for循环逐一复制
B System.arraycopy
C Arrays.copyOf
D 使用clone方法

解析:for循环需要每次从起点寻位到下标处,且每次都需比较是否超出数组最大长度并进行一次下标加一操作~ System.arraycopy对于非基本类型拷贝的是一个引用,而不是去创建一个对象,因此效率较高~至于Arrays.copyof
在这里插入图片描述其内部调用了System.arraycopy方法,并且在这之前还重新创建了一个数组对象,因此效率是不如Sys…,而clone方法对于数组是一个浅拷贝,只拷贝引用,对于非数组则是深拷贝,即重新new了一个对象,但是对于数组的拷贝效率还是高于Arrays.copyof的
即System.arraycopy > clone > Arrays.copyOf > for循环逐一复制

7

关于 JAVA 堆,下面说法错误的是()
A 所有类的实例和数组都是在堆上分配内存的
B 对象所占的堆内存是由自动内存管理系统回收
C 堆内存由存活和死亡的对象,空闲碎片区组成
D 数组是分配在栈中的

解析:所有用关键字new出来的对象都是在堆上分配内存的,因此A√,D×,BC记住即可

8

下列Java代码中的变量a、b、c分别在内存的____存储区存放

class A {
	private String a = “aa”;
	public boolean methodB() {
		String b = “bb”;
		final String c = “cc”;
	}
}

A 堆区、堆区、堆区
B 堆区、栈区、堆区
C 堆区、栈区、栈区
D 堆区、堆区、栈区
E 静态区、栈区、堆区
F 静态区、栈区、栈区

解析:实例是存在堆上的,a是一个全局变量,随着类实例的消亡而消亡,因此a在堆区,b,c都是局部变量,而方法是在栈帧上的,局部变量随着方法存储在栈帧中,因此都在栈区~

9

代码片段:

byte b1=1,b2=2,b3,b6;
final byte b4=4,b5=6;
b6=b4+b5;
b3=(b1+b2);
System.out.println(b3+b6);

关于上面代码片段叙述正确的是()
A 输出结果:13
B 语句:b6=b4+b5编译出错
C 语句:b3=b1+b2编译出错
D 运行期抛出异常

解析:被final修饰的变量类型和数值不会再发生改变,而 + 号运算符会使byte类型转化为int型,因此b6的赋值语句并没有错,而b3赋值的右边已经是int型了赋给一个byte类型会报错~

10

下列选项中,不可能是快速排序第2趟排序结果的是 ()
A 2,3,5,4,6,7,9
B 2,7,5,6,4,3,9
C 3,2,5,4,7,6,9
D 4,2,3,5,7,6,9

解析:每进行一次快排,都会有一处标定点到达最终位置,因此进行了两次快排,就至少会有两个元素是处于正确位置的~

11

下面关于程序编译说法正确的是()
A java语言是编译型语言,会把java程序编译成二进制机器指令直接运行
B java编译出来的目标文件与具体操作系统有关
C java在运行时才进行翻译指令
D java编译出来的目标文件,可以运行在任意jvm上

解析:A:java是半编译半执行的语言 B :java编译出来的目标文件也就是class文件,是一个面向jvm的二进制文件,与操作系统无关~ C java 在编译时将*.java文件变为.class文件,在运行时通过java命令将class文件翻译成计算机能识别的机器指令~ D jvm也是有版本的,版本不同,就不一定能运行~

12

下面那些情况可以终止当前线程的运行?
A 当一个优先级高的线程进入就绪状态时
B 抛出一个异常时
C 当该线程调用sleep()方法时
D 当创建一个新线程时

解析:线程终止有两个条件:

  • 线程任务执行完毕(正常终止)
  • 线程执行过程中出现一个异常

因此B正确,至于AD是其他线程的操作不影响这个线程~

13

在java7中,下列哪个说法是正确的:
A ConcurrentHashMap使用synchronized关键字保证线程安全
B HashMap实现了Collection接口
C Arrays.asList方法返回java.util.ArrayList对象
D SimpleDateFormat对象是线程不安全的

解析:A CurrentHashMap是采用lock锁来保证线程安全的 B Collection是线性表的顶级接口,Hashmap实现的Map接口
C:在这里插入图片描述asList返回的是一个List的接口对象D记住即可

14

以下程序执行的结果是:

class X{
	Y y=new Y();
	public X(){
		System.out.print("X");
	}
}
class Y{
	public Y(){
		System.out.print("Y");
	}
}
public class Z extends X{
	Y y=new Y();
	public Z(){
		System.out.print("Z");
	}
	public static void main(String[] args) {
		new Z();
	}
}

A ZYXX
B ZYXY
C YXYZ
D XYZX

解析:此题两个考点:

  • 继承时先调用父类的构造方法
  • 类中成员变量的初始化都在构造方法中进行

因此①new Z时会先调用父类构造方法,而X类中的成员变量 y 会在构造方法中进行,即先进行Y y = new Y()操作,②再进行打印 X ,③然后子类的成员变量在构造方法中先进行Y y = new Y() ④进行输出Z

15

有如下4条语句:()

Integer i01=59;
int i02=59;
Integer i03=Integer.valueOf(59);
Integer i04=new Integer(59);

以下输出结果为false的是:
A System.out.println(i01== i02);
B System.out.println(i01== i03);
C System.out.println(i03== i04);
D System.out.println(i02== i04);

解析:AD 当包装类与基本数据类型进行比较的时候会自动拆箱,即变为int类型,因此结果为true B中i01会自动装箱,与i03产生的显示装箱一模一样,C中i04进行了new操作,就会引入新的引用对象,因此结果时false

16

以下关于多线程的叙述错误的是:
A 线程同步的方法包括使用临界区,互斥量,信号量等
B 两个线程同时对简单类型全局变量进行写操作也需要互斥
C 实现可重入函数时,对自动变量也要用互斥量加以保护
D 可重入函数不可以调用不可重入函数

解析:首先了解下这些概念:

  • 目前实现线程同步的方法包括临界区,互斥量,信号量,事件
  • 临界区:通过对多线程的串行化来访问公共资源或一段代码,速度快,适合控制数据访问
  • 互斥量:为协调对同一共享资源进行单独访问的而设计成的
  • 信号量:为控制一个具有有限数量用户资源而设计的
  • 事件:用来通知线程有些事件已经发生,从而启动后续任务的开始

.

  • 可重入函数:简单来说就是一个可以被中断的函数
  • 不可重入函数:就是不能被中断的函数,比如在使用系统资源例如全局变量区,中断向量表时,如果被中断,可能会发生问题
  • 自动变量:局部作用域变量,定义的时候才被创建,函数返回时,系统回收空间,属于线程私有的

因此对于C选项,自动变量时线程私有的,不属于共享资源,因此错误

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

海绵宝宝养的的小窝

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值