前言:以前發佈的面試題,多多少少有一些細節上的錯誤或者筆誤,很多同窗給我留言指正,我想着等開通留言以後在每一篇的留言下聲明一下錯誤點。前天留言功能終於等到了。結果發現留言只能開通以後發的文章,仍是太年輕啊!想着不要誤人子弟,仍是把文章從新整理一下,把錯誤的點改過來!!php
一、一個".java"源文件中是否能夠包括多個類(不是內部類)?有什麼限制?java
能夠有多個類,但只能有一個public的類,而且public的類名必須與文件名相一致。面試
二、Java有沒有goto?數組
java中的保留字,如今沒有在java中使用。app
三、說說&和&&的區別。ide
&和&&均可以用做邏輯與的運算符,表示邏輯與(and),當運算符兩邊的表達式的結果都爲true時,整個運算結果才爲true,不然,只要有一方爲false,則結果爲false。學習
&&還具備短路的功能,即若是第一個表達式爲false,則再也不計算第二個表達式,例如,對於if(str!= null&& !str.equals(s))表達式,當str爲null時,後面的表達式不會執行,因此不會出現NullPointerException若是將&&改成&,則會拋出NullPointerException異常。If(x==33 &++y>0) y會增加,If(x==33 && ++y>0)不會增加字體
&還能夠用做位運算符,當&操做符兩邊的表達式不是boolean類型時,&表示按位與操做,咱們一般使用0x0f來與一個整數進行&運算,來獲取該整數的最低4個bit位,例如,0x31 & 0x0f的結果爲0x01。編碼
四、在JAVA中如何跳出當前的多重嵌套循環?spa
在Java中,要想跳出多重循環,能夠在外面的循環語句前定義一個標號,而後在裏層循環體的代碼中使用帶有標號的break語句,便可跳出外層循環。
例如:
for(int i=0;i<10;i++){
for(intj=0;j<10;j++){
System.out.println(「i=」 + i + 「,j=」 + j);
if(j == 5) break ok;
}
}
另外,我我的一般並不使用標號這種方式,而是讓外層的循環條件表達式的結果能夠受到裏層循環體代碼的控制,例如,要在二維數組中查找到某個數字。
int arr[][] ={{1,2,3},{4,5,6,7},{9}};
boolean found = false;
for(int i=0;i<arr.length&&!found;i++) {
for(intj=0;j<arr[i].length;j++){
System.out.println(「i=」 + i + 「,j=」 + j);
if(arr[i][j] ==5) {
found =true;
break;
}
}
}
五、switch語句可否做用在byte上,可否做用在long上,可否做用在String上?
在switch(e)中,e只能是一個整數表達式或者枚舉常量(更大字體),整數表達式能夠是int基本類型或Integer包裝類型,因爲byte,short,char均可以隱含轉換爲int,因此,這些類型以及這些類型的包裝類型也是能夠的。顯然,long和String類型都不符合switch的語法規定,而且不能被隱式轉換成int類型,因此,它們不能做用於swtich語句中。
switch語句可否做用在String上說錯了,Java1.7以後已經支持這種寫法了!
六、short s1= 1; s1 = (s1+1是int類型,而等號左邊的是short類型,因此須要強轉)1 + 1;有什麼錯? short s1 = 1; s1 += 1;有什麼錯?(沒有錯)
對於short s1= 1; s1 = s1 + 1;因爲s1+1運算時會自動提高表達式的類型,因此結果是int型,再賦值給short類型s1時,編譯器將報告須要強制轉換類型的錯誤。
對於short s1= 1; s1 += 1;因爲 +=是java語言規定的運算符,java編譯器會對它進行特殊處理,所以能夠正確編譯。
七、char型變量中能不能存貯一箇中文漢字?爲何?
char型變量是用來存儲Unicode編碼的字符的,unicode編碼字符集中包含了漢字,因此,char型變量中固然能夠存儲漢字啦。不過,若是某個特殊的漢字沒有被包含在unicode編碼字符集中,那麼,這個char型變量中就不能存儲這個特殊漢字。補充說明:unicode編碼佔用兩個字節,因此,char類型的變量也是佔用兩個字節。
八、用最有效率的方法算出2乘以8等於幾?
2<< 3,(左移三位)由於將一個數左移n位,就至關於乘以了2的n次方,那麼,一個數乘以8只要將其左移3位便可,而位運算cpu直接支持的,效率最高,因此,2乘以8等於幾的最效率的方法是2<< 3。
九、使用final關鍵字修飾一個變量時,是引用不能變,仍是引用的對象不能變?
使用final關鍵字修飾一個變量時,是指引用變量不能變,引用變量所指向的對象中的內容仍是能夠改變的。例如,對於以下語句:
finalStringBuffer a=new StringBuffer("immutable");
執行以下語句將報告編譯期錯誤:
a=new StringBuffer("");
可是,執行以下語句則能夠經過編譯:
a.append(" broken!");
有人在定義方法的參數時,可能想採用以下形式來阻止方法內部修改傳進來的參數對象:
public void method(final StringBuffer param){
}
實際上,這是辦不到的,在該方法內部仍然能夠增長以下代碼來修改參數對象:
param.append("a");
10,靜態變量和實例變量的區別?
在語法定義上的區別:靜態變量前要加static關鍵字,而實例變量前則不加。
在程序運行時的區別:實例變量屬於某個對象的屬性,必須建立了實例對象,其中的實例變量纔會被分配空間,才能使用這個實例變量。靜態變量不屬於某個實例對象,而是屬於類,因此也稱爲類變量,只要程序加載了類的字節碼,不用建立任何實例對象,靜態變量就會被分配空間,靜態變量就能夠被使用了。總之,實例變量必須建立對象後才能夠經過這個對象來使用,靜態變量則能夠直接使用類名來引用。
例如,對於下面的程序,不管建立多少個實例對象,永遠都只分配了一個staticVar變量,而且每建立一個實例對象,這個staticVar就會加1;可是,每建立一個實例對象,就會分配一個instanceVar,便可能分配多個instanceVar,而且每一個instanceVar的值都只自加了1次。
public class VariantTest{ publicstatic int staticVar = 0; publicint instanceVar = 0; publicVariantTest(){ staticVar++; instanceVar++; System.out.println(staticVar +instanceVar); } }
Java知音整理一些各大公司經常使用的面試筆試題,供你們在天天閒暇之餘學習其中幾道題目,日積月累,等到出去面試時,一切都水到渠成,面試時就天然會遊刃有餘了。