不能錯過(guò)的關(guān)于面向對象的java筆試題
Java是一門(mén)面向對象的編程語(yǔ)言,不僅吸收了C++語(yǔ)言的各種優(yōu)點(diǎn),還摒棄了C++里難以理解的多繼承、指針等概念,因此Java語(yǔ)言具有功能強大和簡(jiǎn)單易用兩個(gè)特征。以下是小編整理的不能錯過(guò)的關(guān)于面向對象的java筆試題,歡迎查看。
不能錯過(guò)的面向對象的java筆試題 篇1
1)Java 中能創(chuàng )建 Volatile 數組嗎?
能,Java 中可以創(chuàng )建 volatile 類(lèi)型數組,不過(guò)只是一個(gè)指向數組的引用,而不是整個(gè)數組。我的意思是,如果改變引用指向的數組,將會(huì )受到 volatile 的保護,但是如果多個(gè)線(xiàn)程同時(shí)改變數組的元素,volatile 標示符就不能起到之前的保護作用了。
2)volatile 能使得一個(gè)非原子操作變成原子操作嗎?
一個(gè)典型的例子是在類(lèi)中有一個(gè) long 類(lèi)型的成員變量。如果你知道該成員變量會(huì )被多個(gè)線(xiàn)程訪(fǎng)問(wèn),如計數器、價(jià)格等,你最好是將其設置為 volatile。為什么?因為 Java 中讀取 long 類(lèi)型變量不是原子的,需要分成兩步,如果一個(gè)線(xiàn)程正在修改該 long 變量的值,另一個(gè)線(xiàn)程可能只能看到該值的一半(前 32 位)。但是對一個(gè) volatile 型的 long 或 double 變量的讀寫(xiě)是原子。
3)volatile 修飾符的有過(guò)什么實(shí)踐?
一種實(shí)踐是用 volatile 修飾 long 和 double 變量,使其能按原子類(lèi)型來(lái)讀寫(xiě)。double 和 long 都是64位寬,因此對這兩種類(lèi)型的讀是分為兩部分的,第一次讀取第一個(gè) 32 位,然后再讀剩下的 32 位,這個(gè)過(guò)程不是原子的,但 Java 中 volatile 型的 long 或 double 變量的讀寫(xiě)是原子的。volatile 修復符的另一個(gè)作用是提供內存屏障(memory barrier),例如在分布式框架中的應用。簡(jiǎn)單的說(shuō),就是當你寫(xiě)一個(gè) volatile 變量之前,Java 內存模型會(huì )插入一個(gè)寫(xiě)屏障(write barrier),讀一個(gè) volatile 變量之前,會(huì )插入一個(gè)讀屏障(read barrier)。意思就是說(shuō),在你寫(xiě)一個(gè) volatile 域時(shí),能保證任何線(xiàn)程都能看到你寫(xiě)的值,同時(shí),在寫(xiě)之前,也能保證任何數值的更新對所有線(xiàn)程是可見(jiàn)的,因為內存屏障會(huì )將其他所有寫(xiě)的值更新到緩存。
4)volatile 類(lèi)型變量提供什么保證?(答案)
volatile 變量提供順序和可見(jiàn)性保證,例如,JVM 或者 JIT為了獲得更好的性能會(huì )對語(yǔ)句重排序,但是 volatile 類(lèi)型變量即使在沒(méi)有同步塊的情況下賦值也不會(huì )與其他語(yǔ)句重排序。 volatile 提供 happens-before 的保證,確保一個(gè)線(xiàn)程的修改能對其他線(xiàn)程是可見(jiàn)的。某些情況下,volatile 還能提供原子性,如讀 64 位數據類(lèi)型,像 long 和 double 都不是原子的,但 volatile 類(lèi)型的 double 和 long 就是原子的。
5) 10 個(gè)線(xiàn)程和 2 個(gè)線(xiàn)程的同步代碼,哪個(gè)更容易寫(xiě)?
從寫(xiě)代碼的角度來(lái)說(shuō),兩者的復雜度是相同的,因為同步代碼與線(xiàn)程數量是相互獨立的。但是同步策略的選擇依賴(lài)于線(xiàn)程的數量,因為越多的線(xiàn)程意味著(zhù)更大的競爭,所以你需要利用同步技術(shù),如鎖分離,這要求更復雜的代碼和專(zhuān)業(yè)知識。
6)你是如何調用 wait方法的?使用 if 塊還是循環(huán)?為什么?(答案)
wait方法應該在循環(huán)調用,因為當線(xiàn)程獲取到 CPU 開(kāi)始執行的時(shí)候,其他條件可能還沒(méi)有滿(mǎn)足,所以在處理前,循環(huán)檢測條件是否滿(mǎn)足會(huì )更好。下面是一段標準的使用 wait 和 notify 方法的代碼:
The standard idiom for using the wait method
參見(jiàn) Effective Java 第 69 條,獲取更多關(guān)于為什么應該在循環(huán)中來(lái)調用 wait 方法的內容。
不能錯過(guò)的'面向對象的java筆試題 篇2
一、選擇題:(每題3分,共20題)
1. 下面關(guān)于類(lèi)的說(shuō)法錯誤的一項是( )。
A、類(lèi)屬于Java語(yǔ)言中的復合數據類(lèi)型 中的基本結構單位
C、類(lèi)是同種對象的集合和抽象
2. 如下所示代碼:
public class Test05_01{ }
private float a;
public static void m ( ){ }
D、類(lèi)就是對象 B、對象是Java語(yǔ)言
如何使成員變量a被方法m( )訪(fǎng)問(wèn)( )。
A、將private float a改為public float a
B、將private float a改為static float a
C、將private float a改為protected float a
D、將private float a改為float a
3. 下面關(guān)于類(lèi)的說(shuō)法有誤的一項是( )。
A、類(lèi)就是對象 抽象
C、類(lèi)屬于Java語(yǔ)言中的復合數據類(lèi)型 中的基本結構單位
D、對象是Java語(yǔ)言
B、類(lèi)是同種對象的集合和
關(guān)于Java面向對象的考試題。
4. 下列哪種類(lèi)成員修飾符修飾的變量只能在本類(lèi)中被訪(fǎng)問(wèn)( )。
A、protected
B、default
C、private
D、public
5. 下面關(guān)于方法的說(shuō)法不正確的一項是( )。
A、類(lèi)的私有方法不能被其他類(lèi)直接訪(fǎng)問(wèn)。
B、Java中的構造方法名必須和類(lèi)名相同。
C、方法體是對方法的實(shí)現,包括變量聲明和合法語(yǔ)句。
D、如果一個(gè)類(lèi)定義了構造方法,也可以用該類(lèi)的默認構造方法。
6. 下列程序的運行結果是( )。
public class Test05_02 extends x{ }
B、編譯錯誤
D、運行成功,但不輸出
int ab(){ }
public static void main(String[] args) { }
Test05_02 b = new Test05_02 (); b.ab(); static int a = 10; a++;
System.out.println(a);
A、10 C、11
關(guān)于Java面向對象的考試題。
7. 下面關(guān)于構造方法的描述有誤的一項是( )。
A、構造方法必須要有返回類(lèi)型的聲明。
B、構造方法和類(lèi)中的方法很相似:有訪(fǎng)問(wèn)修飾符、方法名、參數列表、方法體。
C、構造方法當成是一個(gè)特殊的方法,這個(gè)方法的作用就是用來(lái)產(chǎn)生一個(gè)類(lèi)的實(shí)例。
D、構造方法的方法名必須和類(lèi)名完全相同。
8. 下列關(guān)于對象的說(shuō)法錯誤的一項是( )。
A、對象成員是指一個(gè)對象所擁有的屬性或可以調用的方法。
B、由類(lèi)生成對象,稱(chēng)為類(lèi)的實(shí)例化過(guò)程,一個(gè)實(shí)例可以是多個(gè)對象。
C、在創(chuàng )建類(lèi)的對象時(shí),需要使用Java的new關(guān)鍵字。
D、在Java中要引用對象的屬性和方法,需要使用“.”操作符來(lái)實(shí)現。
9. 類(lèi)的方法可以不包含下面哪一項( )。
A、方法的參數 C、方法的名稱(chēng)
B、方法的主體 D、方法的返回值類(lèi)型
10. 下面關(guān)于變量說(shuō)法錯誤的一項是( )。
A、對于成員變量,我們可以不需要手動(dòng)的顯式初始化,因為系統在創(chuàng )建一個(gè)新的對象的時(shí)候,會(huì )給這些成員變量賦一個(gè)初值。
B、對于引用變量,它的默認初值是null而非相應的引用類(lèi)型對象,也就是說(shuō),它并不是指向任何對象的首地址。
關(guān)于Java面向對象的考試題。
C、系統會(huì )對全局(成員)變量指定默認的值,也會(huì )對局部變量賦值。
D、局部變量在使用之前,必須對其進(jìn)行顯式初始化。
11. 下面的各種數據類(lèi)型的默認初始化值表示錯誤的一項是( )。
A、int是0
B、float 是0.0
C、char 是‘u0000’
D、boolean是false
12. 下面哪一項不是Java的訪(fǎng)問(wèn)控制符( )。
A、public
B、private
C、void
D、protected
13. Java語(yǔ)言類(lèi)間的繼承關(guān)系和接口間的繼承關(guān)系分別是( )。
A、單繼承、不能繼承
C、多重繼承、單繼承
B、多重繼承、不能繼承
D、單繼承、多重繼承
14. 如果局部變量和成員變量同名,如何在局部變量作用域內引用成
員變量( )。
A、不影響,系統可以自己區分
B、不能引用,必須改名,使它們的名稱(chēng)不相同
C、在成員變量前加this,使用this訪(fǎng)問(wèn)該成員變量
D、在成員變量前加super,使用super訪(fǎng)問(wèn)該成員變量
15. 下列關(guān)于內部類(lèi)說(shuō)法錯誤的一項是( )。
A、內部類(lèi)可用private或protected修飾符修飾
B、內部類(lèi)不能有自己的成員方法和成員變量
C、除static內部類(lèi)外,不能在類(lèi)內聲明static成員
D、內部類(lèi)可以作為其他類(lèi)的成員,而且可訪(fǎng)問(wèn)它所在的類(lèi)的成員
16. 定義外部類(lèi)時(shí)不能用到的關(guān)鍵字是( )。
A、public
B、abstract
C、protected
D、final
17. 下面說(shuō)法不正確的一項是( )。
A、abstract和final能同時(shí)修飾一個(gè)類(lèi)
B、抽象類(lèi)既可以做父類(lèi),也可以做子類(lèi)
C、聲明為final類(lèi)型的方法不能在其子類(lèi)中重新定義
D、抽象類(lèi)中可以沒(méi)有抽象方法,有抽象方法的類(lèi)一定是抽象類(lèi)或接口
18. 有一個(gè)類(lèi)B,下面為其構造方法的聲明,正確的是( )。
A、void b(int x) {} C、B(int x) {}
B、void B(int x) {}
D、b(int x) {}
19. 區分類(lèi)中重載方法的依據是( )。
A、不同的形參名稱(chēng)
B、返回值的類(lèi)型不同
D、訪(fǎng)問(wèn)權限不同
C、形參列表的類(lèi)型和順序
20. 下面說(shuō)法錯誤的一項是( )。
A、在Java中,為了節省創(chuàng )建對象的時(shí)間和空間,對于一些常用的方法,會(huì )將它在內存中緩存起來(lái)。
B、在JDK中針對各種基本數據類(lèi)型分別定義相應的引用類(lèi)型,稱(chēng)之為封裝類(lèi)(Wrapper Classes)。
C、JDK5.0中,引入了自動(dòng)裝箱/拆箱功能,可以讓我們方便的在簡(jiǎn)單類(lèi)型和對應的封裝類(lèi)型數據之間轉換。
【不能錯過(guò)的關(guān)于面向對象的java筆試題】相關(guān)文章:
錯過(guò)應錯過(guò)的告白10-20
不能錯過(guò)的英語(yǔ)啟蒙讀后感范文(通用5篇)03-02
關(guān)于筆的的文學(xué)常識04-30
錯過(guò)的時(shí)間01-27