美文网首页
Java 面试系列:常见面试题翻车合集

Java 面试系列:常见面试题翻车合集

作者: you的日常 | 来源:发表于2020-12-14 18:05 被阅读0次

    1.去掉 main 方法的 static 修饰符,程序会怎样?
    A:程序无法编译

    B:程序正常编译,正常运行

    C:程序正常编译,正常运行一下马上退出

    D:程序正常编译,运行时报错

    答:D

    题目解析:运行时异常如下:

    错误: main 方法不是类 xxx 中的 static, 请将 main 方法定义为:

    public static void main(String[] args)

    2.以下程序运行的结果是?
    public class TestClass {
    public static void main(String[] args) {
    System.out.println(getLength());
    }
    int getLength() {
    private String s = "xyz";
    int result = s.length();
    return result;
    }
    }
    复制
    A:3

    B:2

    C:4

    D:程序无法编译

    答:D

    题目解析:局部变量 s 不能使用任何修饰符(private/protected/public)修饰,调用的方法要加上 static,否则编译会报错。

    3.以下程序有几处错误?
    abstract class myAbstractClass
    private abstract String method(){};
    }
    复制
    A:1

    B:2

    C:3

    D:4

    答:C

    题目解析:类少一个“{”类开始标签、抽象方法不能包含方法体、抽象方法访问修饰符不能为 private,因此总共有 3 处错误。

    4.以下程序执行的结果是?
    class A {
    public static int x;
    static {
    x = B.y + 1;
    }
    }
    public class B {
    public static int y = A.x + 1;
    public static void main(String[] args) {
    System.out.println(String.format("x=%d,y=%d", A.x, B.y));
    }
    }
    复制
    A:程序无法编译

    B:程序正常编译,运行报错

    C:x=1,y=2

    D:x=0,y=1

    答:C

    5.switch 语法可以配合 return 一起使用吗?return 和 break 在 switch 使用上有何不同?
    答:switch 可以配合 return 一起使用。return 和 break 的区别在于 switch 结束之后的代码,比如以下代码:

    String getColor(String color) {
    switch (color) {
    case "red":
    return "红";
    case "blue":
    return "蓝";
    }
    return "未知";
    }

    String getColor(String color) {
    String result = "未知";
    switch (color) {
    case "red":
    result = "红";
    break;
    case "blue":
    result = "蓝";
    }
    return result;
    }
    复制
    对于以上这种 switch 之后没有特殊业务处理的程序来说,return 和 break 的效果是等效的。然而,对于以下这种代码:

    String getColor(String color) {
    switch (color) {
    case "red":
    return "红";
    case "blue":
    return "蓝";
    }
    return "未知";
    }

    String getColor(String color) {
    String result = "未知";
    switch (color) {
    case "red":
    result = "红";
    break;
    case "blue":
    result = "蓝";
    }
    if (result.equals("未知")) {
    result = "透明";
    } else {
    result += "色";
    }
    return result;
    }
    复制
    如果 switch 之后还有特殊的业务处理,那么 return 和 break 就有很大的区别了。

    6.一个栈的入栈顺序是 A、B、C、D、E 则出栈不可能的顺序是?
    A:E D C B A

    B:D E C B A

    C:D C E A B

    D:A B C D E

    答:C

    题目解析:栈是后进先出的,因此:

    A 选项:入栈顺序 A B C D E 出栈顺序就是 E D C B A 是正确的;
    B 选项:A B C D 先入栈,D 先出栈,这个时候 E 在入栈,E 在出栈,顺序 D E C B A 也是正确的;
    C 选项:D 先出栈,说明 A B C 一定已入栈,因为题目说了入栈的顺序是 A B C D E,所以出栈的顺序一定是 C B A,而 D C E A B 的顺序 A 在 B 前面是永远不可能发生的,所以选择是 C;
    D 选项 A B C D E 依次先入栈、出栈,顺序就是 A B C D E。
    7.可以在 finally 块中使用 return吗?
    答:不可以,finally 块中的 return 返回后方法结束执行,不会再执行 try 块中的 return 语句。

    8.FileInputStream 可以实现什么功能?
    A:文件夹目录获取

    B:文件写入

    C:文件读取

    D:文件夹目录写入

    答:C

    题目解析:FileInputStream 是文件读取,FileOutputStream 才是用来写入文件的,FileInputStream 和 FileOutputStream 很容易搞混。

    9.以下程序打印的结果是什么?
    Thread t1 = new Thread(){
    @Override
    public void run() {
    System.out.println("I'm T1.");
    }
    };
    t1.setPriority(3);
    t1.start();
    Thread t2 = new Thread(){
    @Override
    public void run() {
    System.out.println("I'm T2.");
    }
    };
    t2.setPriority(0);
    t2.start();
    复制
    答:程序报错 java.lang.IllegalArgumentException,setPriority(n) 方法用于设置程序的优先级,优先级的取值为 1-10,当设置为 0 时,程序会报错。

    10.如何设置守护线程?
    答:设置 Thead 类的 setDaemon(true) 方法设置当前的线程为守护线程。

    守护线程的使用示例如下:

    Thread daemonThread = new Thread(){
    @Override
    public void run() {
    super.run();
    }
    };
    // 设置为守护线程
    daemonThread.setDaemon(true);
    daemonThread.start();
    复制
    11.以下说法中关于线程通信的说法错误的是?
    A:可以调用 wait()、notify()、notifyAll() 三个方法实现线程通信

    B:wait() 必须在 synchronized 方法或者代码块中使用

    C:wait() 有多个重载的方法,可以指定等待的时间

    D:wait()、notify()、notifyAll() 是 Object 类提供的方法,子类可以重写

    答:D

    题目解析:wait()、notify()、notifyAll() 都是被 final 修饰的方法,不能再子类中重写。选项 B,使用 wait() 方法时,必须先持有当前对象的锁,否则会抛出异常 java.lang.IllegalMonitorStateException。

    12.ReentrantLock 默认创建的是公平锁还是非公平锁?
    答:默认创建的是非公平锁,看以下源码可以得知:

    /**

    • Creates an instance of {@code ReentrantLock}.
    • This is equivalent to using {@code ReentrantLock(false)}.
      */
      public ReentrantLock() {
      sync = new NonfairSync();
      }
      复制
      Nonfair 为非公平的意思,ReentrantLock() 等同于代码 ReentrantLock(false)。

    13.ReentrantLock 如何在一段时间内无阻塞尝试访问锁?
    答:使用 tryLock(long timeout, TimeUnit unit) 方法,就可以在一段时间内无堵塞的访问锁。

    14.枚举比较使用 equals 还是 ==?
    答:枚举比较调用 equals 和 == 的结果是一样,查看 Enum 的源码可知 equals 其实是直接调用了 ==,源码如下:

    public final boolean equals(Object other) {
    return this==other;
    }
    复制
    15.在 Spring 中使用 @Value 赋值静态变量为什么 null?怎么解决?
    答:因为在 Springframework 框架中,当类加载器加载静态变量时,Spring 上下文尚未加载,因此类加载器不会在 bean 中正确注入静态类,导致了结果为 null。可使用 Setter() 方法给静态变量赋值,代码如下:

    相关文章

      网友评论

          本文标题:Java 面试系列:常见面试题翻车合集

          本文链接:https://www.haomeiwen.com/subject/gdvebktx.html