Java初始化和回收相关知识是企业在面试开发者时经常考察的一个问题。这里有8种常见问题类型。1、Java中如何区分重载方法?它以重载方法的参数类型和顺序来区分。注意:如果参数类型和顺序相同,不管参数名是否相同,编译器都会报错,说明该方法已经定义。并且不能根据返回值类型来区分。如果按照返回值来区分,有时程序中调用方法时不需要返回值,那么程序就无法确定调用哪个重载方法。2.阅读下面的程序并解释错误。publicstaticvoidtestLong(longi){System.out.println("testlong");}publicstaticvoidtestFloat(floati){System.out.println("testfloat");}publicstaticvoidmain(String[]args){testLong(50);testFloat(1.5);}testLong没有问题,因为传入的参数50是int类型,而receiver参数是long类型,小范围可以自动转换为大范围的数据类型;testFloat不会通过编译,因为传入的参数1.5是Double类型,而接收参数是float类型,大规模转换为小规模数据类型需要显式转换,即改成testFloat(1.5f)。3.阅读下面的程序并解释错误。publicstaticclassA{A(inti){System.out.println("A(inti)");}}publicstaticvoidmain(String[]args){Aa=newA();}定义自定义构造函数后,要使用如果默认构造函数使用时,需要显式指定默认构造函数,否则Aa=newA();无法编译。4.阅读以下程序并解释错误A(inti,intj){A();A(i);System.out.println("A(inti,intj)");}}在构造函数中调用其他构造函数时,需要使用this关键字调用,例如this();一个构造函数中只能调用一个其他构造函数,调用其他构造函数的语句需要放在调用者(即发出调用行为的构造函数)语句块的第一行。5.阅读下面的程序,写出执行结果。publicstaticclassA{privateinti;privateStringj;intgetI(){returni;}StringgetJ(){returnj;}A(inti){i=i;}A(Stringj){this.j=j;}}publicstaticvoidmain(String[]args){System.out.println(newA(5).getI());System.out.println(newA("hello").getJ());}执行结果为:0hellofori=i;对于这个语句,它并没有改变实例变量i的值,而i的默认值是0,所以结果也是0。如果需要改变实例变量i的值,就需要改变它到这个。我=我;6.在一个类中,声明了几个静态方法和非静态方法。请告诉我声明的静态方法是否可以访问声明的非静态方法,为什么?静态方法不能访问非静态方法,因为静态方法是属于类本身的方法,在编译时就已经确定了;非静态方法是属于该类的对象的方法,需要在实例化后访问。如果在静态方法中访问非静态方法,是不会通过编译的。7、为什么static关键字不能修饰局部变量?static关键字修饰的变量或方法属于类,在编译时确定;而普通的变量或方法属于类生成的对象,需要在实例化后确定。因此,如果static关键字修饰方法的局部变量,一方面方法需要在实例化后确定,另一方面static修饰的变量需要在编译时确定,这样会导致到矛盾。8.finalize()的作用是什么?这个函数应该在什么时候被调用?在需要释放内存的地方调用finalize(),被占用的内存会在下一轮垃圾回收中回收。一般情况下,无需显式调用此函数。垃圾回收器只能回收new关键字创建的对象占用的内存,那么如何回收一些不是这种方式的对象(比如调用C++native方法)占用的内存呢?然后你需要使用finalize()。由于在C++中需要使用free()函数来释放内存,所以Java程序在调用C++时需要调用finalize()方法来释放内存。9.列出并简要解释几种常见的垃圾收集技术。引用计数:每个对象都包含一个引用计数器。每被引用一次,计数器加1,将引用者设置为null或销毁,计数器减1。垃圾收集器进行轮询,一旦发现计数器的值小于1、对象占用的内存被回收。停止复制:当垃圾回收机制运行时,程序需要停止运行,将每个活动对象从一个堆转移到另一个堆,剩下的垃圾将被回收。标记和清除:从栈和静态存储区开始,发现存活对象就标记,所有标记过程完成后收集垃圾。
