那些你曾錯過的Java題(一)

  • 2019 年 10 月 4 日
  • 筆記

1

/ 寫在前面的話 /

這個專題主要是寫一些我刷牛客網時遇到的一些錯題和一些有趣的題目,大家也可以跟我一起做做

1

1.下面屬於java包裝類的是?

A.String

B.Long

C.Character

D.Short

分析:

這應該是一個比較容易的題目了,但是也是得死記硬背的題,所以拿出來給大家記一記。

Java 語言是一個面向對象的語言,但是Java中的基本數據類型卻是不面向對象的,這在實際使用時存在很多的不便,為了解決這個不足,在設計類時為每個基本數據類型設計了一個對應的類進行代表,即包裝類。對應的基本類型和包裝類如下表:

答案:B,D

2

2.對於Java中異常的描述正確的是?

A.用throws定義了方法可能拋出的異常,那麼調用此方法時一定會拋出此異常。

B.如果try塊中沒有拋出異常,finally塊中的語句將不會被執行。

C.拋出異常意味著程式發生運行時錯誤,需要調試修改

D.Java中的可不檢測(unchecked)異常可能來自RuntimeException類或其子類。

分析:

A錯 在調用此方法的時候 也可以再次申明以將異常交由更高一級處理。

B錯 finally塊中的語句一定會被執行。除非catch塊中有System.exit(0)。對於finally確實值得深究,下次也寫篇文章來分析分析。

C錯 拋出異常不一定是運行時異常,也有可能是編譯時異常。這裡甩給大家一張圖:

這裡多講幾句,Exception(異常)是程式本身可以處理的異常。主要包含RuntimeException等運行時異常IOException,SQLException等非運行時異常

運行時異常包括:都是RuntimeException類及其子類異常,如NullPointerException(空指針異常)、IndexOutOfBoundsException(下標越界異常)等,這些異常是不檢查異常,程式中可以選擇捕獲處理,也可以不處理。這些異常一般是由程式邏輯錯誤引起的,程式應該從邏輯角度儘可能避免這類異常的發生。

運行時異常的特點是Java編譯器不會檢查它,也就是說,當程式中可能出現這類異常,即使沒有用try-catch語句捕獲它,也沒有用throws子句聲明拋出它,也會編譯通過。

非運行時異常(編譯異常) 包括:RuntimeException以外的異常,類型上都屬於Exception類及其子類。從程式語法角度講是必須進行處理的異常(try catch 或者拋出),如果不處理,程式就不能編譯通過。如IOException、SQLException等以及用戶自定義的Exception異常,一般情況下不自定義檢查異常。

D對 運行時異常的特點是Java編譯器不會檢查它。

答案:D

3

下列哪個說法是正確的?

A. ConcurrentHashMap使用synchronized關鍵字保證執行緒安全

B.HashMap實現了Collction介面

C.Array.asList方法返回java.util.ArrayList對象

D.SimpleDateFormat是執行緒不安全的

分析:

A選項中,ConcurrentHashMap 使用segment來分段和管理鎖,segment繼承自ReentrantLock,因此ConcurrentHashMap使用ReentrantLock來保證執行緒安全。

B中,HashMap定義規則如下:

public class HashMap<K,V>      extends AbstractMap<K,V>      implements Map<K,V>, Cloneable, Serializable

所以HasMap跟Collection沒啥關係!

C中,應該是Arrays.asList(),其將一個數組轉化為一個List對象,這個方法會返回一個ArrayList類型的對象, 這個ArrayList類並非java.util.ArrayList類,而是Arrays類的內部

D.特意去看了一下jdk,如圖:

官方說是不安全的

答案:D

4

java 中哪個關鍵字可以對對象加互斥鎖? A.transient B.synchronized C.serialize D.static

分析:

這題估計大家都會,但是拿出來主要是說說有一些修飾符具體有啥用的,給大家拓展拓展:

static 修飾符,用來創建類方法和類變數。

final 修飾符,用來修飾類、方法和變數,final 修飾的類不能夠被繼承,修飾的方法不能被繼承類重新定義,修飾的變數為常量,是不可修改的。

abstract 修飾符,用來創建抽象類和抽象方法。

synchronized 用於多執行緒的同步。用來給對象和方法或者程式碼塊加鎖,各執行緒互斥訪問。

volatile 修飾的成員變數在每次被執行緒訪問時,都強制從共享記憶體中重新讀取該成員變數的值。而且,當成員變數發生變化時,會強制執行緒將變化值回寫到共享記憶體。這樣在任何時刻,兩個不同的執行緒總是看到某個成員變數的同一個值。

serialize:Java 對象序列化為二進位文件。

transient:序列化的對象包含被 transient 修飾的實例變數時,java 虛擬機(JVM)跳過該特定的變數。

答案:B

5

1 .class Parent{  2. public float aFun(float a, float b) { }  3 .}  4 .class Child extends Parent{  5 .  6 .}

將以下哪種方法插入行5是不合法的?

A.float aFun(float a, float b){ }

B.public int aFun(int a, int b) { }

C.public float aFun(float p, float q){ }

D.private int aFun(int a, int b){ }

分析:

這個題主要是考察了方法的重寫,我們來扯一扯:

方法重寫應遵循「三同一小一大」原則

「三同」:即方法名相同,形參列表相同,返回值類型相同;

「一小」:子類方法聲明拋出的異常比父類方法聲明拋出的異常更小或者相等;

「一大」:子類方法的訪問修飾符應比父類方法更大或相等。

A選項是重寫,但是默認訪問修飾符比父類小,插入第五行編輯器會報錯。 default,默認的訪問許可權,也是可以省略的訪問許可權,它不僅能在設置了該許可權的類中訪問,也可以在同一包中的類或子類中訪問。意思就是只能由跟這個類在同一個包中的類來訪問,比private限制更少,但比protected限制更多。

B、D不是重寫。因為形參列表和返回值類型不同,不滿足「三同」。所以寫在第五行以普通方法對待,插入第五行沒有錯誤。

C選項滿足重寫的各項條件,是正確的重寫,所以插入第五行沒有錯誤。