错题一基础题:

下面有关Java的说法正确的是( )

A. 一个类可以实现多个接口
B. 抽象类必须有抽象方法
C. protected成员在子类可见性可以修改
D. 通过super可以调用父类构造函数
E. final的成员方法实现中只能读取类的成员变量
F. String是不可修改的,且java运行环境中对string对象有一个常量池保存

正确答案:A C D F

A对:java类单继承,多实现
B错:被abstract修饰的类就是抽象类,有没有抽象方法无所谓
C错:描述有问题。protected成员在子类的可见性,
  子类(不继承父类protected成员方法)获取父类被protected修饰的成员属性或方法,可见性是不可能变的,因为修饰符protected就是描述可见性的。
  子类继承父类,并重写父类的protected成员方法,该方法的可见性可以修改,这是对的,因为子类继承父类的方法,访问权限可以相同或往大了改

对父类的protected方法,子类重写该方法时可见性只能相同(protected)或放大(public),而不能减小可见性(设为private)。因为将子类对象赋给一个父类变量时,由于多态机制,该变量调用方法时会调用子类的版本,此时必须保证能够正常调用。否则就不符合里氏替换的基本原则,即确保父类对象可以用子类对象来替换。

public class Student extends Person{
    @Override
    public void run() {
    }
    @Override
    protected void talk() {
    }
}

class Person {
    int name;
    protected void run() {
    }
    protected void talk() {
    }
}

例如:对于方法而言。当子类重写父类方法时,可以将修饰符修改为public,
然后在子类重写方法中调用父类protected的方法,例如:

//重写
public void test(){
    super.test();
}

D对。
E错: final修饰的方法只是不能重写,static修饰的方法只能访问静态成员方法和属性。
F对。

错题二:

下列关于容器集合类的说法正确的是?

A. LinkedList继承自List
B. AbstractSet继承自Set
C. HashSet继承自AbstractSet
D. WeakMap继承自HashMap

正确答案: C

a选项linkedlist类是实现了List接口,而不是继承

b选项AbstractSet类实现Set接口

c选项HashSet继承 AbstractSet类,同时也实现set

d选项WeakMap是js里面的。WeakHashMap是map中的key是一个弱引用。

Foo java改错题 java改错题库_开发语言


A.LinkedList是继承自AbstractSequentialList(抽象类,实现了List接口)的,并且实现了List接口。所以A错误。

B.AbstractSet是实现了Set接口的,本身是一个抽象类。继承自AbstractCollection(抽象类,实现了Collection接口)。所以B错误。

C.HashSet是继承自AbstractSet,实现了Set接口。所以C正确。

D.WeakMap不存在于java集合框架的。只有一个叫做WeakHashMap(继承自AbstractMap)。

错题三:

以下代码执行的结果显示是多少()?

Foo java改错题 java改错题库_后端_02

A. num * count = 505000
B. num * count = 0
C. 运行时错误
D. num * count = 5050

正确答案: B

问题的关键就是count=count++;的结果是什么,可以看如下代码:

Foo java改错题 java改错题库_后端_03

Foo java改错题 java改错题库_java_04

count=count++就是先把局部变量表中count的值0放入操作数栈中,然后直接对局部变量表中的count加1,然后再把操作数栈中的0出栈赋值给局部变量表中的count,最终局部变量表中的count值仍为0

原理是 temp = count; count = count+1 ; count = temp; 因此count始终是0 这仅限于java 与c是不一样的

错题四:

下面有关java实例变量,局部变量,类变量和final变量的说法,错误的是?

A. 实例变量指的是类中定义的变量,即成员变量,如果没有初始化,会有默认值。
B. 局部变量指的是在方法中定义的变量,如果没有初始化,会有默认值
C. 类变量指的是用static修饰的属性
D. final变量指的是用final 修饰的变量

正确答案: B
定义在类中的变量是类的成员变量,可以不进行初始化,Java会自动进行初始化,如果是引用类型默认初始化为null,如果是基本类型例如int则会默认初始化为0

局部变量是指类方法中的变量,必须初始化。局部变量运行时被分配在栈中,量大,生命周期短,如果虚拟机给每个局部变量都初始化一下,是一笔很大的开销,但变量不初始化为默认值就使用是不安全的。出于速度和安全性两个方面的综合考虑,解决方案就是虚拟机不初始化,但要求编写者一定要在使用前给变量赋值。

被static关键字修饰的变量是静态的,静态变量随着类的加载而加载,所以也被称为类变量

被final修饰发变量是常量

错题五:

以下是java concurrent包下的4个类,选出差别最大的一个

A、Semaphore
B、ReentrantLock
C、Future
D、CountDownLatch

正确答案: C

A B D是并发编程的锁机制相关,Future是一个线程任务的返回结果的‘欠条’

A、Semaphore:类,控制某个资源可被同时访问的个数;
B、ReentrantLock:类,具有与使用synchronized方法和语句所访问的隐式监视器锁相同的一些基本行为和语义,但功能更强大;
C、 Future:接口,表示异步计算的结果;
D、 CountDownLatch: 类,可以用来在一个线程中等待多个线程完成任务的类。

错题六:

下面有关java final的基本规则,描述错误的是?

A. final修饰的类不能被继承
B. final修饰的成员变量只允许赋值一次,且只能在类方法赋值
C. final修饰的局部变量即为常量,只能赋值一次。
D. final修饰的方法不允许被子类覆盖

正确答案: B

final修饰的成员变量为基本数据类型是,在赋值之后无法改变。
final修饰的成员变量为引用数据类型时,在赋值后其指向地址无法改变,但是对象内容还是可以改变的。

final修饰的成员变量在赋值时可以有三种方式。

1、在声明时直接赋值。
2、在构造器中赋值。
3、在初始代码块中进行赋值。

final所修饰的成员变量只能赋值一次,可以在类方法中赋值,也可以在声明的时候直接赋值,
而final修饰的局部变量可以在声明的时候初始化,也可以在第一次使用的通过方法或者表达式给它赋值。

final修饰的方法,不允许被子类覆盖。
final修饰的类,不能被继承。
final修饰的变量,不能改变值。
final修饰的引用类型,不能再指向别的东西,但是可以改变其中的内容。

错题七:

下面的方法,当输入为2的时候返回值是多少?

public static int getValue(int i) {
    int result = 0;
    switch (i) {
        case 1:
            result = result + i;
        case 2:
            result = result + i * 2;
        case 3:
            result = result + i * 3;
        }
    return result;
}

A.0
B. 2
C. 4
D.10

正确答案: D
没有break,发生case穿透现象,程序会继续向下执行,直到遇到break或者结束switch语句的大括号为止。

当i=2时,执行程序
Case2:result=4;
Case3:result=4+6=10;