- 相關(guān)推薦
9個(gè)Java初始化和回收的面試題
1.Java中是如何區(qū)分重載方法的?
通過重載方法的參數(shù)類型和順序來進(jìn)行區(qū)分的。
注意:若參數(shù)類型和順序均相同時(shí),不管參數(shù)名是否相同,編譯器均會(huì)報(bào)錯(cuò),提示方法已經(jīng)被定義。且不能根據(jù)返回值類型來區(qū)分,如果根據(jù)返回值來區(qū)分的話,有時(shí)程序里調(diào)用方法時(shí)并不需要返回值,那么程序都無法確定該調(diào)用那個(gè)重載方法。
2.閱讀以下程序,解釋其中的錯(cuò)誤。
public static void testLong(long i) {
System.out.println("test long");
}
public static void testFloat(float i) {
System.out.println("test float");
}
public static void main(String[] args) {
testLong(50);
testFloat(1.5);
}
testLong沒有 問題,因?yàn)閭鬟f的參數(shù)50是int型的,而接收方參數(shù)是long型的,小范圍可以自動(dòng)轉(zhuǎn)型為大范圍的數(shù)據(jù)類型;testFloat不會(huì)通過編譯,因?yàn)閭鬟f 的參數(shù)1.5是double類型的,而接收方參數(shù)是float類型的,大范圍轉(zhuǎn)型為小范圍數(shù)據(jù)類型需要顯式轉(zhuǎn)換,即改為testFloat(1.5f)。
3.閱讀以下程序,解釋其中的錯(cuò)誤。
public static class A {
A(int i) {
System.out.println("A(int i)");
}
}
public static void main(String[] args) {
A a = new A();
}
在定義了自定義構(gòu)造器后,若要使用默認(rèn)構(gòu)造器,則需要顯式指定默認(rèn)構(gòu)造器,否則A a = new A();不能編譯通過。
4.閱讀以下程序,解釋其中的錯(cuò)誤
public static class A {
A() {
System.out.println("A()");
}
A(int i) {
System.out.println("A(int i)");
}
A(int i, int j) {
A();
A(i);
System.out.println("A(int i, int j)");
}
}
在一個(gè)構(gòu)造器中調(diào)用其它構(gòu)造器時(shí),需要使用this關(guān)鍵字進(jìn)行調(diào)用,如this();在一個(gè)構(gòu)造器中可調(diào)用僅一個(gè)其它構(gòu)造器,并且調(diào)用其它構(gòu)造器的語句需放在調(diào)用者(即發(fā)出調(diào)用行為的構(gòu)造器)語句塊的第一行。
5.閱讀以下程序,寫出執(zhí)行結(jié)果。
public static class A {
private int i;
private String j;
int getI() {
return i;
}
String getJ() {
return j;
}
A(int i) {
i = i;
}
A(String j) {
this.j = j;
}
}
public static void main(String[] args) {
System.out.println(new A(5).getI());
System.out.println(new A("hello").getJ());
}
執(zhí)行結(jié)果為:
0
hello
對于i = i;這個(gè)語句而言,它并未改變實(shí)例變量i的值,且i的默認(rèn)值為0,因此結(jié)果也為0,若需要改變實(shí)例變量i的值,需要改為this.i = i;
6.在一個(gè)類中,聲明了若干個(gè)static方法和非static方法,請談?wù)劼暶鞯膕tatic方法是否能訪問聲明的非static方法,說明理由?
static方法不能訪問非static方法,因?yàn)閟tatic方法是屬于這個(gè)類本身的一個(gè)方法,在編譯期間就已經(jīng)確定了;而非static方法是屬于這個(gè)類的對象的方法,需要在實(shí)例化之后才能訪問到。若在static方法中訪問非static方法,將不能通過編譯。
7.static關(guān)鍵字為何不能修飾局部變量?
static 關(guān)鍵字修飾的變量或方法是屬于類的,在編譯時(shí)就已經(jīng)確定了;而普通變量或方法是屬于該由類生成的對象,需要在實(shí)例化后才能確定。因此,若static關(guān)鍵 字修飾了方法的局部變量,一方面方法需要在實(shí)例化之后才能確定,另一方面static修飾的變量需要在編譯時(shí)確定,這就會(huì)導(dǎo)致矛盾。
8.finalize()有何用途?什么情況下需要調(diào)用這個(gè)函數(shù)?
在需要釋放內(nèi)存的地方調(diào)用finalize(),則在下一輪垃圾回收時(shí)會(huì)回收占用的內(nèi)存,一般情況下不需要顯式調(diào)用此函數(shù)。
垃圾回收器只能回收那些由new關(guān)鍵字創(chuàng)建的對象所占用的內(nèi)存,那么有些不是通過這種方式(比如調(diào)用C++本地方法)所占用的內(nèi)存如何回收呢?那么就需要使 用finalize()了。由于C++中需要使用free()函數(shù)來釋放內(nèi)存,所以Java程序在調(diào)用C++時(shí)需要調(diào)用finalize()方法來釋放內(nèi) 存。
9.列出并簡要解釋幾種常見垃圾回收技術(shù)。
引用計(jì)數(shù):每個(gè)對象都包含了一個(gè)引用計(jì)數(shù)器,每被引用一次,計(jì)數(shù)器都加1,引用者被置為null或者銷毀,計(jì)數(shù)器就減1。垃圾收集器進(jìn)行輪詢,一旦發(fā)現(xiàn)計(jì)數(shù)器的值小于1,就回收該對象占用的內(nèi)存。
停止復(fù)制:在垃圾回收機(jī)制運(yùn)行時(shí),程序需要停止運(yùn)行,將每個(gè)活動(dòng)的對象由一個(gè)堆轉(zhuǎn)移到另一個(gè)堆,留下的垃圾會(huì)被回收。
標(biāo)記清除:從堆棧和靜態(tài)存儲(chǔ)區(qū)域開始,尋找到活的對象就對其進(jìn)行標(biāo)記,所有的標(biāo)記過程完成后,就對垃圾進(jìn)行回收。
http://www.ardmore-hotel.com/【9個(gè)Java初始化和回收的面試題】相關(guān)文章:
java學(xué)習(xí):Java面試題和答案07-17
Java經(jīng)典面試題12-29
Java面試題01-22
Java框架面試題07-16
瞬聯(lián)java面試題03-26
java線程面試題匯總02-22
2016高薪Java面試題02-20
java工程師面試題09-25
阿里巴巴java面試題07-31
java開發(fā)面試題型與技巧07-18