1. 程式人生 > >錯題集02

錯題集02

except wid rst wrap 隨著 decimal gin dex order

技術分享圖片

總結:

兩同兩小一大原則:

方法名相同,參數類型相同

子類返回類型小於等於父類方法返回類型,
子類拋出異常小於等於父類方法拋出異常,
子類訪問權限大於等於父類方法訪問權限。

  1. 本題是問關於接口,實現接口方法的約束和子類覆蓋父類方法的約束基本上是一樣的,但接口有一點特殊的地方是接口的方法默認是public abstract,

所以在實現接口方法的時候,也必須使用public
2. “子類拋出異常小於等於父類方法拋出異常”——不管父類拋出何種異常,子類可以不拋出任何異常。同樣的,如果接口方法定義拋出某種異常,在實現這個接

口方法的時候,可以拋出小於等於接口方法異常的異常,也可以不拋出任何異常。

因此繼承之中,返回值類型有可能不同

技術分享圖片

總結:

A錯誤,類的實例方法是與該類的實例對象相關聯的,不能直接調用,只能通過創建超類的一個實例對象,再進行調用

B錯誤,當父類的類方法定義為private時,對子類是不可見的,所以子類無法調用

C錯誤,子類具體的實例方法對父類是不可見的,所以無法直接調用, 只能通過創建子類的一個實例對象,再進行調用

D正確,實例方法可以調用自己類中的實例方法

技術分享圖片

總結:

這道題裏方法中修改值都是修改形參的值,區別是一個通過形參修改堆值,而另一個僅僅只是修改形參。

詳細分析一下:

char[] ch = {'a','b','c'};是數組,數組存放在堆中,所以當方法通過形參修改值時會去堆中修改。當成員變量ch再去訪問時,堆中的值已經修改,所以輸出dbc。

而String str = new String("hello");會進行兩步操作:

1、先在堆中創建一個指定的對象"hello",並讓str引用指向該對象。

2、在常量池中 尋找或新建 一個”hello”,並讓堆中對象與之關聯。

所以當方法為形參賦值時(str="world";),只是為形參在常量池中新建一個”world”並引用,也只修改了形參,成員變量str本身未被修改。

所以,當new了除String以外的對象時,即便通過形參修改值也會去堆中修改。

所以,當String str = new String("hello");時產生了1-2個對象。

Java的棧、堆、常量池和方法區。

在jdk1.7已經將運行時常量池放入堆內存中了。棧存放引用;堆存放new對象和數組;常量池存放常量。方法區——方法中的局部變量,存放在方法運行時臨時建立的方法棧中,其隨著棧的銷毀而結束

技術分享圖片

總結:

這裏主要是有一點:

1Math.ceil(d1)

ceil 方法上有這麽一段註釋:If the argument value is less than zero but greater than -1.0, then the result is negative zero

如果參數小於0且大於-1.0,結果為 -0

1Math.floor(d1)

ceil 和 floor 方法 上都有一句話:If the argument is NaN or an infinity or positive zero or negative zero, then the result is the same as the argument,意思為:如果參數是 NaN、無窮、正 0、負 0,那麽結果與參數相同,

如果是 -0.0,那麽其結果是 -0.0

技術分享圖片

總結:

這題有兩個錯誤的地方,第一個錯誤是 wait() 方法要以 try/catch 包覆,或是擲出 InterruptedException 才行
因此答案就是因為缺少例外捕捉的 InterruptedException

第二個錯誤的地方是, synchronized 的目標與 wait() 方法的物件不相同,會有 IllegalMonitorStateException ,不過 InterruptedException 會先出現,所以這不是答案

最後正確的程式碼應該是這樣:
void waitForSignal() {

Object obj = new Object();

synchronized (obj) {

try {

obj.wait();

} catch (InterruptedException e) {

e.printStackTrace();

}

obj.notify();

}

}


錯題集02