当前位置 博文首页 > 『愚』的博客:日常Java练习题(每天进步一点点系列)

    『愚』的博客:日常Java练习题(每天进步一点点系列)

    作者:[db:作者] 时间:2021-07-25 16:05

    提示:好多小伙伴反映,直接看到答案不太好,那我把答案的颜色设置为透明,答案位置还是在题目后面,需要鼠标选中才能看见(操作如下图),同时为了手机端的小伙伴(手机端也可以长按选中查看),我还会把所有答案放到文章最下面,希望给每天进步一点点的小伙伴更好的体验。
    在这里插入图片描述

    每天进步一点点!

    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

    cs