java基礎(chǔ)面試題與答案
java基礎(chǔ)面試題與答案
當(dāng)Java程序違反了Java的語(yǔ)義規(guī)則時(shí),Java虛擬機(jī)就會(huì)將發(fā)生的錯(cuò)誤表示為一個(gè)異常。下面就由學(xué)習(xí)啦小編為大家介紹一下java基礎(chǔ)面試題與答案的文章,歡迎閱讀。
java基礎(chǔ)面試題與答案篇1
1、抽象類(abstract class)和接口(interface)有什么區(qū)別?
答:聲明方法的存在而不去實(shí)現(xiàn)它的類被叫做抽象類(abstract class),它用于要?jiǎng)?chuàng)建一個(gè)體現(xiàn)某些基本行為的類,并為該類聲明方法,但不能在該類中實(shí)現(xiàn)該類的情況。不能創(chuàng)建abstract 類的實(shí)例。然而可以創(chuàng)建一個(gè)變量,其類型是一個(gè)抽象類,并讓它指向具體子類的一個(gè)實(shí)例。不能有抽象構(gòu)造函數(shù)或抽象靜態(tài)方法。Abstract類的子類為它們父類中的所有抽象方法提供實(shí)現(xiàn),否則它們也是抽象類為。取而代之,在子類中實(shí)現(xiàn)該方法。知道其行為的其它類可以在類中實(shí)現(xiàn)這些方法。
接口(interface)是抽象類的變體。在接口中,所有方法都是抽象的。多繼承性可通過實(shí)現(xiàn)這樣的接口而獲得。接口中的所有方法都是抽象的,沒有一個(gè)有程序體。接口只可以定義static final成員變量。接口的實(shí)現(xiàn)與子類相似,除了該實(shí)現(xiàn)類不能從接口定義中繼承行為。當(dāng)類實(shí)現(xiàn)特殊接口時(shí),它定義所有這種接口的方法。然后可以在實(shí)現(xiàn)了該接口的類的任何對(duì)象上調(diào)用接口的方法。由于有抽象類,它允許使用接口名作為引用變量的類型。引用可以轉(zhuǎn)換到接口類型或從接口類型轉(zhuǎn)換,instanceof 運(yùn)算符可以用來(lái)決定某對(duì)象的類是否實(shí)現(xiàn)了接口。
2、Java中的異常處理機(jī)制的簡(jiǎn)單原理和應(yīng)用。
答:當(dāng)Java程序違反了Java的語(yǔ)義規(guī)則時(shí),Java虛擬機(jī)就會(huì)將發(fā)生的錯(cuò)誤表示為一個(gè)異常。違反語(yǔ)義規(guī)則包括2種情況:一種是Java類庫(kù)內(nèi)置的語(yǔ)義檢查。例如數(shù)組下標(biāo)越界時(shí)會(huì)引發(fā)IndexOutOfBoundsException,訪問null的對(duì)象時(shí)會(huì)引發(fā)NullPointerException。另一種情況是Java允許程序員擴(kuò)展這種語(yǔ)義檢查,程序員可以創(chuàng)建自己的異常,并自由選擇在何時(shí)用throw關(guān)鍵字引發(fā)異常。所有的異常都是Java.lang.Thowable的子類。
3、sleep()和wait()有什么區(qū)別?
答:sleep()是線程類Thread的方法,導(dǎo)致此線程暫停執(zhí)行指定時(shí)間,給執(zhí)行機(jī)會(huì)給其他線程,但是監(jiān)控狀態(tài)依然保持,到時(shí)后會(huì)自動(dòng)恢復(fù),調(diào)用sleep不會(huì)釋放對(duì)象鎖。
wait()是Object類的方法,對(duì)此對(duì)象調(diào)用wait方法導(dǎo)致本線程放棄對(duì)象鎖,進(jìn)入等待此對(duì)象的等待鎖定池,只有針對(duì)此對(duì)象發(fā)出notify方法(或notifyAll)后本線程才進(jìn)入對(duì)象鎖定池準(zhǔn)備獲得對(duì)象鎖進(jìn)入運(yùn)行狀態(tài)。
4、String是最基本的數(shù)據(jù)類型嗎?
答:String不是基本數(shù)據(jù)類型,基本數(shù)據(jù)類型包括byte、int、char、long、float、double、boolean和short。 Java.lang.String類是final類型的,因此不可以繼承這個(gè)類、不能修改這個(gè)類。
5、String和StringBuffer的區(qū)別。
答:Java平臺(tái)提供了兩個(gè)類:String和StringBuffer,它們可以儲(chǔ)存和操作字符串,即包含多個(gè)字符的字符數(shù)據(jù)。這個(gè)String類提供了數(shù)值不可改變的字符串。而這個(gè)StringBuffer類提供的字符串進(jìn)行修改。當(dāng)知道字符數(shù)據(jù)要改變的時(shí)候就可以使用StringBuffer。典型地,可以使用StringBuffers來(lái)動(dòng)態(tài)構(gòu)造字符數(shù)據(jù)。
6、接口是否可繼承接口? 抽象類是否可實(shí)現(xiàn)接口? 抽象類是否可繼承實(shí)體類?
答:接口可以繼承接口。抽象類可以實(shí)現(xiàn)接口。抽象類是否可繼承實(shí)體類,但前提是實(shí)體類必須有明確的構(gòu)造函數(shù)。
7、Java有沒有g(shù)oto?
答:goto是Java中的保留關(guān)鍵字,但是現(xiàn)在沒有在Java中使用。
8、啟動(dòng)一個(gè)線程是用run()還是start()?
答:?jiǎn)?dòng)一個(gè)線程是調(diào)用start()方法,使線程所代表的虛擬處理機(jī)處于可運(yùn)行狀態(tài),這意味著它可以由JVM調(diào)度并執(zhí)行。這并不意味著線程就會(huì)立即運(yùn)行。run()方法可以產(chǎn)生必須退出的標(biāo)志來(lái)停止一個(gè)線程。
9、說(shuō)明一下類變量和實(shí)例變量的區(qū)別。
答:類變量是所有對(duì)象共有的,所有的實(shí)例對(duì)象都共用一個(gè)類變量,內(nèi)存中只有一處空間存放類變量的值。如果其中一個(gè)對(duì)象改變了類變量的值,其他對(duì)象得到的就是改變后的結(jié)果。當(dāng)類被加載到內(nèi)存時(shí),類變量就會(huì)分配相應(yīng)的內(nèi)存空間。
10、運(yùn)行時(shí)異常與一般異常有何異同?
答:異常表示程序運(yùn)行過程中可能出現(xiàn)的非正常狀態(tài),運(yùn)行時(shí)異常表示虛擬機(jī)的通常操作中可能遇到的異常,是一種常見運(yùn)行錯(cuò)誤。Java編譯器要求方法必須聲明拋出可能發(fā)生的非運(yùn)行時(shí)異常,但是并不要求必須聲明拋出未被捕獲的運(yùn)行時(shí)異常。
java基礎(chǔ)面試題與答案篇2
1、說(shuō)明實(shí)例方法和類方法的區(qū)別?
答:方法前面有static關(guān)鍵字修飾的為類方法,否則為實(shí)例方法。 實(shí)例方法可以調(diào)用該類中的其他方法;類方法只能調(diào)用其他類方法,不能調(diào)用實(shí)例方法;當(dāng)類文件加載到內(nèi)存時(shí),實(shí)例方法不會(huì)被分配內(nèi)存空間,只有在對(duì)象創(chuàng)建之后才會(huì)分配。而類方法在該類被加載到內(nèi)存時(shí)就分配了相應(yīng)的內(nèi)存空間。
2、什么是哈希表?
答:哈希表又稱散列表,是一種能將關(guān)鍵字映射成存儲(chǔ)地址的記錄存儲(chǔ)技術(shù)。要存儲(chǔ)數(shù)據(jù),先設(shè)計(jì)一種算法(哈希函數(shù)),然后根據(jù)數(shù)據(jù)記錄的關(guān)鍵字計(jì)算出各記錄的哈希碼,這個(gè)哈希碼作為與關(guān)鍵字相關(guān)的記錄數(shù)據(jù)的索引。要取出記錄,只需要根據(jù)哈希函數(shù)重新計(jì)算,得到哈希碼后,便可直接到相應(yīng)位置去存取。
3、是否可以從一個(gè)static方法內(nèi)部發(fā)出對(duì)非static方法的調(diào)用?
答:不可以。如果其中包含對(duì)象的method(),不能保證對(duì)象初始化。
4、在Java轉(zhuǎn)義字符中,“\uxxxx”代表什么?
答:\uxxxx是Java中的字符編碼方式,其中前綴 \u就表示該字符是unicode字符,xxxx表示1到4位16進(jìn)制數(shù),用這種轉(zhuǎn)義字符形式可以表示unicode字符集中的任意字符。
5、switch語(yǔ)句中的表達(dá)式可以是什么類型數(shù)據(jù)?
答:表達(dá)式的值可以是byte、short、int和char類型的數(shù)據(jù),但不能是float和double類型的數(shù)據(jù)。
6、插入數(shù)據(jù)時(shí),ArrayList、LinkedList、Vector誰(shuí)速度較快?
答:ArrayList、Vector以數(shù)組方式存儲(chǔ)數(shù)據(jù),插入數(shù)據(jù)時(shí)要進(jìn)行元素移動(dòng)操作,因而插入數(shù)據(jù)慢。LinkedList是一種鏈表結(jié)構(gòu),在插入數(shù)據(jù)時(shí)只需要修改鏈表的前后項(xiàng)指向即可,因此插入速度較快。
7、final, finally, finalize的區(qū)別。
答:final—修飾符(關(guān)鍵字)如果一個(gè)類被聲明為final,意味著它不能再派生出新的子類,不能作為父類被繼承。因此一個(gè)類不能既被聲明為 abstract的,又被聲明為final的。將變量或方法聲明為final,可以保證它們?cè)谑褂弥胁槐桓淖儭1宦暶鳛閒inal的變量必須在聲明時(shí)給定初值,而在以后的引用中只能讀取,不可修改。被聲明為final的方法也同樣只能使用,不能重載。
finally是異常處理時(shí)提供 finally 塊來(lái)執(zhí)行任何清除操作。如果拋出一個(gè)異常,那么相匹配的 catch 子句就會(huì)執(zhí)行,然后控制就會(huì)進(jìn)入 finally 塊(如果有的話)。
finalize是方法名。Java 技術(shù)允許使用 finalize() 方法在垃圾收集器將對(duì)象從內(nèi)存中清除出去之前做必要的清理工作。這個(gè)方法是由垃圾收集器在確定這個(gè)對(duì)象沒有被引用時(shí)對(duì)這個(gè)對(duì)象調(diào)用的。它是在 Object 類中定義的,因此所有的類都繼承了它。子類覆蓋 finalize() 方法以整理系統(tǒng)資源或者執(zhí)行其他清理工作。finalize() 方法是在垃圾收集器刪除對(duì)象之前對(duì)這個(gè)對(duì)象調(diào)用的。
8、說(shuō)出一些常用的類,包,接口,請(qǐng)各舉5個(gè)。
答:常用的類:BufferedReader,BufferedWriter,F(xiàn)ileReader,F(xiàn)ileWirter和String等。
常用的包:Java.lang ,Java.awt,Java.io,Java.util和Java.sql等。
常用的接口:Remote,List,Map,Document和NodeList等。
9、多線程的實(shí)現(xiàn)方法分別是什么?同步的實(shí)現(xiàn)方法分別是什么?
答:多線程有兩種實(shí)現(xiàn)方法,分別是繼承Thread類與實(shí)現(xiàn)Runnable。
接口同步的實(shí)現(xiàn)方面有兩種,分別是synchronized、wait與notify。
10、當(dāng)用System.in.read(buffer)從鍵盤輸入一行n個(gè)字符后,存儲(chǔ)在緩沖區(qū)buffer中的字節(jié)數(shù)是多少?
答:當(dāng)用System.in.read(buffer)從鍵盤輸入一行n個(gè)字符后,存儲(chǔ)在緩沖區(qū)buffer中的字節(jié)數(shù)有n+2個(gè),即除輸入的n個(gè)字符后,還存儲(chǔ)了回車和換行字符。
java基礎(chǔ)面試題與答案篇3
1、如何實(shí)現(xiàn)字符串的分割?
答:第一種方法是采用split()方法,將分割后的內(nèi)容保存在指定的字符串?dāng)?shù)組中;第二種方法是采用StringTokenizer,利用StringTokenizer的nextToken()、hasMoreTokens()等方法進(jìn)行分割。
2、描述一下JVM加載class文件的原理機(jī)制?
答:JVM中類的裝載是由ClassLoader和它的子類來(lái)實(shí)現(xiàn)的,Java ClassLoader 是一個(gè)重要的Java運(yùn)行時(shí)系統(tǒng)組件。它負(fù)責(zé)在運(yùn)行時(shí)查找和裝入類文件的類。
3、在什么情況下,finally語(yǔ)句不會(huì)執(zhí)行?
答:如果在try內(nèi)部執(zhí)行一條System.exit(0)語(yǔ)句終止應(yīng)用程序的執(zhí)行,則finally中的語(yǔ)句不會(huì)被執(zhí)行。
4、作用域public,private,protected,以及不寫時(shí)的區(qū)別。
答:具體區(qū)別如下:
作用域 | 同一類 | 同一包 | 子孫類 | 所有類 |
public | √ | √ | √ | √ |
protected | √ | √ | √ | × |
private | √ | × | × | × |
默認(rèn) | √ | √ | × | × |
5、說(shuō)出重寫和重載的區(qū)別,重寫方法是否可以改變返回值的類型?
答:方法的重寫Overriding和重載Overloading是Java多態(tài)性的不同表現(xiàn)。重寫是父類與子類之間多態(tài)性的一種表現(xiàn),重載是一個(gè)類中多態(tài)性的一種表現(xiàn)。
如果在子類中定義某方法與其父類有相同的名稱和參數(shù),我們說(shuō)該方法被重寫。子類的對(duì)象使用 這個(gè)方法時(shí),將調(diào)用子類中的定義,對(duì)它而言,父類中的定義如同被"屏蔽"了。如果在一個(gè)類中定義了多個(gè)同名的方法,它們或有不同的參數(shù)個(gè)數(shù)或有不同的參數(shù)類型,則稱為方法的重載。
重載的方法是可以改變返回值的類型。
6、throw和throws有什么區(qū)別?
答:throw關(guān)鍵字一般用于方法內(nèi)部,用于拋出一個(gè)異常類對(duì)象,一旦異常被拋出后,throw語(yǔ)句后的程序代碼將不會(huì)被執(zhí)行。
throws關(guān)鍵字通常出現(xiàn)在方法聲明中,用來(lái)指定該方法可能拋出的異常。如果可能有多個(gè)異常拋出,可以使用逗號(hào)將它們分隔開。
7、字符串的compareTo方法結(jié)果是什么?
答:使用compareTo()方法可以比較字符串與字符串之間的大小關(guān)系。如果當(dāng)前字符串小于指定字符串,則返回一個(gè)小于0的數(shù)值;否則返回一個(gè)大于0的數(shù)值;如果兩個(gè)字符串相等,則返回0。
8、字符串的連接操作有幾種實(shí)現(xiàn)方法?
答:字符串與字符串的連接操作可以通過“+”運(yùn)算符和concat()方法來(lái)實(shí)現(xiàn)。另外“+”運(yùn)算符還可以實(shí)現(xiàn)字符串與其他類型數(shù)據(jù)之間的連接操作,可以與字符串連接的數(shù)據(jù)類型有:int、long、float、double、boolean、char等。
9、當(dāng)一個(gè)對(duì)象被當(dāng)作參數(shù)傳遞到一個(gè)方法后,此方法可改變這個(gè)對(duì)象的屬性,并可返回變化后的結(jié)果,那么這里到底是值傳遞還是引用傳遞?
答:是值傳遞,因?yàn)樵贘ava編程語(yǔ)言中只有值傳遞參數(shù)。當(dāng)一個(gè)對(duì)象實(shí)例作為一個(gè)參數(shù)被傳遞到方法中時(shí),參數(shù)的值就是對(duì)該對(duì)象的引用。對(duì)象的內(nèi)容可以在被調(diào)用的方法中改變,但對(duì)象的引用是永遠(yuǎn)不會(huì)改變的。
1
0、Class MyClass等價(jià)于 Class MyClass extends Object是否正確?
答:正確。因?yàn)镺bject類是Java中最高層次的類,是所有類的超類。所有的類,都可以說(shuō)是由Object繼承而來(lái),只是我們不需要顯式地指明extends Object。