32、接口是否可繼承(extends)接口? 抽象類是否可實現(xiàn)(implements)接口? 抽象類是否可繼承具體類(concrete class)?
接口:接口是一種約束形式披诗,其中只包括成員定義通铲,不包含成員實現(xiàn)的內(nèi)容较曼。
抽象類:抽象類往往用來表征對問題領(lǐng)域進行分析徐裸、設(shè)計中得出的抽象概念,是對一系列看上去不同酸役,但是本質(zhì)上相同的具體概念的抽象浸遗。
抽象方法:抽象方法指一些只有方法聲明猫胁,而沒有具體方法體的方法。抽象方法一般存在于抽象或接口中
接口可以繼承接口跛锌。抽象類可以實現(xiàn)(implements)接口弃秆,抽象類可繼承具體類,但前提是具體類必須有明確的構(gòu)造函數(shù)。
33菠赚、一個“.java”源文件中是否可以包含多個類(不是內(nèi)部類)脑豹?有什么限制?
可以衡查,但一個源文件中最多只能有一個公開類(public class)而且文件名必須和公開類的類名完全保持一致瘩欺。
34、Anonymous Inner Class(匿名內(nèi)部類)是否可以繼承其它類峡捡?是否可以實現(xiàn)接口击碗?
匿名內(nèi)部類在實現(xiàn)時必須借助一個借口或者一個抽象類或者一個普通類來構(gòu)造筑悴,從這過層次上講匿名內(nèi)部類是實現(xiàn)了接口或者繼承了類们拙,但是不能通過extends或implement關(guān)鍵詞來繼承類或?qū)崿F(xiàn)接口。
匿名內(nèi)部類即沒有名字的內(nèi)部類阁吝。當(dāng)我們只需要用某一個類一次時砚婆,且該類從意義上需要實現(xiàn)某個類或某個接口,這個特殊的擴展類就以匿名內(nèi)部類來展現(xiàn)突勇。
一般的用途:
1装盯、覆蓋某個超類的方法,并且該擴展類只在本類內(nèi)用一次甲馋。
2埂奈、繼承抽象類,并實例化其抽象方法定躏,并且該擴展類只在本類內(nèi)用一次账磺。
3、實現(xiàn)接口痊远,實例化其方法垮抗,并且該擴展類只在本類內(nèi)用一次。
幾點說明:
一碧聪、由于匿名內(nèi)部類沒有名字冒版,所以它沒有構(gòu)造函數(shù)。因為沒有構(gòu)造函數(shù)逞姿,所以它必須完全借用父類的構(gòu)造函數(shù)來實例化辞嗡,匿名內(nèi)部類完全把創(chuàng)建對象的任務(wù)交給了父類去完成。
二滞造、在匿名內(nèi)部類里創(chuàng)建新的方法沒有太大意義续室,但它可以通過覆蓋父類的方法達到神奇效果,如上例所示断部。這是多態(tài)性的體現(xiàn)猎贴。
三、因為匿名內(nèi)部類沒有名字,所以無法進行向下的強制類型轉(zhuǎn)換她渴,持有對一個匿名內(nèi)部類對象引用的變量類型一定是它的直接或間接父類類型达址。
四、注意匿名內(nèi)部類的聲明是在編譯時進行的趁耗,實例化在運行時進行沉唠。這意味著for循環(huán)中的一個new語句會創(chuàng)建相同匿名類的幾個實例,而不是創(chuàng)建幾個不同匿名類的一個實例苛败。
35满葛、內(nèi)部類可以引用它的包含類(外部類)的成員嗎?有沒有什么限制罢屈?
一個內(nèi)部類對象可以訪問創(chuàng)建它的外部類對象的成員嘀韧,包括私有成員。
36缠捌、Java 中的final關(guān)鍵字有哪些用法锄贷?
在java中,可能使用到final關(guān)鍵字修飾的有數(shù)據(jù)曼月、方法和類谊却。
一、final 修飾數(shù)據(jù)
有final修飾的數(shù)據(jù)是用來告訴編譯器一塊數(shù)據(jù)是恒定不變的哑芹,有時數(shù)據(jù)恒定不變是很有用的炎辨,比如:
1.一個永不改變的編譯時常量。
2.一個在運行時被初始化的值聪姿,但是又不希望它被改變碴萧。
編譯時常量必須是基本數(shù)據(jù)類型,并且以關(guān)鍵字final修飾咳燕,在對這個常量進行定義的時候必須進行賦值勿决,并且以后不能被改變。
對于基本類型招盲,final使數(shù)值恒定不變低缩;而對于對象引用,final使引用恒定不變曹货,也就是說某個引用不能再指向其他對象了咆繁,但是當(dāng)前指向的這個對象自身的數(shù)據(jù)是可以改變的。
二顶籽、final修飾方法
使用final修飾方法的作用是把方法鎖定玩般,以防止任何繼承類修改它的含義。在繼承類中礼饱,使用了與父類用final修飾的方法同名的方法時坏为,并沒有覆蓋父類的該方法究驴,而是生成了一個新的方法。也就是說final修飾的方法不能被重寫匀伏。
三洒忧、final修飾類
當(dāng)將某個類定義為final時,就表明了你不打算繼承該類够颠,也不允許別人繼承熙侍。
37、指出下面程序的運行結(jié)果:
執(zhí)行結(jié)果:1a2b2b履磨。創(chuàng)建對象時構(gòu)造器的調(diào)用順序是:先初始化靜態(tài)成員蛉抓,然后調(diào)用父類構(gòu)造器,再初始化非靜態(tài)成員剃诅,最后調(diào)用自身構(gòu)造器巷送。
38、數(shù)據(jù)類型之間的轉(zhuǎn)換:
1)如何將字符串轉(zhuǎn)換為基本數(shù)據(jù)類型综苔?
2)如何將基本數(shù)據(jù)類型轉(zhuǎn)換為字符串惩系?
1)調(diào)用基本數(shù)據(jù)類型對應(yīng)的包裝類中的方法parseXXX(String)或valueOf(String)即可返回相應(yīng)基本類型;
2)一種方法是將基本數(shù)據(jù)類型與空字符串(””)連接(+)即可獲得其所對應(yīng)的字符串如筛;另一種方法是調(diào)用String 類中的valueOf(…)方法返回相應(yīng)字符串
39、如何實現(xiàn)字符串的反轉(zhuǎn)及替換抒抬?
方法很多杨刨,可以自己寫實現(xiàn)也可以使用String或StringBuffer / StringBuilder中的方法。
用遞歸實現(xiàn)字符串反轉(zhuǎn)
40擦剑、怎樣將GB2312編碼的字符串轉(zhuǎn)換為ISO-8859-1編碼的字符串妖胀?
String s1 = "你好";
String s2 = newString(s1.getBytes("GB2312"), "ISO-8859-1");
41、日期和時間:
1)如何取得年月日惠勒、小時分鐘秒赚抡?
2)如何取得從1970年1月1日0時0分0秒到現(xiàn)在的毫秒數(shù)?
3)如何取得某月的最后一天纠屋?
4)如何格式化日期涂臣?
1)創(chuàng)建java.util.Calendar 實例,調(diào)用其get()方法傳入不同的參數(shù)即可獲得參數(shù)所對應(yīng)的值
2)以下方法均可獲得該毫秒數(shù):
Calendar.getInstance().getTimeInMillis();
System.currentTimeMillis();
3)示例代碼如下:
Calendar?time?=?Calendar.getInstance();
time.getActualMaximum(Calendar.DAY_OF_MONTH);
4)利用java.text.DataFormat 的子類(如SimpleDateFormat類)中的format(Date)方法可將日期格式化售担。
42赁遗、打印昨天的當(dāng)前時刻。
43族铆、比較一下Java 和JavaSciprt
JavaScript 與Java是兩個公司開發(fā)的不同的兩個產(chǎn)品岩四。Java 是原Sun 公司推出的面向?qū)ο蟮某绦蛟O(shè)計語言,特別適合于互聯(lián)網(wǎng)應(yīng)用程序開發(fā)哥攘;而JavaScript是Netscape公司的產(chǎn)品剖煌,為了擴展Netscape瀏覽器的功能而開發(fā)的一種可以嵌入Web頁面中運行的基于對象和事件驅(qū)動的解釋性語言材鹦,它的前身是LiveScript;而Java 的前身是Oak語言耕姊。
下面對兩種語言間的異同作如下比較:
1)基于對象和面向?qū)ο螅篔ava是一種真正的面向?qū)ο蟮恼Z言侠姑,即使是開發(fā)簡單的程序,必須設(shè)計對象箩做;JavaScript是種腳本語言莽红,它可以用來制作與網(wǎng)絡(luò)無關(guān)的,與用戶交互作用的復(fù)雜軟件邦邦。它是一種基于對象(Object-Based)和事件驅(qū)動(Event-Driven)的編程語言安吁。因而它本身提供了非常豐富的內(nèi)部對象供設(shè)計人員使用;
2)解釋和編譯:Java 的源代碼在執(zhí)行之前燃辖,必須經(jīng)過編譯鬼店;JavaScript 是一種解釋性編程語言,其源代碼不需經(jīng)過編譯黔龟,由瀏覽器解釋執(zhí)行妇智;
3)強類型變量和類型弱變量:Java采用強類型變量檢查,即所有變量在編譯之前必須作聲明;JavaScript中變量聲明,采用其弱類型佳遂。即變量在使用前不需作聲明眷茁,而是解釋器在運行時檢查其數(shù)據(jù)類型;
4)代碼格式不一樣。
注:上面列出的四點是原來所謂的標(biāo)準(zhǔn)答案中給出的。其實Java和JavaScript最重要的區(qū)別是一個是靜態(tài)語言,一個是動態(tài)語言到踏。目前的編程語言的發(fā)展趨勢是函數(shù)式語言和動態(tài)語言。在Java中類(class)是一等公民尚猿,而JavaScript中函數(shù)(function)是一等公民窝稿。
44、什么時候用assert凿掂?
(1)ssertion(斷言)在軟件開發(fā)中是一種常用的調(diào)試方式伴榔,很多開發(fā)語言中都支持這種機制。
(2)assertion就是在程序中的一條語句缠劝,它對一個boolean表達式進行檢查潮梯,一個正確程序必須保證這個boolean表達式的值為true;如果該值為false惨恭,說明程序已經(jīng)處于不正確的狀態(tài)下秉馏,系統(tǒng)將給出警告或退出。
(3)assertion用于保證程序最基本脱羡、關(guān)鍵的正確性萝究。assertion檢查通常在開發(fā)和測試時開啟免都。為了提高性能,在軟件發(fā)布后帆竹,assertion檢查通常是關(guān)閉的绕娘。
在實現(xiàn)中,斷言是一個包含布爾表達式的語句栽连,在執(zhí)行這個語句時假定該表達式為true险领;如果表達式計算為false,那么系統(tǒng)會報告一個AssertionError秒紧。
斷言用于調(diào)試目的:
assert(a > 0); // throws an AssertionError if a <= 0
斷言可以有兩種形式:
assert Expression1;
assert Expression1 : Expression2 ;
Expression1 應(yīng)該總是產(chǎn)生一個布爾值绢陌。
Expression2 可以是得出一個值的任意表達式;這個值用于生成顯示更多調(diào)試信息的字符串消息熔恢。
斷言在默認情況下是禁用的脐湾,要在編譯時啟用斷言,需使用source 1.4 標(biāo)記:
javac -source 1.4 Test.java
要在運行時啟用斷言叙淌,可使用-enableassertions 或者-ea 標(biāo)記秤掌。
要在運行時選擇禁用斷言,可使用-da 或者-disableassertions 標(biāo)記鹰霍。
要在系統(tǒng)類中啟用斷言闻鉴,可使用-esa 或者-dsa 標(biāo)記。還可以在包的基礎(chǔ)上啟用或者禁用斷言衅谷〗忿郑可以在預(yù)計正常情況下不會到達的任何位置上放置斷言。斷言可以用于驗證傳遞給私有方法的參數(shù)获黔。不過,斷言不應(yīng)該用于驗證傳遞給公有方法的參數(shù)在验,因為不管是否啟用了斷言玷氏,公有方法都必須檢查其參數(shù)。不過腋舌,既可以在公有方法中盏触,也可以在非公有方法中利用斷言測試后置條件。另外块饺,斷言不應(yīng)該以任何方式改變程序的狀態(tài)赞辩。
45、Error 和Exception 有什么區(qū)別?
Error類和Exception類的父類都是throwable類授艰,
區(qū)別是:
Error類一般是指與虛擬機相關(guān)的問題辨嗽,如系統(tǒng)崩潰,虛擬機錯誤淮腾,內(nèi)存空間不足糟需,方法調(diào)用棧溢等屉佳。對于這類錯誤的導(dǎo)致的應(yīng)用程序中斷,僅靠程序本身無法恢復(fù)和和預(yù)防洲押,遇到這樣的錯誤武花,建議讓程序終止。
Exception類表示程序可以處理的異常杈帐,可以捕獲且可能恢復(fù)体箕。遇到這類異常,應(yīng)該盡可能處理異常挑童,使程序恢復(fù)運行累铅,而不應(yīng)該隨意終止異常。
Exception類又分為運行時異常(Runtime Exception)和受檢查的異常(Checked Exception )炮沐,運行時異常;ArithmaticException,IllegalArgumentException争群,編譯能通過,但是一運行就終止了大年,程序不會處理運行時異常换薄,出現(xiàn)這類異常,程序會終止翔试。而受檢查的異常轻要,要么用try。垦缅。冲泥。catch捕獲,要么用throws字句聲明拋出壁涎,交給它的父類處理凡恍,否則編譯不會通過。
常見的異常;
ArrayIndexOutOfBoundsException 數(shù)組下標(biāo)越界異常怔球,
ArithmaticException 算數(shù)異常 如除數(shù)為零
NullPointerException 空指針異常
IllegalArgumentException 不合法參數(shù)異常
46嚼酝、try{}里有一個return語句,那么緊跟在這個try后的finally{}里的code會不會被執(zhí)行竟坛,什么時候被執(zhí)行闽巩,在return前還是后?
會執(zhí)行,在方法返回調(diào)用者前執(zhí)行担汤。Java允許在finally中改變返回值的做法是不好的涎跨,因為如果存在finally代碼塊,try中的return語句不會立馬返回調(diào)用者崭歧,而是記錄下返回值待finally代碼塊執(zhí)行完畢之后再向調(diào)用者返回其值隅很,然后如果在finally中修改了返回值,這會對程序造成很大的困擾驾荣,C#中就從語法上規(guī)定不能做這樣的事外构。
47普泡、Java 語言如何進行異常處理,關(guān)鍵字:throws审编、throw撼班、try、catch垒酬、finally分別如何使用砰嘁?
Java通過面向?qū)ο蟮姆椒ㄟM行異常處理,把各種不同的異常進行分類勘究,并提供了良好的接口矮湘。
在Java中,每個異常都是一個對象口糕,它是Throwable類或其它子類的實例缅阳。當(dāng)一個方法出現(xiàn)異常后便
拋出一個異常對象,該對象中包含有異常信息景描,調(diào)用這個對象的方法可以捕獲到這個異常并進行處
理十办。Java的異常處理是通過5個關(guān)鍵詞來實現(xiàn)的:try、catch超棺、throw向族、throws和finally。一般情況下是用
try來執(zhí)行一段程序棠绘,如果出現(xiàn)異常件相,系統(tǒng)會拋出(throws)一個異常,這時候你可以通過它的類型
來捕捉(catch)它氧苍,或最后(finally)由缺省處理器來處理夜矗。
用try來指定一塊預(yù)防所有"異常"的程序。緊跟在try程序后面让虐,應(yīng)包含一個catch子句來指定你想要捕
捉的"異常"的類型侯养。
throw語句用來明確地拋出一個"異常"。
throws用來標(biāo)明一個成員函數(shù)可能拋出的各種"異常"澄干。
Finally為確保一段代碼不管發(fā)生什么"異常"都被執(zhí)行一段代碼。
可以在一個成員函數(shù)調(diào)用的外面寫一個try語句柠傍,在這個成員函數(shù)內(nèi)部寫另一個try語句保護其他代碼
麸俘。每當(dāng)遇到一個try語句,"異常"的框架就放到堆棧上面惧笛,直到所有的try語句都完成从媚。如果下一級的
try語句沒有對某種"異常"進行處理,堆棧就會展開患整,直到遇到有處理這種"異常"的try語句拜效。
48喷众、運行時異常與受檢異常有何異同?
異常表示程序運行過程中可能出現(xiàn)的非正常狀態(tài)紧憾,
運行時異常表示虛擬機的通常操作中可能遇到的異常到千,是一種常見運行錯誤,只要程序設(shè)計得沒有問題通常就不會發(fā)生赴穗。
受檢異常跟程序運行的上下文環(huán)境有關(guān)憔四,即使程序設(shè)計無誤,仍然可能因使用的問題而引發(fā)般眉。
Java編譯器要求方法必須聲明拋出可能發(fā)生的受檢異常了赵,但是并不要求必須聲明拋出未被捕獲的運行時異常。
異常和繼承一樣甸赃,是面向?qū)ο蟪绦蛟O(shè)計中經(jīng)常被濫用的東西柿汛,神作《Effective Java》中對異常的使用給出了以下指導(dǎo)原則:
== 不要將異常處理用于正常的控制流(設(shè)計良好的API不應(yīng)該強迫它的調(diào)用者為了正常的控制流而使用異常)
== 對可以恢復(fù)的情況使用受檢異常,對編程錯誤使用運行時異常
== 避免不必要的使用受檢異常(可以通過一些狀態(tài)檢測手段來避免異常的發(fā)生)
== 優(yōu)先使用標(biāo)準(zhǔn)的異常
== 每個方法拋出的異常都要有文檔
== 保持異常的原子性
== 不要在catch中忽略掉捕獲到的異常
49埠对、列出一些你常見的運行時異常络断?
ArithmeticException(算術(shù)異常)
ClassCastException (類轉(zhuǎn)換異常)
IllegalArgumentException (非法參數(shù)異常)
IndexOutOfBoundsException (下表越界異常)
NullPointerException (空指針異常)
SecurityException (安全異常)
50、final, finally, finalize 的區(qū)別?
final:修飾符(關(guān)鍵字)有三種用法:如果一個類被聲明為final鸠窗,意味著它不能再派生出新的子類妓羊,即不能被繼承,因此它和abstract是反義詞稍计。將變量聲明為final躁绸,可以保證它們在使用中不被改變,被聲明為final 的變量必須在聲明時給定初值臣嚣,而在以后的引用中只能讀取不可修改净刮。被聲明為final 的方法也同樣只能使用,不能在子類中被重寫硅则。
finally:通常放在try…catch的后面構(gòu)造總是執(zhí)行代碼塊淹父,這就意味著程序無論正常執(zhí)行還是發(fā)生異常,這里的代碼只要JVM不關(guān)閉都能執(zhí)行怎虫,可以將釋放外部資源的代碼寫在finally塊中暑认。
finalize:Object類中定義的方法,Java中允許使用finalize() 方法在垃圾收集器將對象從內(nèi)存中清除出去之前做必要的清理工作大审。這個方法是由垃圾收集器在銷毀對象時調(diào)用的蘸际,通過重寫finalize() 方法可以整理系統(tǒng)資源或者執(zhí)行其他清理工作。
結(jié)語:第一階段的50道Java面試題整理學(xué)習(xí)結(jié)束了徒扶,雖然不一定都會了粮彤,但至少對自己所掌握的知識有個了解了,有些知識不牢固,需要再好好看書復(fù)習(xí)导坟,為幾個月后的面試打基礎(chǔ)屿良!
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?2017.8.31 于華中科技大學(xué)