Java日常練習(xí)題,每天進步一點點(12)
承蒙各位厚愛,我們一起每天進步一點點?。ㄊ髽诉x中空白處查看答案)
1、Which is the return type of the method main()?
正確答案: B
int
void
Boolean
static
題解:
main()方法的返回類型是什么?
public static void main(String[] args){
//代碼段
}
2、java中用()字指明繼承關(guān)系.用()關(guān)鍵字指明對接口的實現(xiàn)。
正確答案: B
implements extends
extends implements
extend implement
implement extend
題解:
考查關(guān)鍵字
extends表繼承父類
implements表是實現(xiàn)接口
3、順序執(zhí)行下列程序語句后,則b的值是()
String a=“Hello”;
String b=a.substring(0,2);
正確答案: C
Hello
Hel
He
null
題解:
substring[0,2),左閉右開(包含左邊的起始點,不包含結(jié)束點)
4、下面程序的輸出是什么?
package algorithms.com.guan.javajicu; public class TestDemo { public static String output = ””; public static void foo(inti) { try { if (i == 1) { throw new Exception(); } } catch (Exception e) { output += “2”; return ; } finally { output += “3”; } output += “4”; } public static void main(String[] args) { foo(0); foo(1); System.out.println(output); } }
正確答案: B
342
3423
34234
323
題解:
首先是foo(0),在try代碼塊中未拋出異常,finally是無論是否拋出異常必定執(zhí)行的語句,
所以 output += “3”;然后是 output += “4”;
執(zhí)行foo(1)的時候,try代碼塊拋出異常,進入catch代碼塊,output += “2”;
前面說過finally是必執(zhí)行的,即使return也會執(zhí)行output += “3”
由于catch代碼塊中有return語句,最后一個output += “4”不會執(zhí)行。
所以結(jié)果是3423
5、下面屬于JSP內(nèi)置對象的是?
正確答案: A B C D
out對象
response對象
application對象
page對象
題解:
JSP內(nèi)置對象有:
1.request對象
客戶端的請求信息被封裝在request對象中,通過它才能了解到客戶的需求,然后做出響應(yīng)。它是HttpServletRequest類的實例。
2.response對象
response對象包含了響應(yīng)客戶請求的有關(guān)信息,但在JSP中很少直接用到它。它是HttpServletResponse類的實例。
3.session對象
session對象指的是客戶端與服務(wù)器的一次會話,從客戶連到服務(wù)器的一個WebApplication開始,直到客戶端與服務(wù)器斷開連接為止。它是HttpSession類的實例.
4.out對象
out對象是JspWriter類的實例,是向客戶端輸出內(nèi)容常用的對象
5.page對象
page對象就是指向當(dāng)前JSP頁面本身,有點象類中的this指針,它是java.lang.Object類的實例
6.application對象
application對象實現(xiàn)了用戶間數(shù)據(jù)的共享,可存放全局變量。它開始于服務(wù)器的啟動,直到服務(wù)器的關(guān)閉,在此期間,此對象將一直存在;這樣在用戶的前后連接或不同用戶之間的連接中,可以對此對象的同一屬性進行操作;在任何地方對此對象屬性的操作,都將影響到其他用戶對此的訪問。服務(wù)器的啟動和關(guān)閉決定了application對象的生命。它是ServletContext類的實例。
7.exception對象
exception對象是一個例外對象,當(dāng)一個頁面在運行過程中發(fā)生了例外,就產(chǎn)生這個對象。如果一個JSP頁面要應(yīng)用此對象,就必須把isErrorPage設(shè)為true,否則無法編譯。他實際上是java.lang.Throwable的對象
8.pageContext對象
pageContext對象提供了對JSP頁面內(nèi)所有的對象及名字空間的訪問,也就是說他可以訪問到本頁所在的SESSION,也可以取本頁面所在的application的某一屬性值,他相當(dāng)于頁面中所有功能的集大成者,它的本 類名也叫pageContext。
9.config對象
config對象是在一個Servlet初始化時,JSP引擎向它傳遞信息用的,此信息包括Servlet初始化時所要用到的參數(shù)(通過屬性名和屬性值構(gòu)成)以及服務(wù)器的有關(guān)信息(通過傳遞一個ServletContext對象)
6、關(guān)于抽象類與接口,下列說法正確的有?
正確答案: A C
優(yōu)先選用接口,盡量少用抽象類
抽象類可以被聲明使用,接口不可以被聲明使用
抽象類和接口都不能被實例化。
以上說法都不對
題解:
java只是單繼承,但是可以實現(xiàn)多個接口,繼承的耦合性太強,java推薦高內(nèi)聚低耦合的設(shè)計思路,不推薦使用繼承。在用繼承的情況下,如果還必須要繼承另外的接口會很麻煩,盡量用接口,這樣在你必須要用到繼承的時候就可以用了。抽象類和接口都不能被實例化。接口沒有構(gòu)造方法,不能被實例化,但是抽象方法可以有構(gòu)造方法,不過不是用來實例化對象的,是用來初始化的。
1.一個子類只能繼承一個抽象類,但能實現(xiàn)多個接口
2.抽象類可以有構(gòu)造方法,接口沒有構(gòu)造方法
3.抽象類可以有普通成員變量,接口沒有普通成員變量
4.抽象類和接口都可有靜態(tài)成員變量,抽象類中靜態(tài)成員變量訪問類型任意,接口只能public static final(默認)
5.抽象類可以沒有抽象方法,抽象類可以有普通方法,接口中都是抽象方法
6.抽象類可以有靜態(tài)方法,接口不能有靜態(tài)方法
7.抽象類中的方法可以是public、protected;接口方法只有public
7、下面哪些寫法能在 java8 中編譯執(zhí)行()
正確答案: A D
dir.listFiles((File f)->f.getName().endsWith(“.Java”));
dir.listFiles((File f)=>f.getName().endsWith(“.Java”));
dir.listFiles((_.getName().endsWith(“.Java”)));
dir.listFiles( f->f.getName().endsWith(“.Java”));
題解:
Lanbda表達式的主要作用就是代替匿名內(nèi)部類的繁瑣語法, 它由三部分組成:
(1) 形參列表。形參列表允許省略形參類型。如果形參列表中只有一個參數(shù),甚至連形參列表的圓括號也可以省略。
(2) 箭頭(→)。必須通過英文中畫線和大于符號組成。
(3)代碼塊。如果代碼塊只包含一條語句,Lambda表達式允許省略代碼塊的花括號,那么那條語句就不要用花括號表示語句結(jié)束。Lambda代碼塊只有一條return語句,甚至可以省略return關(guān)鍵字。Lambda表達式需要返回值,而它的代碼塊中僅有一套省略了return的語句。Lambda表達式會自動返回這條語句的值。
由此可見,應(yīng)該是A和D正確。
8、Java是一門支持反射的語言,基于反射為Java提供了豐富的動態(tài)性支持,下面關(guān)于Java反射的描述,哪些是錯誤的:( )
正確答案: A D F
A Java反射主要涉及的類如Class, Method, Filed,等,他們都在java.lang.reflet包下
B 通過反射可以動態(tài)的實現(xiàn)一個接口,形成一個新的類,并可以用這個類創(chuàng)建對象,調(diào)用對象方法
C 通過反射,可以突破Java語言提供的對象成員、類成員的保護機制,訪問一般方式不能訪問的成員
D Java反射機制提供了字節(jié)碼修改的技術(shù),可以動態(tài)的修剪一個類
E Java的反射機制會給內(nèi)存帶來額外的開銷。例如對永生堆的要求比不通過反射要求的更多
F Java反射機制一般會帶來效率問題,效率問題主要發(fā)生在查找類的方法和字段對象,因此通過緩存需要反射類的字段和方法就能達到與之間調(diào)用類的方法和訪問類的字段一樣的效率
題解:
A:java.lang.reflect包中的Field、Method、Constructor,分別用于描述類的與、方法和構(gòu)造器。A中的Class類在java.lang中,錯;
B:動態(tài)代理可以通過接口與類實現(xiàn),通過反射形成新的代理類,這個代理類增強了原來類的方法。對;
C:反射可以強制訪問private類型的成員,對;
D:反射并不能對類進行修改,只能對類進行訪問,錯;
E:反射機制對永生堆要求較多,對;
F:即使使用緩存,反射的效率也比調(diào)用類的方法低,錯;
9、以下哪種JAVA得變量聲明方式可以避免程序在多線程競爭情況下讀到不正確的值( )
正確答案: A B
volatile
static volatile
synchronized
static
題解:
synchronized不是修飾變量的,它修飾方法或代碼塊或?qū)ο?br /> synchronized修飾的對象有幾種:
1、修飾一個類:其作用的范圍是synchronized后面括號括起來的部分,作用的對象是這個類的所有對象;
2、修飾一個方法:被修飾的方法稱為同步方法,其作用的范圍是整個方法,作用的對象是調(diào)用這個方法的對象;
3、修飾一個靜態(tài)的方法:其作用的范圍是整個方法,作用的對象是這個類的所有對象;
4、修飾一個代碼塊:被修飾的代碼塊稱為同步語句塊,其作用范圍是大括號{}括起來的代碼塊,作用的對象是調(diào)用這個代碼塊的對象;
首先需要理解線程安全的兩個方面:執(zhí)行控制和內(nèi)存可見。
執(zhí)行控制的目的是控制代碼執(zhí)行(順序)及是否可以并發(fā)執(zhí)行。
內(nèi)存可見控制的是線程執(zhí)行結(jié)果在內(nèi)存中對其它線程的可見性。根據(jù)Java內(nèi)存模型的實現(xiàn),線程在具體執(zhí)行時,會先拷貝主存數(shù)據(jù)到線程本地(CPU緩存),操作完成后再把結(jié)果從線程本地刷到主存。
synchronized關(guān)鍵字解決的是執(zhí)行控制的問題,它會阻止其它線程獲取當(dāng)前對象的監(jiān)控鎖,這樣就使得當(dāng)前對象中被synchronized關(guān)鍵字保護的代碼塊無法被其它線程訪問,也就無法并發(fā)執(zhí)行。更重要的是,synchronized還會創(chuàng)建一個內(nèi)存屏障,內(nèi)存屏障指令保證了所有CPU操作結(jié)果都會直接刷到主存中,從而保證了操作的內(nèi)存可見性,同時也使得先獲得這個鎖的線程的所有操作,都happens-before于隨后獲得這個鎖的線程的操作。
volatile關(guān)鍵字解決的是內(nèi)存可見性的問題,會使得所有對volatile變量的讀寫都會直接刷到主存,即保證了變量的可見性。這樣就能滿足一些對變量可見性有要求而對讀取順序沒有要求的需求。
使用volatile關(guān)鍵字僅能實現(xiàn)對原始變量(如boolen、 short 、int 、long等)操作的原子性,但需要特別注意, volatile不能保證復(fù)合操作的原子性,即使只是i++,實際上也是由多個原子操作組成:read i; inc; write i,假如多個線程同時執(zhí)行i++,volatile只能保證他們操作的i是同一塊內(nèi)存,但依然可能出現(xiàn)寫入臟數(shù)據(jù)的情況。
對于volatile關(guān)鍵字,當(dāng)且僅當(dāng)滿足以下所有條件時可使用:
1.對變量的寫入操作不依賴變量的當(dāng)前值,或者你能確保只有單個線程更新變量的值。
2.該變量沒有包含在具有其他變量的不變式中。
10、下列哪些操作會使線程釋放鎖資源?
正確答案: B C
sleep()
wait()
join()
yield()
題解:
1.sleep()方法
在指定時間內(nèi)讓當(dāng)前正在執(zhí)行的線程暫停執(zhí)行,但不會釋放“鎖標志”。sleep()使當(dāng)前線程進入阻塞狀態(tài),在指定時間內(nèi)不會執(zhí)行。
2.wait()方法
wait()的作用是讓當(dāng)前線程進入等待狀態(tài),同時,wait()也會讓當(dāng)前線程釋放它所持有的鎖。“直到其他線程調(diào)用此對象的 notify() 方法或 notifyAll() 方法”,當(dāng)前線程被喚醒(進入“就緒狀態(tài)”),通過wait()來通知對象內(nèi)置的monitor對象釋放,而且事實上因為這涉及對硬件底層的操作,所以wait()方法是native方法,底層是用C寫的。
3.join()方法
join()等待該線程終止。
等待調(diào)用join方法的線程結(jié)束,再繼續(xù)執(zhí)行。
join()有資格釋放資源其實是通過調(diào)用wait()來實現(xiàn)的(join()源碼中調(diào)用了wait())
主線程創(chuàng)建并啟動子線程,如果子線程中要進行大量的耗時運算,主線程往往將早于子線程結(jié)束之前結(jié)束。如果主線程想等待子線程執(zhí)行完成之后再結(jié)束,比如子線程處理一個數(shù)據(jù),主線程要取得這個數(shù)據(jù)中的值,就要用到 join() 方法
4.yield()方法
暫停當(dāng)前正在執(zhí)行的線程對象。
yield()只是使當(dāng)前線程重新回到可執(zhí)行狀態(tài),所以執(zhí)行yield()的線程有可能在進入到可執(zhí)行狀態(tài)后馬上又被執(zhí)行。
yield()只能使同優(yōu)先級或更高優(yōu)先級的線程有執(zhí)行的機會。
答案匯總:
1、正確答案: B
2、正確答案: B
3、正確答案: C
4、正確答案: B
5、正確答案: A B C D
6、正確答案: A C
7、正確答案: A D
8、正確答案: A D F
9、正確答案: A B
10、正確答案: B C
總結(jié)
本篇文章就到這里了,希望能給你帶來幫助,也希望您能夠多多關(guān)注腳本之家的更多內(nèi)容!
相關(guān)文章
為什么Spring和IDEA都不推薦使用 @Autowired 注解
本文主要介紹了為什么Spring和IDEA都不推薦使用 @Autowired 注解,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2022-04-04SpringBoot獲取HttpServletRequest的3種方式總結(jié)
這篇文章主要給大家介紹了關(guān)于SpringBoot獲取HttpServletRequest的3種方式,在Spring boot項目中經(jīng)常要用到Servlet的常用對象如HttpServletRequest request,HttpServletResponse response,HttpSession session,需要的朋友可以參考下2023-08-08