日常Java练习题(每天进步一点点系列)

简介: 日常Java练习题(每天进步一点点系列)

1、protected访问权限要小于包访问权限。( )

正确答案: B 你的答案: B (正确)

正确

错误


题解:

Java类成员的访问控制权限:

public > protected > 同包(default) > private

1.png


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


以上部分题解来自牛客评论区,感谢评论区大佬的解释。

相关文章
|
4月前
|
存储 Java
创建一个乘法练习题生成器 using Java
创建一个乘法练习题生成器 using Java
|
5月前
|
人工智能 Java
Java练习题-输出二维数组对角线元素和
Java练习题-输出二维数组对角线元素和
|
5月前
|
存储 Java 索引
Java练习题-获取数组元素最大值
Java练习题-获取数组元素最大值
Java练习题-获取数组元素最大值
|
5月前
|
Java
<Java SE> 数组详解大全(附带练习题).一维数组、二维数组、数组拷贝、数组遍历...
<Java SE> 数组详解大全(附带练习题).一维数组、二维数组、数组拷贝、数组遍历
33 0
|
5月前
|
Java 索引
Java练习题-用冒泡排序法实现数组排序
Java练习题-用冒泡排序法实现数组排序
|
5月前
|
Java
Java练习题-键盘录入字符串实现大小写转换
Java练习题-键盘录入字符串实现大小写转换
|
5月前
|
Java
Java练习题-输出斐波那契(Fibonacci)数列
Java练习题-输出斐波那契(Fibonacci)数列
|
5月前
|
存储 Java
Java程序设计练习题8异常处理
Java程序设计练习题8异常处理
139 0
|
5月前
|
算法 Java 程序员
Java数组全套深入探究——进阶知识阶段4、一维数组练习题
Java数组全套深入探究——进阶知识阶段4、一维数组练习题
51 0
Java数组全套深入探究——进阶知识阶段4、一维数组练习题
|
5月前
|
Java
java字符串练习题8、同构字符串
java字符串练习题8、同构字符串
47 0
java字符串练习题8、同构字符串
下一篇
无影云桌面