秋招遇到的笔试题解析

2个月前 (10-14) wang JAVA, 技术杂谈 0评论 已收录 134℃ 浏览数:99

之前笔试中遇到了一些没有遇到过的选择题,特此总结。

1、


public class Demo {

    public static void main(String[] args) {
        new Demo();
    }

    public Demo(){
        Demo demo1 = this;
        Demo demo2 = this;

        synchronized (demo1){
            try {
                demo2.wait();
                System.out.println("Warning");
            } catch (InterruptedException e) {
                System.out.println("Interrupted");
            } catch (Exception e){
                System.out.println("Other Exception");
            } finally {
                System.out.println("Finally");
            }
            System.out.println("OK");
        }
    }
}

请问这道题输出什么?Finally?Warning?Interrupted?还是OK?

这道题的考点就是两个对象demo1和demo2,锁住demo1,调用demo2的wait方法,是否能成功。我们知道如果需要调用wait方法,那么你需要拿到demo2的锁,但是我们锁的是demo1。我们往上看,demo1和demo2都指向了同一个对象this。那么是否会报错呢?而且不管是否报错,我们的finally方法都应该会执行吧?

我们运行了程序,结果发现没有任何输出。原因是demo1和demo2指向的同一个对象,锁住的demo1,其实锁住的是this,demo2也是指向的this,那么就可以调用wait方法,也就是this.wait,程序阻塞,也就没有输出了。

2、

public class Demo {
    
    public static void main(String[] args) {
        Map<String, Object> map = new HashMap<>(1);
        map.put("hello", "world");
        set(map);
        System.out.println(map);
    }

    public static void set(Map<String, Object> map){
        map = null;
    }
}

请问这道题输出什么?null?hello world?报错,NullpointException?

这里输出的还是hello world,然后set方法里的map是对map对象的一个引用。引用=null并不会影响对象的值,也不会影响到main方法里的引用。

3、

public class Demo {

    public void method(int i){
        System.out.println("int");
    }

    public void method(Integer i){
        System.out.println("Integer");
    }

    public void method(long i){
        System.out.println("long");
    }

    public void method(Long i){
        System.out.println("Long");
    }

    public void method(char i){
        System.out.println("char");
    }

    public void method(Character i){
        System.out.println("Character");
    }

    public static void main(String[] args) {
        new Demo().method(1);
    }
}

这道题就考了一个参数的匹配,1默认是int型的。

4、

public class Demo {
    public static void main(String[] args) throws IOException {

        RandomAccessFile file = new RandomAccessFile("text.txt", "rw");
        file.writeChar(12);
        file.writeInt(96);
        file.writeInt(12);
        file.writeInt(70);
        file.writeLong(10L);
        file.writeDouble(2.1);
        file.seek(6);
        System.out.println(file.readInt());
        file.close();
    }
}

输出12,不知道为什么。

5、

public class Demo {
    public static void main(String[] args) throws IOException {
        S2 s2 = new S2();
        s2.display();
    }
}

class S1{
    protected String s = "S1";

    protected void display(){
        System.out.println(s);
    }
}

class S2 extends S1{
    protected String s = "S2";
}
输出s1

6、
class Base{}
class SubClass1 extends Base {}
class SubClass2 extends Base {}

public class Demo {
    public static void main(String[] args) throws IOException {
        Base b = new Base();
        SubClass1 s1 = new SubClass1();
        s1 = (SubClass1) null;
        SubClass1 s2 = new SubClass1();
        s1 = (SubClass1)s2;
    }
}
请问s1 = (SubClass1) null和s1 = (SubClass1)s2哪句编译非法?还是运行没有报错?
运行结果是没有编译错误。

7、
public class Demo {
    public static void main(String[] args) {
        System.out.println("Before try");
        try{
            int i = 1;
        }catch (IOException e){
            System.out.println("catch the Exception");
        }
        System.out.println("at the end");
    }
}
编译成功还是失败?
编译失败 Exception 'java.io.IOException' is never thrown in the corresponding try block
博主

Just do it. Now or never.

相关推荐

嗨、骚年、快来消灭0回复。