【JAVA秒會技術之秒殺面試官】JavaSE常見面試題(一)
【前言】別人都在你看不到的地方暗自努力,在你看得到的地方,他們也和你一樣顯得遊手好閒,和你一樣會抱怨,而只有你自己相信這些都是真的,最後,也只有你一個人繼續不思進取 ……
【下載】本人剛學習Java時總結的一些JavaSE常見面試題,偶爾在電腦中翻出,重新整理一下分享給需要的人,主要針對初級程式設計師。想要PDF完整版下載的,評論裡留言留下你的郵箱!
1.一個".java"原始檔中是否可以包括多個類(不是內部類)?有什麼限制?
答:可以有多個類,但只能有一個public的類,並且public的類名必須與檔名相一致。
2.Java有沒有goto?
答:goto
是Java中的保留字,在目前版本的
3.說說&和&&的區別?
答:①&和&&都可以用作邏輯與的運算子,表示邏輯與(and),當運算子兩邊的表示式的結果都為true時,整個運算結果才為
②&&還具有短路的功能,即如果第一個表示式為false,則不再計算第二個表示式,例如,對於if(str != null && !str.equals(“ ”))表示式,當str為null時,後面的表示式不會執行,所以不會出現NullPointerException如果將&&改為&,則會丟擲NullPointerException異常。If(x==33 & ++y>0) y會增長,If(x==33 && ++y>0)不會增長
③&還可以用作位運算子,當
4.switch語句能否作用在byte上,能否作用在long上,能否作用在String上?
答:在switch(expr1)中,expr1只能是一個整數表示式或者列舉常量(更大字型),整數表示式可以是int基本型別或Integer包裝型別,由於,byte,short,char都可以隱含轉換為int,所以,這些型別以及這些型別的包裝型別也是可以的。顯然,long和String型別都不符合switch的語法規定,並且不能被隱式轉換成int型別,所以,它們不能作用於swtich語句中。但是在JDK7的新特性中,switch語句可以用字串。
5.short s1 = 1; s1 = s1 + 1;有什麼錯?short s1 = 1; s1 += 1;有什麼錯?
答:①對於short s1 = 1; s1 = s1 + 1;由於s1+1運算時會自動提升表示式的型別,所以結果是int型,再賦值給short型別s1時,編譯器將報告需要強制轉換型別的錯誤。
②對於short s1 = 1; s1 += 1;由於+= 是java語言規定的運算子,java編譯器會對它進行特殊處理,因此可以正確編譯。
6.char型變數中能不能存貯一箇中文漢字?為什麼?
答:char型變數是用來儲存Unicode編碼的字元的,unicode編碼字符集中包含了漢字,所以,char型變數中當然可以儲存漢字啦。不過,如果某個特殊的漢字沒有被包含在unicode編碼字符集中,那麼,這個char型變數中就不能儲存這個特殊漢字。補充說明:unicode編碼佔用兩個位元組,所以,char型別的變數也是佔用兩個位元組。
7.用最有效率的方法算出2乘以8等於幾?
答:2 << 3,因為將一個數左移n位,就相當於乘以了2的n次方,那麼,一個數乘以8只要將其左移3位即可,而位運算cpu直接支援的,效率最高,所以,2乘以8等於幾的最效率的方法是2 << 3。
8.使用final關鍵字修飾一個變數時,是引用不能變,還是引用的物件不能變?
答:使用final關鍵字修飾一個變數時,是指引用變數不能變,引用變數所指向的物件中的內容還是可以改變的。
9."=="和equals方法究竟有什麼區別?
答:①==比較的是值,equals比較的是地址值②一般我們會重寫equals讓它按照我們的意願去比較相關屬性,而不是單純的比較地址值。
10.靜態變數和例項變數的區別?
答:①在語法定義上的區別:靜態變數前要加static關鍵字,而例項變數前則不加。
②在程式執行時的區別:例項變數屬於某個物件的屬性,必須建立了例項物件,其中的例項變數才會被分配空間,才能使用這個例項變數。靜態變數不屬於某個例項物件,而是屬於類,所以也稱為類變數,只要程式載入了類的位元組碼,不用建立任何例項物件,靜態變數就會被分配空間,靜態變數就可以被使用了。總之,例項變數必須建立物件後才可以通過這個物件來使用,靜態變數則可以直接使用類名來引用。
③例如,對於下面的程式,無論建立多少個例項物件,永遠都只分配了一個staticVar變數,並且每建立一個例項物件,這個staticVar就會加1;但是,每建立一個例項物件,就會分配一個instanceVar,即可能分配多個instanceVar,並且每個instanceVar的值都只自加了1次。
public class VariantTest
{
public static int staticVar = 0;
public int instanceVar = 0;
public VariantTest()
{
staticVar++;
instanceVar++;
System.out.println(“staticVar=”+ staticVar + ”,instanceVar=”+ instanceVar);
}
}
11.是否可以從一個static方法內部發出對非static方法的呼叫?
答:不可以。因為非static方法是要與物件關聯在一起的,必須建立一個物件後,才可以在該物件上進行方法呼叫,而static方法呼叫時不需要建立物件,可以直接呼叫。也就是說,當一個static方法被呼叫時,可能還沒有建立任何例項物件,如果從一個static方法中發出對非static方法的呼叫,那個非static方法是關聯到哪個物件上的呢?這個邏輯無法成立,所以,一個static方法內部發出對非static方法的呼叫。
12.Integer與int的區別
答:①int是java提供的8種原始資料型別之一。Java為每個原始型別提供了封裝類,Integer是java為int提供的封裝類。int的預設值為0,而Integer的預設值為null,即Integer可以區分出未賦值和值為0的區別,int則無法表達出未賦值的情況,例如,要想表達出沒有參加考試和考試成績為0的區別,則只能使用Integer。在JSP開發中,Integer的預設為null,所以用el表示式在文字框中顯示時,值為空白字串,而int預設的預設值為0,所以用el表示式在文字框中顯示時,結果為0,所以,int不適合作為web層的表單資料的型別。
②在Hibernate中,如果將OID定義為Integer型別,那麼Hibernate就可以根據其值是否為null而判斷一個物件是否是臨時的,如果將OID定義為了int型別,還需要在hbm對映檔案中設定其unsaved-value屬性為0。
③另外,Integer提供了多個與整數相關的操作方法,例如,將一個字串轉換成整數,Integer中還定義了表示整數的最大值和最小值的常量。
13.Math.round(11.5)等於多少?Math.round(-11.5)等於多少?
答:Math類中提供了三個與取整有關的方法:ceil.floor.round,這些方法的作用與它們的英文名稱的含義相對應,例如,ceil的英文意義是天花板,該方法就表示向上取整,所以,Math.ceil(11.3)的結果為12,Math.ceil(-11.3)的結果是-11;floor的英文意義是地板,該方法就表示向下取整,所以,Math.floor(11.6)的結果為11,Math.floor(-11.6)的結果是-12;最難掌握的是round方法,它表示“四捨五入”,演算法為Math.floor(x+0.5),即將原來的數字加上0.5後再向下取整,所以,Math.round(11.5)的結果為12,Math.round(-11.5)的結果為-11。
14.請說出作用域public,private,protected,以及不寫時的區別?
答:
類的成員不寫訪問修飾時預設為default。預設對於同一個包中的其他類相當於公開(public),對於不是同一個包中的其他類相當於私有(private)。受保護(protected)對子類相當於公開,對不是同一包中的沒有父子關係的類相當於私有。Java中,外部類的修飾符只能是public或預設,類的成員(包括內部類)的修飾符可以是以上四種。
15.Overload和Override的區別。Overloaded的方法是否可以改變返回值的型別?
答:①方法過載(Overload):在本類中出現了方法名相同但引數列表不同的方法,與返回值無關,可以改變返回值型別,只看引數列表;
②方法重寫(Override):子類中出現了和父類中方法宣告一模一樣的方法,與返回值有關,返回值和型別都是一樣的。
16.面向物件的特徵有哪些方面?
答:①抽象:抽象是將一類物件的共同特徵總結出來構造類的過程,包括資料抽象和行為抽象兩方面。抽象只關注物件有哪些屬性和行為,並不關注這些行為的細節是什麼。
②繼承:繼承是從已有類得到繼承資訊建立新類的過程。提供繼承資訊的類被稱為父類(超類、基類);得到繼承資訊的類被稱為子類(派生類)。繼承讓變化中的軟體系統有了一定的延續性,同時繼承也是封裝程式中可變因素的重要手段(如果不能理解請閱讀閻巨集博士的《Java與模式》或《設計模式精解》中關於橋樑模式的部分)。
③封裝:通常認為封裝是把資料和操作資料的方法繫結起來,對資料的訪問只能通過已定義的介面。面向物件的本質就是將現實世界描繪成一系列完全自治、封閉的物件。我們在類中編寫的方法就是對實現細節的一種封裝;我們編寫一個類就是對資料和資料操作的封裝。可以說,封裝就是隱藏一切可隱藏的東西,只向外界提供最簡單的程式設計介面(可以想想普通洗衣機和全自動洗衣機的差別,明顯全自動洗衣機封裝更好因此操作起來更簡單;我們現在使用的智慧手機也是封裝得足夠好的,因為幾個按鍵就搞定了所有的事情)。
④多型性:多型性是指允許不同子型別的物件對同一訊息作出不同的響應。簡單的說就是用同樣的物件引用呼叫同樣的方法但是做了不同的事情。多型性分為編譯時的多型性和執行時的多型性。如果將物件的方法視為物件向外界提供的服務,那麼執行時的多型性可以解釋為:當A系統訪問B系統提供的服務時,B系統有多種提供服務的方式,但一切對A系統來說都是透明的(就像電動剃鬚刀是A系統,它的供電系統是B系統,B系統可以使用電池供電或者用交流電,甚至還有可能是太陽能,A系統只會通過B類物件呼叫供電的方法,但並不知道供電系統的底層實現是什麼,究竟通過何種方式獲得了動力)。方法過載(overload)實現的是編譯時的多型性(也稱為前繫結),而方法重寫(override)實現的是執行時的多型性(也稱為後繫結)。執行時的多型是面向物件最精髓的東西,要實現多型需要做兩件事:(a) 方法重寫(子類繼承父類並重寫父類中已有的或抽象的方法);(b)物件造型(用父型別引用引用子型別物件,這樣同樣的引用呼叫同樣的方法就會根據子類物件的不同而表現出不同的行為)。
17.String是最基本的資料型別嗎?
答:不是。Java中的基本資料型別只有8個:byte、short、int、long、float、double、char、boolean;除了基本型別(primitive type)和列舉型別(enumeration type),剩下的都是引用型別(reference type)。
18.float f=3.4;是否正確?
答:不正確。3.4是雙精度數,將雙精度型(double)賦值給浮點型(float)屬於下轉型(down-casting,也稱為窄化)會造成精度損失,因此需要強制型別轉換float f =(float)3.4; 或者寫成float f =3.4F;。
19.解釋記憶體中的棧(stack)、堆(heap)和靜態區(static area)的用法?
答:①通常我們定義一個基本資料型別的變數,一個物件的引用,還有就是函式呼叫的現場儲存都使用記憶體中的棧空間;
②而通過new關鍵字和構造器建立的物件放在堆空間;
③程式中的字面量(literal)如直接書寫的100、"hello"和常量都是放在靜態區中。
④棧空間操作起來最快但是棧很小,通常大量的物件都是放在堆空間,理論上整個記憶體沒有被其他程序使用的空間甚至硬碟上的虛擬記憶體都可以被當成堆空間來使用。
⑤例如:String str = new String("hello");
上面的語句中變數str放在棧上,用new創建出來的字串物件放在堆上,而"hello"這個字面量放在靜態區。
20.陣列有沒有length()方法?String有沒有length()方法?
答:陣列沒有length()方法,有length的屬性。String有length()方法。JavaScript中,獲得字串的長度是通過length屬性得到的,這一點容易和Java混淆。