Java日常練習題,每天進步一點點(9)
承蒙各位厚愛,我們一起每天進步一點點!(鼠標選中空白處查看答案)
1、“先進先出”的容器是:( )
正確答案: B
堆棧(Stack)
隊列(Queue)
字符串(String)
迭代器(Iterator)
題解:
堆棧:先進後出
隊列:先進先出
2、不考慮反射機制,一個子類顯式調用父類的構造器必須用super關鍵字。( )
正確答案: A
正確
錯誤
題解:
java中的super關鍵詞
super用於代表子類的直接父類的特征
super可以訪問:
父類的成員變量,成員方法,構造方法
使用super關鍵詞的情況:
在子類中,存在與父類相同的屬性和方法,由於訪問子類中屬性和方法的優先級高於父類,可以通過super關鍵詞來訪問父類中的屬性和方法
在子類中,可以通過super關鍵詞來顯示的調用父類的構造方法
子類的構造方法默認調用父類的無參構造方法,當父類中不存在無參構造方法時,可以通過super來調用父類的有參構造芳法來避免編譯時錯誤。
3、以下是java concurrent包下的4個類,選出差別最大的一個
正確答案: C
Semaphore
ReentrantLock
Future
CountDownLatch
題解:
A、Semaphore:類,控制某個資源可被同時訪問的個數;
B、ReentrantLock:類,具有與使用synchronized方法和語句所訪問的隱式監視器鎖相同的一些基本行為和語義,但功能更強大;
C、 Future:接口,表示異步計算的結果;
D、 CountDownLatch: 類,可以用來在一個線程中等待多個線程完成任務的類。
4、判斷對錯。在java的多態調用中,new的是哪一個類就是調用的哪個類的方法。
正確答案: B
對
錯
題解:
java多態有兩種情況:重載和覆寫
在覆寫中,運用的是動態單分配,是根據new的類型確定對象,從而確定調用的方法;
在重載中,運用的是靜態多分派,即根據靜態類型確定對象,因此不是根據new的類型確定調用的方法
5、下面屬於java引用類型的有?
正確答案: A D
String
byte
char
Array
題解:
首先說一下,A選項的String應該首字母大寫,小寫是錯的
java中除瞭基本數據類型都是引用數據類型
java中的基本數據類型如下
byte
shot
int
long
float
double
char
boolean
除此之外都是引用類型
6、有以下程序段, 則下面正確的選項是()
public class MyThead extends Thread{ public static void main(String[] args) { MyThead t=new MyThead(); MyThead s=new MyThead(); t.start(); System.out.println("one."); s.start(); System.out.println("two."); } public void run() { System.out.println("Thread"); } }
正確答案: B C D
A:編譯失敗
B:程序運行可能結果為:
one.
Thread
two.
Thread
C:程序運行可能結果是:
one.
two.
Thread
Thread
D:程序運行結果不穩定
題解:
start()是開啟線程,等待獲得時間片,一到獲得時間片就執行。所以可能一開啟就獲得瞭時間片執行,也有可能等到two輸出後才獲得瞭時間片。所以BC都可能,所以D也正確。
7、往OuterClass類的代碼段中插入內部類聲明, 哪一個是錯誤的:
public class OuterClass{
private float f=1.0f;
//插入代碼到這裡
}
正確答案: A B C D
A:class InnerClass{
public static float func(){return f;}
}
B:abstract class InnerClass{
public abstract float func(){}
}
C:static class InnerClass{
protected static float func(){return f;}
}
D:public class InnerClass{
static float func(){return f;}
}
題解:
主要考核瞭這幾個知識點:
1.靜態內部類才可以聲明靜態方法
2.靜態方法不可以使用非靜態變量
3.抽象方法不可以有函數體
靜態方法不能訪問非靜態變量,A和C錯;
抽象類中的抽象方法不能有方法體,B錯;
一個類中有多個類聲明時,隻能有一個public類,D錯
8、Java.Thread的方法resume()負責重新開始被以下哪個方法中斷的線程的執行()。
正確答案: D
stop
sleep
wait
suspend
題解:
這道題太老瞭,suspend 和 resume 從 1.2 就棄用瞭。
suspend() 和 resume() 方法:兩個方法配套使用,suspend()使得線程進入阻塞狀態,並且不會自動恢復,必須其對應的 resume() 被調用,才能使得線程重新進入可執行狀態
線程的五大狀態及其轉換:
resume與suspended一起使用 wait與notify(notifyAll)一起使用 sleep會讓線程暫時不執行 suspend() 和 resume() 方法:兩個方法配套使用,suspend()使得線程進入阻塞狀態,並且不會自動恢復,必須其對應的 resume() 被調用,才能使得線程重新進入可執行狀態。
線程從創建、運行到結束總是處於下面五個狀態之一:新建狀態、就緒狀態、運行狀態、阻塞狀態及死亡狀態。
1.新建狀態(New): 當用new操作符創建一個線程時, 例如new Thread ( r),線程還沒有開始運行,此時線程處在新建狀態。 當一個線程處於新生狀態時,程序還沒有開始運行線程中的代碼
2.就緒狀態(Runnable)
一個新創建的線程並不自動開始運行,要執行線程,必須調用線程的start()方法。
當線程對象調用start()方法即啟動瞭線程,start()方法創建線程運行的系統資源,
並調度線程運行run()方法。當start()方法返回後,線程就處於就緒狀態。
處於就緒狀態的線程並不一定立即運行run()方法,線程還必須同其他線程競爭CPU
時間,隻有獲得CPU時間才可以運行線程。因為在單CPU的計算機系統中,不可能
同時運行多個線程,一個時刻僅有一個線程處於運行狀態。因此此時可能有多個
線程處於就緒狀態。對多個處於就緒狀態的線程是由Java運行時系統的線程調度
程序(thread scheduler)來調度的。
3.運行狀態(Running)
當線程獲得CPU時間後,它才進入運行狀態,真正開始執行run()方法.
4.阻塞狀態(Blocked)
線程運行過程中,可能由於各種原因進入阻塞狀態: 1>線程通過調用sleep方法進入睡眠狀態; 2>線程調用一個在I/O上被阻塞的操作,即該操作在輸入輸出操作完成之前不會返回到它的調用者; 3>線程試圖得到一個鎖,而該鎖正被其他線程持有; 4>線程在等待某個觸發條件; …
所謂阻塞狀態是正在運行的線程沒有運行結束,暫時讓出CPU,這時其他處於就緒狀態的線程就可以獲得CPU時間, 進入運行狀態。
5.死亡狀態(Dead)
有兩個原因會導致線程死亡:
run方法正常退出而自然死亡,
一個未捕獲的異常終止瞭run方法而使線程猝死。 為瞭確定線程在當前是否存活著(就是要麼是可運行的,要麼是被阻塞瞭),需要使用isAlive方法。如果是 可運行或被阻塞,這個方法返回true; 如果線程仍舊是new狀態且不是可運行的, 或者線程死亡瞭, 則返回false.
9、下面關於面向對象的一些理解哪些是錯誤的( )
正確答案: C
A:面向對象的最重要的特性是支持繼承、封裝和多態
B:系統設計應該遵循開閉原則,系統應該穩定不不可修改,但應支持通過繼承、組合等方式進行擴展
C:函數式的語言必然是面向對象的語言
D:面向對象設計時,每個類的職責應該單一,不要再一個類中引入過多的接口
E:過程式語言和面向對象的語言各有其優勢,過程式語言更加靈活,面向對象語言更加強調抽象和封裝
F:Java和C++都是靜態類型的面向對象編程語言
題解:
C語言不是面向對象,但是函數式。
10、jvm中垃圾回收分為scanvenge gc和full GC,其中full GC觸發的條件可能有哪些
正確答案: C D E
A:棧空間滿
B:年輕代空間滿
C:老年代滿
D:持久代滿
E:System.gc()
題解:
Full GC是對整個堆進行整理,包括新生代、舊生代和持久代,速度比Scavenge GC慢,觸發的條件有:
(1)舊生代(老年代)被寫滿
(2)持久代被寫滿
(3)System.gc()
(4)上一次GC之後Heap的各域分配策略動態變化
答案匯總:
1、正確答案: B
2、正確答案: A
3、正確答案: C
4、正確答案: B
5、正確答案: A D
6、正確答案: B C D
7、正確答案: A B C D
8、正確答案: D
9、正確答案: C
10、正確答案: C D E
總結
本篇文章就到這裡瞭,希望能給你帶來幫助,也希望您能夠多多關註WalkonNet的更多內容!