萌新卷妹帶你攻略java選擇題【2】
👩💻部落格首頁:京與舊鋪的部落格首頁
✨歡迎關注🖱點贊🎀收藏⭐留言✒
🔮本文由京與舊鋪原創
😘系列專欄:java學習
👕參考網站:牛客網
💻首發時間:🎞2022年10月9日🎠
🎨你做三四月的事,八九月就會有答案,一起加油吧
🀄如果覺得部落客的文章還不錯的話,請三連支援一下部落客哦
🎧最後的話,作者是一個新人,在很多方面還做的不好,歡迎大佬指正,一起學習哦,沖沖沖
💬推薦一款模拟面試、刷題神器
👉點選進入網站
🛒導航小助手🎪
第一題
關于JDK1.8中Java的抽象類、接口,以下描述錯誤的是?
正确答案: C 你的答案: D (錯誤)
抽象類不一定含有抽象方法,接口中的方法都是抽象方法
一個類隻能繼承一個抽象類,但可以實作多個接口;一個接口可以繼承多個接口
抽象類和接口中的方法都沒有方法體
抽象類可以含有私有成員變量,接口不含有私有成員變量
複制代碼
選擇C。
A----------抽象類不一定含有抽象方法,接口中的方法都是抽象方法。
接口中的方法預設修飾符有public abstract。 B----------一個類隻能繼承一個一個抽象類,但可以實作多個接口;一個接口可以繼承多個接口。 Java裡類是單繼承的,接口是可以多繼承的,用關鍵字extends。 C----------抽象類和接口中的方法都沒有方法體。 抽象類中的方法是可以有方法體的。JDK1.8之後,接口中的方法也可以有方法體,用default關鍵字修飾方法。 D----------抽象類可以含有私有成員變量,接口不含有私有成員變量。 接口中的成員變量都是public static final的,一般用作常量。
第二題
Thread. sleep()是否會抛出checked exception?
正确答案: A 你的答案: B (錯誤)
會
不會
checked exception:指的是編譯時異常,該異常需要本函數必須處理的,不能忽略,用try和catch處理,或者throws抛出異常,然後交給調用者處理
runtiThread.sleep() 和 Object.wait(),都可以抛出 InterruptedException。這個異常是不能忽略的,因為它是一個檢查異常(checked exception)me exception:指的是運作時異常,該類一場不必須本函數必須處理,當然也可以不處理
第三題
下面關于垃圾收集的說法正确的是
正确答案: D 你的答案: B (錯誤)
一旦一個對象成為垃圾,就立刻被收集掉。
對象空間被收集掉之後,會執行該對象的finalize方法
finalize方法和C++的析構函數是完全一回事情
一個對象成為垃圾是因為不再有引用指着它,但是線程并非如此
1、在java中,對象的記憶體在哪個時刻回收,取決于垃圾回收器何時運作。
2、 一旦垃圾回收器準備好釋放對象占用的存儲空間,将首先調用其finalize()方法, 并且在下一次垃圾回收動作發生時,才會真正的回收對象占用的記憶體(《java 程式設計思想》)
3、* 在C++中,對象的記憶體在哪個時刻被回收,是可以确定的,* 在C++中,析構函數和資源的釋放息息相關,能不能正确處理析構函數,關乎能否正确回收對象記憶體資源。****
**在java中,對象的記憶體在哪個時刻回收,取決于垃圾回收器何時運作, 在java中,所有的對象,包括對象中包含的其他對象,它們所占的記憶體的回收都依靠垃圾回收器,是以不需要一個函數如C++析構函數那樣來做必要的垃圾回收工作。當然存在本地方法時需要finalize()方法來清理本地對象。在《java程式設計思想》中提及,finalize()方法的一個作用是用來回收“本地方法”中的本地對象
4、“ 但是線程并非如此”不了解,希望大佬補充
第四題
以下 _ 不是 Object 類的方法
正确答案: D 你的答案: B (錯誤)
clone()
finalize()
toString()
hasNext()
hasNext()是疊代器的
第五題
以下代碼将列印出
public static void main(String args[]) {
List Listlist1 = new ArrayList();
Listlist1.add(0);
List Listlist2 = Listlist1;
System.out.println(Listlist1.get(0) instanceof Integer);
System.out.println(Listlist2.get(0) instanceof Integer);
}
正确答案: B 你的答案: C (錯誤)
編譯錯誤
true true
true false
false false
解析
B.collection類型的集合(ArrayList,LinkedList)隻能裝入對象類型的資料,該題中裝入了0,是一個基本類型,但是JDK5以後提供了自動裝箱與自動拆箱,是以int類型自動裝箱變為了Integer類型。編譯能夠正常通過。将list1的引用指派給了list2,那麼list1和list2都将指向同一個堆記憶體空間。instanceof是Java中關鍵字,用于判斷一個對象是否屬于某個特定類的執行個體,并且傳回boolean類型的傳回值。顯然,list1.get(0)和list2.get(0)都屬于Integer的執行個體
第六題
Integer a = 1;
Integer b = 1;
Integer c = 500;
Integer d = 500;
System.out.print(a == b);
System.out.print(c == d);
上述代碼傳回結果為:
正确答案: B 你的答案: D (錯誤)
true、true
true、false
false、true
false、false
Integer類型在-128–>127範圍之間是被緩存了的,也就是每個對象的記憶體位址是相同的,指派就直接從緩存中取,不會有新的對象産生,而大于這個範圍,将會重新建立一個Integer對象,也就是new一個對象出來,當然位址就不同了,也就!=;
第七題
關于下列程式段的輸出結果,說法正确的是:( )
public class MyClass{
static int i;
public static void main(String argv[]){
System.out.println(i);
}
}
正确答案: D 你的答案: A (錯誤)
有錯誤,變量i沒有初始化。
null
1
類變量在不設定初始值時,會進行預設值指派,而局部方法中聲明的變量則必須進行初始化,他不會進行預設值指派。
第八題
以下代碼執行的結果顯示是多少( )?
正确答案: D 你的答案: B (錯誤)
true,false,true
false,true,false
true,true,false
false,false,true
其實當我們在為Integer指派的時候,java編譯器會将其翻譯成調用valueOf()方法。比如Integer i=127翻譯為Integer i=Integer.valueOf(127)
然後我們來看看valueOf()函數的源碼:
public static Integer valueOf(int i)
{
//high為127
if(i >= -128 && i <= IntegerCache.high)
return IntegerCache.***[i + 128];
else
return new Integer(i);
}
可以看出,對于-128到127之間的數,Java會對其進行緩存。而超出這個範圍則建立一個對象。
是以現在回到這道問題
i1和i2為128,超出範圍,是以都需要建立對象,對象比較為false;
i5和i6為100,在範圍之内,在執行Integer i5=100時,就會直接緩存到記憶體中,但執行執行Integer i6=100時,就直接從緩存裡取,而不需要建立對象,是以為true。
第九題
下面叙述那個是正确的?()
正确答案: B 你的答案: A (錯誤)
java中的集合類(如Vector)可以用來存儲任何類型的對象,且大小可以自動調整。但需要事先知道所存儲對象的類型,才能正常使用。
在java中,我們可以用違例(Exception)來抛出一些并非錯誤的消息,但這樣比直接從函數傳回一個結果要更大的系統開銷。
java接口包含函數聲明和變量聲明。
java中,子類不可以通路父類的私有成員和受保護的成員。
我就說下B選項和C選項。 B選項說的情況就是我們自定義異常的情況,請仔細讀:我們可以用違例(Exception)來抛出一些并非錯誤的消息,可以,并非錯誤的消息。比如我自定義一個異常,若一個變量大于10就抛出一個異常,這樣就對應了B選項說的情況,我用抛出異常說明這個變量大于10,而不是用一個函數體(函數體内判斷是否大于10,然後傳回true或false)判斷,因為函數調用是入棧出棧,棧是在寄存器之下的速度最快,且占的空間少,而自定義異常是存在堆中,肯定異常的記憶體開銷大! 是以B對。 C選項說的是接口包含方法聲明和變量聲明。因為接口中方法預設是 abstract public,是以在接口隻寫函數聲明是符合文法規則。但是變量預設是用public final static 修飾的,意思它是靜态常量,常量不管在接口中還是類中必須在聲明時初始化! 是以C的後半句是錯的,必須在聲明時并給出初始化!
第十題
關于多線程和多程序,下面描述正确的是():
正确答案: A C 你的答案: C D (錯誤)
多程序裡,子程序可獲得父程序的所有堆和棧的資料;而線程會與同程序的其他線程共享資料,擁有自己的棧空間。
線程因為有自己的獨立棧空間且共享資料,所有執行的開銷相對較大,同時不利于資源管理和保護。
線程的通信速度更快,切換更快,因為他們在同一位址空間内。
一個線程可以屬于多個程序。
A. 子程序得到的是除了代碼段是與父程序共享以外,其他所有的都是得到父程序的一個副本,子程序的所有資源都繼承父程序,得到父程序資源的副本,子程序可獲得父程序的所有堆和棧的資料,但二者并不共享位址空間。兩個是單獨的程序,繼承了以後二者就沒有什麼關聯了,子程序單獨運作;程序的線程之間共享由程序獲得的資源,但線程擁有屬于自己的一小部分資源,就是棧空間,儲存其運作狀态和局部自動變量的。
B. 線程之間共享程序獲得的資料資源,是以開銷小,但不利于資源的管理和保護;而程序執行開銷大,但是能夠很好的進行資源管理和保護。
C. 線程的通信速度更快,切換更快,因為他們共享同一程序的位址空間。
D. 一個程序可以有多個線程,線程是程序的一個實體,是CPU排程的基本機關。
第十一題
下面哪些情況會引發異常:
正确答案: A B C 你的答案: A B C D (錯誤)
數組越界
指定URL不存在
使用throw語句抛出
使用throws語句
關于throws 是不是可以了解為 異常不是throws引發的,而是用來防範出現異常的
第十二題
下面有關值類型和引用類型描述正确的是()?
正确答案: A B C 你的答案: B D (錯誤)
值類型的變量指派隻是進行資料複制,建立一個同值的新對象,而引用類型變量指派,僅僅是把對象的引用的指針指派給變量,使它們共用一個記憶體位址。
值類型資料是在棧上配置設定記憶體空間,它的變量直接包含變量的執行個體,使用效率相對較高。而引用類型資料是配置設定在堆上,引用類型的變量通常包含一個指向執行個體的指針,變量通過指針來引用執行個體。
引用類型一般都具有繼承性,但是值類型一般都是封裝的,是以值類型不能作為其他任何類型的基類。
值類型變量的作用域主要是在棧上配置設定記憶體空間内,而引用類型變量作用域主要在配置設定的堆上。
我的了解(有錯麻煩大家指正,謝謝!)
值類型:基本資料類型(int、double、boolean …) 引用類型:reference類型,通過它可以直接或間接的查找到對象在java堆中資料存放的起始位址或索引(對象在java堆中的哪個位置)
先來兩個例子,變量的指派在記憶體中是怎麼樣的:
先上一張運作時資料區的網圖
局部變量表、操作數棧在虛拟機棧中
一:基本變量的指派
public void method() {
int a = 1;
int b = a;
}
該方法的位元組碼:
0 iconst_1 // 将 int 型 1 推送至操作數棧棧頂
1 istore_1 // 将操作數棧棧頂 int 型值存入第二個本地變量
2 iload_1 // 将第二個int型本地變量推送至操作數棧頂
3 istore_2 // 将操作數棧棧頂 int 型值存入第三個本地變量
4 return // 方法傳回
二:基本變量的指派
public void method2() {
Object a = new Object();
Object b = a;
}
該方法的位元組碼:
0 new #15 <java/lang/Object> // 建立一個對象,并将其引用壓入棧頂
3 dup // 複制棧頂引用類型資料并将其值壓入棧頂
4 invokespecial #1 <java/lang/Object.> // 執行對象構造方法(使用了棧頂引用類型)
7 astore_1 // 将操作數棧棧頂引用類型資料值存入第二個本地變量 a
8 aload_1 // 将第二個引用類型本地變量推送至棧頂
9 astore_2 // 将棧頂引用類型數值存入第三個本地變量b
10 return // 方法傳回
再看選項
A(✔):值類型的和引用類型的變量指派就像上面一樣,先把局部變量表中 a 的數值存入操作數棧,再取出來放入 b,不過差別在于:
前者在局部變量表中存放的數值是真正意義上的 a 代表的資料,是以說指派操作是“複制(iload_1、istore_2)”一份出來再給 b
後者在局部變量表中存放的數值不是真正意義上 a 代表的資料,隻是指向堆中對象的指針(指向 a 真正代表的資料)。指派操作隻是把 a 中數值即指針複制給 b ,堆中a代表正真的資料即對象(0x11)并沒有被複制
B(✔):
“值類型資料是在棧(指虛拟機棧)上配置設定記憶體空間,它的變量直接包含變量的執行個體,使用效率相對較高。” :局部變量表(在虛拟機棧中) 中存放數值的就是真正意義上的資料,不用通路堆,效率較高
“而引用類型資料是配置設定在堆上,引用類型的變量通常包含一個指向執行個體(指向堆中對象)的指針,變量通過指針來引用執行個體。” :局部變量表中存放的數值是指向堆中資料(對象)的指針
C(✔):類可以繼承,基本資料類型不能繼承
D(X):“值類型變量的作用域主要是在棧上配置設定記憶體空間内”:如果是跟上訴一緻在方法内定義的基本變量,它的作用域就在棧中;如果是在類中定義的成員變量例如 Class A 中有成員變量 int val,這個類的執行個體在堆中,那麼 val 作用域也在堆中