天天看點

萌新卷妹帶你攻略java選擇題【2】

萌新卷妹帶你攻略java選擇題【2】

萌新卷妹帶你攻略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 作用域也在堆中