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


