错题一基础题:
下面有关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是一个弱引用。
A.LinkedList是继承自AbstractSequentialList(抽象类,实现了List接口)的,并且实现了List接口。所以A错误。
B.AbstractSet是实现了Set接口的,本身是一个抽象类。继承自AbstractCollection(抽象类,实现了Collection接口)。所以B错误。
C.HashSet是继承自AbstractSet,实现了Set接口。所以C正确。
D.WeakMap不存在于java集合框架的。只有一个叫做WeakHashMap(继承自AbstractMap)。
错题三:
以下代码执行的结果显示是多少()?
A. num * count = 505000
B. num * count = 0
C. 运行时错误
D. num * count = 5050
正确答案: B
问题的关键就是count=count++;的结果是什么,可以看如下代码:
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;