Java面试题04(每次10道)

113 阅读3分钟

31、阻塞队列了解吗?怎么使用

阻塞队列,当队列为空时,取元素会被阻塞,当队列满时,放入元素会被阻塞。

32、关于Java的内部类的解释?匿名内部类是什么?如何访问在其外面定义的变量?

一个类当中包含了另一个类,那么这个类就叫做内部类。

匿名内部类:它的本质是一个 带具体实现的 父类或者父接口的 匿名的 子类对象,如果接口的实现类(或者是父类的子类)只需要使用唯一的一次,那么这种情况下就可以省略掉该类的定义,而改为使用【匿名内部类】

public class InnerClass {
    private void test(final int i){
        new Server(){
            public void method(){
                System.out.println("匿名内部类...");
            }
        }.method();
    }
}

interface Server{
    void method();
}

如何访问在外面定义的变量,需要给变量添加final属性才可以。

public class InnerClass {
    public static final String name = "aaa";

    public static void main(String[] args) {
        test(name);
    }

    private static void test(final String i){
        new Server(){
            public void method(){
                System.out.println("匿名内部类..." + name);
            }
        }.method();
    }
}

interface Server{
    void method();
}

33、java8的新特性有哪些

lambda表达式、接口有了一个默认方法、Stream API和Date Time 的API等等。

34、error和exception有什么区别?

java.lang.Error和java.lang.Exception。

这里写图片描述

Error一般是系统级别的错误,比如内存泄漏、系统崩溃等问题,这种问题程序本身没办法修复和预防。

Exception表示程序可以处理的异常,可以捕获到而且可以恢复回去。遇到这类问题可以通过抛异常和处理的方式将问题解决。

35、Java异常处理机制

抛出异常和解决异常。

抛出异常:当一个方法出现错误引发异常时,方法创建异常对象并交付运行时系统,异常对象中包含了异常类型和异常出现时的程序状态等异常信息。运行时系统负责寻找处置异常的代码并执行。

捕捉异常:在方法抛出异常之后,运行时系统将转为寻找合适的异常处理器(exception handler)。潜在的异常处理器是异常发生时依次存留在调用栈中的方法的集合。当异常处理器所能处理的异常类型与方法抛出的异常类型相符时,即为合适的异常处理器。运行时系统从发生异常的方法开始,依次回查调用栈中的方法,直至找到含有合适异常处理器的方法并执行。当运行时系统遍历调用栈而未找到合适的异常处理器,则运行时系统终止。同时,意味着Java程序的终止。

36、类和实例初始化顺序

img

img

public class Son extends Parent{
    public static void main(String[] args) {
        new Son();
    }

    static{
        System.out.println("子类第一个静态代码块");
    }

    public static String sonName = "子类静态变量";
    public String sonName2 = "子类成员变量";

    {
        System.out.println("子类初始化块");
    }

    static{
        System.out.println("子类第二个静态代码块");
    }

    public Son() {
        System.out.println("子类无参构造");
    }
}

class Parent{
    static{
        System.out.println("父类第一个静态代码块");
    }

    public static String parentName = "父类静态变量";
    public String parentName2 = "父类成员变量";

    {
        System.out.println("父类初始化块");
    }

    static{
        System.out.println("父类第二个静态代码块");
    }

    public Parent(){
        System.out.println("父类无参构造");
    }
}

----------------------------------------------------------
父类第一个静态代码块
父类第二个静态代码块
子类第一个静态代码块
子类第二个静态代码块
父类初始化块
父类无参构造
子类初始化块
子类无参构造

37、方法的参数传递机制

当参数是基本数据类型传递的是值,当参数是引用数据类型的时候传递的是内存地址。String和其余包装类的值也是传递的值。