Java面试 高级篇

Java可变参数?

是什么?

  • 在 Java 5 中提供了变长参数,允许在调用方法时传入不定长度的参数,本质上还是基于数组的实现。

定义方式

  • 定义方法时,最后一个形参类型后加上三点“…“,就表示该形参可以接受多个参数值
public class ArrayTest {
    /**
     * 方法定义 可变参数
     * @param infos
     */
    public void show(String... infos) {
        System.out.println(Arrays.toString(infos));
    }

    /**
     * 方法定义 可变参数
     * @param id
     * @param infos
     */
    public void show(String id, String... infos) {
        System.out.println(id + ":" + Arrays.toString(infos));
    }
}

注意事项

  • 可变参数只能作为函数的最后一个参数,其前面可以有也可以没有任何其他参数
  • 由于可变参数必须是最后一个参数,所以一个函数最多只能有一个可变参数
  • Java的可变参数,会被编译器转型为一个数组,所以完全可以将变长参数看成是一个数组
  • 调用一个被重载的方法时,如果此调用既能够和固定参数的重载方法匹配,也能够与可变长参数的重载方法匹配,则只匹配固定参数的方法
  • 调用一个被重载的方法时,如果此调用既能够和两个及以上可变长参数的重载方法匹配,则编译出错


调用可变参数方法

  • 调用可变参数方法,可以是传递零到任意个参数,编译器会将可变参数转化为一个数组。所以也可以直接传递一个数组
public class ArrayTest {
    /**
     * 方法定义 可变参数
     * @param id
     * @param infos
     */
    public void show(String id, String... infos) {
        System.out.println(id + ":" + Arrays.toString(infos));
    }

    public static void main(String[] args) {
        ArrayTest arrayTest = new ArrayTest();
        arrayTest.show("9527");
        arrayTest.show("9527","唐伯虎");
        arrayTest.show("9527","唐伯虎","祝枝山");
        arrayTest.show("9527",new String[]{"唐伯虎","祝枝山","文征明"});

    }
}

----------------结果输出------------

9527:[]
9527:[唐伯虎]
9527:[唐伯虎, 祝枝山]
9527:[唐伯虎, 祝枝山, 文征明]
Process finished with exit code 0

使用场景

  • 在不确定方法需要处理的对象的数量时可以使用可变长参数,会使得方法调用更简单,无需手动创建数组 new T[]{…} 

什么是垃圾回收?

  • 垃圾回收是Java中自动内存管理的另一种叫法。
  • 垃圾回收的目的是为程序保持尽可能多的可用堆(heap),JVM会删除堆上不再需要从堆引用的对象。

什么时候运行垃圾回收?

  • 运行垃圾收集的可能情况是:
  1. 堆可用内存不足
  2. CPU空闲
  • JVM通过调用System.gc()方法来运行垃圾回收。
  • 当内存已满,且堆上没有对象可用于垃圾回收时,JVM可能会抛出OutOfMemoryException。
  • 对象在被垃圾回收从堆上删除之前,会运行finalize()方法。

什么是初始化数据块?

  • 初始化数据块——当创建对象或加载类时运行的代码,有如下两种类型的初始化数据块:
  • 静态初始化:加载类时运行的的代码,只在类加载时运行一次
  • 实例初始化:创建新对象时运行的代码,每次创建都会运行

静态初始化

  • 如下所示 static{ }之间的代码被称为静态初始化。只有在第一次加载类时运行。
  • 只有静态变量才可以在静态初始化中进行访问并使用。
  • 无论创建了多少个实例,静态初始化只在第一次加载时运行一次。
public class ArrayTest {
    private static int count;
    /**只在第一次加载本类时运行static中的代码
     * */
    static {
        count = 100;
        System.out.println("init data"+count);
    }
    public static void main(String[] args) {
        ArrayTest arrayTest1 = new ArrayTest();
        ArrayTest arrayTest2 = new ArrayTest();
        ArrayTest arrayTest3 = new ArrayTest();
    }
}

---------------结果输出---------------------

init data:100
Process finished with exit code 0

实例初始化

  • 每次在创建类实例的时候运行

public class ArrayTest {
    private static int count = 100;

    {
        /**此花括号中的代码,在每次创建本类实例时都会运行
         * */
        System.out.println(count++);
    }

    public static void main(String[] args) {
        ArrayTest arrayTest1 = new ArrayTest();
        ArrayTest arrayTest2 = new ArrayTest();
        ArrayTest arrayTest3 = new ArrayTest();
    }
}

---------------结果输出--------------

100
101
102
Process finished with exit code 0



猜你喜欢

转载自blog.csdn.net/wangmx1993328/article/details/80706645