2.16Java专项测试复盘

xiaoemo0 2020-02-16

  • 运行代码,输出的结果是()

    public class P {
          public static int abc = 123;
              static{
              System.out.println("P is init");
              }
          }
          public class S extends P {
              static{
                  System.out.println("S is init");
              }
          }
          public class Test {
              public static void main(String[] args) {
                  System.out.println(S.abc);
          }
      }

    A. P is init
    123
    B. S is init
    P is init
    123
    C. P is init
    S is init
    123
    D. S is init
    123

    解析:子类引用父类的静态字段,只会触发子类的加载、父类的初始化,不会导致子类初始化
    答案:A

  • 后端获取数据,向前端输出过程中,以下描述正确的是
    A. 对于前端过滤过的参数,属于可信数据,可以直接输出到前端页面
    B. 对于从数据库获得的数据,属于可信数据,可以直接输出到前端页面
    C. 对于从用户上传的Excel等文件解析出的数据,属于可信数据,可以直接输出到前端页面
    D. 其它选项都不属于可信数据,输出前应该采用信息安全部发布的XSSFilter做进行相应编码

    解析:后端获取数据,向前端输出的过程中,输出前应该采用信息安全部发布的XSSFilter进行相应编码。
    答案:D

  • ArrayList和Vector主要区别是什么?
    A. Vector与ArrayList一样,也是通过数组实现的,不同的是Vector支持线程的同步
    B. Vector与ArrayList一样,也是通过数组实现的,不同的是ArrayList支持线程的同步
    C. Vector是通过链表结构存储数据,ArrayList是通过数组存储数据
    D. 上述说法都不正确

    解析:Vector支持线程的同步,也就是内部加锁的。但是效率低,因此在新版jdk中加入线程不安全的Arraylist
    答案:A

  • 关于匿名内部类叙述正确的是? ( )
    A. 匿名内部类可以继承一个基类,不可以实现一个接口
    B. 匿名内部类不可以定义构造器
    C. 匿名内部类不能用于形参
    D. 以上说法都不正确

    解析:由于构造器的名字必须与类名相同,而匿名类没有类名,所以匿名类不能有构造器。
    答案:B

  • 下列叙述中,错误的是( )
    A. File类能够存储文件属性
    B. File类能够读写文件
    C. File类能够建立文件
    D. File类能够获取文件目录信息

    解析:能够读写文件的是数据流(OutputStream和InputStream),File类能操作文件本身,但不能对文件内容进行修改。
    答案:B

  • 关于多线程和多进程,下面描述正确的是():
    A. 多进程里,子进程可获得父进程的所有堆和栈的数据;而线程会与同进程的其他线程共享数据,拥有自己的栈空间。
    B. 线程因为有自己的独立栈空间且共享数据,所有执行的开销相对较大,同时不利于资源管理和保护。
    C. 线程的通信速度更快,切换更快,因为他们在同一地址空间内。
    D. 一个线程可以属于多个进程。

    解析:
    A.子进程得到的是除了代码段是与父进程共享以外,其他所有的都是得到父进程的一个副本,子进程的所有资源都继承父进程,得到父进程资源的副本,子进程可获得父进程的所有堆和栈的数据,但二者并不共享地址空间。两个是单独的进程,继承了以后二者就没有什么关联了,子进程单独运行;进程的线程之间共享由进程获得的资源,但线程拥有属于自己的一小部分资源,就是栈空间,保存其运行状态和局部自动变量的。
    B.线程之间共享进程获得的数据资源,所以开销小,但不利于资源的管理和保护;而进程执行开销大,但是能够很好的进行资源管理和保护。
    C.线程的通信速度更快,切换更快,因为他们共享同一进程的地址空间。
    D.一个进程可以有多个线程,线程是进程的一个实体,是CPU调度的基本单位。

    答案:AC

  • 如果Child extends Parent,那么正确的有()?
    A. 如果Child是class,且只有一个有参数的构造函数,那么必然会调用Parent中相同参数的构造函数
    B. 如果Child是interface,那么Parent必然是interface
    C. 如果Child是interface,那么Child可以同时extends Parent1,Parent2等多个interface
    D. 如果Child是class,并且没有显示声明任何构造函数,那么此时仍然会调用Parent的构造函数

    解析:A 可以调用父类无参的构造函数,子类的有参构造函数和是否调用父类的有参数的构造函数无必然联系。
    答案:BCD

  • 下面哪些情况可以引发异常:
    A. 数组越界
    B. 指定URL不存在
    C. 使用throw语句抛出
    D. 使用throws语句

    解析:throws表示出现异常的一种可能性,并不一定会发生异常;throw则是抛出了异常,执行throw则一定抛出了某种异常。
    答案:ABC

  • 当我们需要所有线程都执行到某一处,才进行后面的的代码执行我们可以使用?
    A. CountDownLatch
    B. CyclicBarrier
    C. Semaphore
    D. Future

    解析:CountDownLatch 允许一个线程或多个线程等待特定情况,同步完成线程中其他任务。举例:百米赛跑,就绪运动员等待发令枪发动才能起步。
    CyclicBarrier 和CountDownLatch一样都可以协同多个线程,让指定数量的线程等待期他所有的线程都满足某些条件之后才继续执行。举例:排队上摩天轮时,每到齐四个人,就可以上同一个车厢。

    答案:A

  • What results from the following code fragment?

    int i = 5;
      int j = 10;
      System.out.println(i + ~j);

    A. Compilation error because”~”doesn’t operate on integers
    B. -5
    C. -6
    D. 15

    解析:公式-n=~n+1可推出~n=-n-1,所以~10=-11再加5结果为-6
    答案:C

  • 下面代码的输出是什么?

    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. null
    B. sub
    C. base

    解析:new Sub();在创造派生类的过程中首先创建基类对象,然后才能创建派生类。创建基类即默认调用Base()方法,在方法中调用callName()方法,由于派生类中存在此方法,则被调用的callName()方法是派生类中的方法,此时派生类还未构造,所以变量baseName的值为null
    答案:A

  • 下面关于变量及其范围的陈述哪些是不正确的()
    A. 实例变量是类的成员变量
    B. 实例变量用关键字static声明
    C. 在方法中定义的局部变量在该方法被执行时创建
    D. 局部变量在使用前必须被初始化

    解析:B.类变量(静态变量)用关键字static声明,B错误
    C.方法中的局部变量在方法被调用加载时开始入栈时创建,方法入栈创建栈帧包括局部变量表操作数栈,局部变量表存放局部变量,并非在执行该方法时被创建,C错误

    答案:BC

  • final、finally和finalize的区别中,下述说法正确的有?
    A. final用于声明属性,方法和类,分别表示属性不可变,方法不可覆盖,类不可继承。
    B. finally是异常处理语句结构的一部分,表示总是执行。
    C. finalize是Object类的一个方法,在垃圾收集器执行的时候会调用被回收对象的此方法,可以覆盖此方法提供垃圾收集时的其他资源的回收,例如关闭文件等。
    D. 引用变量被final修饰之后,不能再指向其他对象,它指向的对象的内容也是不可变的。

    解析:A,D考的一个知识点,final修饰变量,变量的引用(也就是指向的地址)不可变,但是引用的内容可以变(地址中的内容可变)。
    B,finally表示总是执行。但是其实finally也有不执行的时候,但是这个题不要扣字眼。
    1.在try中调用System.exit(0),强制退出了程序,finally块不执行。
    2.在进入try块前,出现了异常,finally块不执行。
    C,finalize方法,这个选项错就错在,这个方法一个对象只能执行一次,只能在第一次进入被回收的队列,而且对象所属于的类重写了finalize方法才会被执行。第二次进入回收队列的时候,不会再执行其finalize方法,而是直接被二次标记,在下一次GC的时候被GC。

    答案:AB

相关推荐