錯題集02
總結:
兩同兩小一大原則:
方法名相同,參數類型相同
子類返回類型小於等於父類方法返回類型,
子類拋出異常小於等於父類方法拋出異常,
子類訪問權限大於等於父類方法訪問權限。
本題是問關於接口,實現接口方法的約束和子類覆蓋父類方法的約束基本上是一樣的,但接口有一點特殊的地方是接口的方法默認是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對象和數組;常量池存放常量。方法區——方法中的局部變量,存放在方法運行時臨時建立的方法棧中,其隨著棧的銷毀而結束
總結:
這裏主要是有一點:
1 | Math.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
1 | Math.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