提示:好多小伙伴反映,直接看到答案不太好,那我把答案的颜色设置为透明,答案位置还是在题目后面,需要鼠标选中才能看见(操作如下图),同时为了手机端的小伙伴(手机端也可以长按选中查看),我还会把所有答案放到文章最下面,希望给每天进步一点点的小伙伴更好的体验。
每天进步一点点!
1、protected访问权限要小于包访问权限。( )
正确答案: B 你的答案: B (正确)
正确
错误
题解:
Java类成员的访问控制权限:
public > protected > 同包(default) > private
2、以下程序运行的结果为 ( )
public class Example extends Thread{
@Override
public void run(){
try {
Thread.sleep(1000);
} catch (InterruptedException e){
e.printStackTrace();
}
System. out .print( "run" );
}
public static void main(String[] args){
Example example= new Example();
example.run();
System. out .print( "main" );
}
}
正确答案: A 你的答案: A (正确)
run main
main run
main
run
不能确定
题解:
考察的run()方法作为普通方法的调用和通过线程start的启动调用的区别。对象.start()属于对线程的启动调用run()方法。
题目给出的example.run();是对象对普通方法的调用,所以由上到下依次执行输出:run main。
3、list是一个ArrayList的对象,哪个选项的代码填到//todo delete处,可以在Iterator遍历的过程中正确并安全的删除一个list中保存的对象?()
Iterator it = list.iterator();
int index = 0;
while (it.hasNext())
{
Object obj = it.next();
if (needDelete(obj)) //needDelete返回boolean,决定是否要删除
{
//todo delete
}
index ++;
}
正确答案: A 你的答案: A (正确)
it.remove();
list.remove(obj);
list.remove(index);
list.remove(obj,index);
题解:
Iterator 支持从源集合中安全地删除对象,只需在 Iterator 上调用 remove() 即可。这样做的好处是可以避免 ConcurrentModifiedException ,当打开 Iterator 迭代集合时,同时又在对集合进行修改。有些集合不允许在迭代时删除或添加元素,但是调用 Iterator 的remove() 方法是个安全的做法。
4、JDK1.8版本之前,抽象类和接口的区别,以下说法错误的是
正确答案: D 你的答案: D (正确)
A:接口是公开的,里面不能有私有的方法或变量,是用于让别人使用的,而抽象类是可以有私有方法或私有变量的。
B:abstract class 在 Java 语言中表示的是一种继承关系,一个类只能使用一次继承关系。但是,一个类却可以实现多个interface,实现多重继承。接口还有标识(里面没有任何方法,如Remote接口)和数据共享(里面的变量全是常量)的作用。
C:在abstract class 中可以有自己的数据成员,也可以有非abstarct的成员方法,而在interface中,只能够有静态的不能被修改的数据成员(也就是必须是 static final的,不过在 interface中一般不定义数据成员),所有的成员方法默认都是 public abstract 类型的。
D:abstract class和interface所反映出的设计理念不同。其实abstract class表示的是"has-a"关系,interface表示的是"is-a"关系。
题解:
is-a:继承关系 has-a:从属关系 like-a:组合关系
abstract class表示的是"is-a"关系,interface表示的是"like-a"关系。
5、下面代码的输出是什么?
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();
}
}
正确答案: A 你的答案: A (正确)
null
sub
base
题解:
本题考查知识点是多态(上转型)以及类的先后加载顺序
上转型 类似 Father father = new Son();
1:父类中的静态代码块
2:子类中的静态代码块
3:父类中构造方法
4:子类当中的构造方法
下面我来简单分析一下加载顺序
当执行到 Base b =newSub()时
所以本题的加载顺序是:加载父类Base类中的构造方法Base()进而调用callName()(因为子类把父类的这个方法给覆盖了,所以此方法执行的是子类中的)
因为子类中的baseName变量还没进行初始化,故为null
6、Java1.8版本之前的前提,Java特性中,abstract class和interface有什么区别()
正确答案: A B D 你的答案: A B D (正确)
抽象类可以有构造方法,接口中不能有构造方法
抽象类中可以有普通成员变量,接口中没有普通成员变量
抽象类中不可以包含静态方法,接口中可以包含静态方法
一个类可以实现多个接口,但只能继承一个抽象类。
题解:
在JDK1.8之前的版本(不包括JDK1.8),接口中不能有静态方法,抽象类中因为有普通方法,故也可以有静态方法。
在JDK1.8后(包括JDK1.8),在抽象类中依旧可以有静态方法,同时在接口中也可以定义静态方法了。
7、哪个正确
正确答案: A C D 你的答案: A C D (正确)
abstract类只能用来派生子类,不能用来创建abstract类的对象。
final类不但可以用来派生子类,也可以用来创建final类的对象。
abstract不能与final同时修饰一个类。
abstract类定义中可以没有abstract方法。
题解:
A,抽象类和接口都不可以实例化。
B,final类不能被继承。
C,abstract不能和final共用修饰类。
D,抽象类中可以没有抽象方法,有抽象方法的类一定是抽象类。
注意:abstract是用来修饰类和方法的:
1. 修饰方法:abstract不能和private、final、static共用。
2. 修饰外部类:abstract不能和final、static共用。(外部类的访问修饰符只能是默认和public)
3. 修饰内部类:abstract不能和final共用。(内部类四种访问修饰符都可以修饰)
8、有关线程的叙述正确的是()
正确答案: C D 你的答案: C D (正确)
可以获得对任何对象的互斥锁定
通过继承Thread类或实现Runnable接口,可以获得对类中方法的互斥锁定
线程通过使用synchronized关键字可获得对象的互斥锁定
线程调度算法是平台独立的
题解:
A,“任何对象”锁定,太绝对了,你能锁住你没有权限访问的对象吗?
B,前半句话讲的是创建线程的方式,后半句讲的是锁定,驴头不对马嘴。
C,正确。
D,线程调度分为协同式调度和抢占式调度,Java使用的是抢占式调度,也就是每个线程将由操作系统来分配执行时间,线程的切换不由线程本身来决定(协同式调度)。
以上,选CD
9、JDK提供的用于并发编程的同步器有哪些?
正确答案: A B C 你的答案: A B C (正确)
Semaphore
CyclicBarrier
CountDownLatch
Counter
题解:
A:Java 并发库 的Semaphore 可以很轻松完成信号量控制,Semaphore可以控制某个资源可被同时访问的个数,通过 acquire() 获取一个许可,如果没有就等待,而 release() 释放一个许可。
B:CyclicBarrier 主要的方法就是一个:await()。await() 方法没被调用一次,计数便会减少1,并阻塞住当前线程。当计数减至0时,阻塞解除,所有在此 CyclicBarrier 上面阻塞的线程开始运行。
C:直译过来就是倒计数(CountDown)门闩(Latch)。倒计数不用说,门闩的意思顾名思义就是阻止前进。在这里就是指 CountDownLatch.await() 方法在倒计数为0之前会阻塞当前线程。
D:Counter不是并发编程的同步器
10、以下哪种方式实现的单例是线程安全的
正确答案: A B C D 你的答案: A B C D (正确)
枚举
静态内部类
双检锁模式
饿汉式
题解:
1.饿汉式(线程安全,调用效率高,但是不能延时加载);
2.懒汉式(线程安全,调用效率不高,但是能延时加载); 3.Double CheckLock实现单例:DCL也就是双重锁判断机制(由于JVM底层模型原因,偶尔会出问题,不建议使用);
4.静态内部类实现模式(线程安全,调用效率高,可以延时加载);
5.枚举类(线程安全,调用效率高,不能延时加载,可以天然的防止反射和反序列化调用)。
答案汇总:
1、正确答案: B
2、正确答案: A
3、正确答案: A
4、正确答案: D
5、正确答案: A
6、正确答案: A B D
7、正确答案: A C D
8、正确答案: C D
9、正确答案: A B C
10、正确答案: A B C D
以上部分题解来自牛客评论区,感谢评论区大佬的解释。
每天进步一点点!
不进则退!
版权声明:
原创博主:牛哄哄的柯南
博主原文链接:https://keafmd.blog.csdn.net/
看完如果对你有帮助,感谢点赞、关注、收藏支持!
[哈哈][抱拳]
加油!
共同努力!
Keafmd