Java併發程式設計實踐-this溢位
《Java併發程式設計實踐》一書中,提到“在建構函式中呼叫一個可覆蓋的(那些既不是private,也不是final的)例項方法同樣會導致this引用在構造期間溢位。”,這句話讀來簡單,但是卻乾貨滿滿,這裡舉一個簡單的示例來進行說明。
ThisEscape類:
public class ThisEscape {
public ThisEscape() {
System.out.println("ThisEscape ");
// 在構造方法中其呼叫了非final和private的方法
Say();
}
public void Say() {
System.out.println("ThisEscape .Say()");
}
public static void main(String[] args) {
new ThisEscapeSon();
new ThisEscapeSon("Hello World");
}
}
ThisEscapeSon.class類
ThisEscapeSon繼承自ThisEscape類並且重寫了Say方法。
class ThisEscapeSon extends ThisEscape {
private final String name;
public ThisEscapeSon() {
this.name = "Hello Word";
System.out.println("ThisEscapeSon");
}
public ThisEscapeSon(String name) {
this.name = name;
System.out.println("ThisEscapeSon");
}
/*
* 在子類中重寫Say方法
*/
@Override
public void Say() {
System.out.println("ThisEscapeSon.Say()-->" + name);
}
}
執行結果
ThisEscape
ThisEscapeSon.Say()-->null
ThisEscapeSon
ThisEscape
ThisEscapeSon.Say()-->null
ThisEscapeSon
分析:無論是呼叫子類(ThisEscapeSon)的預設建構函式還是帶參構造器來例項化ThisEscapeSon例項,預設情況下它都會首先依次呼叫父類的無參構造方法(相當於建構函式第一行程式碼處呼叫父類的無參構造器)例項化父類,接著才會執行子類構造器的其他方法。
所以,當執行到父類ThisEscape構造器中執行Say()方法時,此時由於子類已經重寫了Say()方法,他就會呼叫子類的Say()方法,實際上,在這裡就可以預見this溢位的後果了,由於子類中的this.name
語句還沒有執行,所以,執行Say()方法時name
成員變數並沒有被賦值,所以會列印null
值。
總結:父類構造方法呼叫的非final、private方法,如果存在子類的情況下,對於該方法的執行就會具有不可預見性的問題,這在程式設計過程需要極度注意的。
修改方式:
1)將ThisEscape
的Say()
方法改成private
作用域,那麼,子類ThisEscapeSon
就不能重寫該方法,而只是重新定義了Say()
方法,此時,只會呼叫ThisEscape
的Say()
方法完成相應的功能。
2)將ThisEscape
的Say()
方法改成final
作用域,那麼,如果子類定義Say()
,就會報編譯器錯誤,從而防止類似不可以預見性事件的發生。
相關文章
- Java併發程式設計實踐Java程式設計
- Java併發程式設計 - 第十一章 Java併發程式設計實踐Java程式設計
- JAVA併發程式設計實踐 下載Java程式設計
- Golang 併發程式設計實踐Golang程式設計
- Java 併發程式設計實踐 讀書筆記四Java程式設計筆記
- java併發程式設計系列:java併發程式設計背景知識Java程式設計
- java 併發程式設計Java程式設計
- Java併發程式設計Java程式設計
- Java併發程式設計—ThreadLocalJava程式設計thread
- Java併發程式設計:synchronizedJava程式設計synchronized
- Java併發程式設計 -- ThreadLocalJava程式設計thread
- Java併發程式設計 -- ConditionJava程式設計
- Java併發程式設計——ThreadLocalJava程式設計thread
- java-併發程式設計Java程式設計
- Java 併發程式設計解析Java程式設計
- Java併發程式設計-CASJava程式設計
- Java併發程式設計:LockJava程式設計
- Java併發程式設計---java規範與模式下的併發程式設計1.1Java程式設計模式
- 《JAVA併發程式設計實戰》顯式鎖Java程式設計
- Java併發程式設計實戰總結 (一)Java程式設計
- Java併發程式設計實戰——讀後感Java程式設計
- Java併發程式設計實戰(4)- 死鎖Java程式設計
- Java併發程式設計-鎖及併發容器Java程式設計
- 《java併發程式設計的藝術》併發底層實現原理Java程式設計
- Java併發程式設計之synchronizedJava程式設計synchronized
- Java併發程式設計藝術Java程式設計
- Java併發程式設計基礎Java程式設計
- Java 併發程式設計 Executor 框架Java程式設計框架
- Java 併發程式設計要點Java程式設計
- 【Java併發程式設計】一、為什麼需要學習併發程式設計?Java程式設計
- 《JAVA併發程式設計實戰》任務執行Java程式設計
- 《JAVA併發程式設計實戰》取消和關閉Java程式設計
- 《JAVA併發程式設計實戰》物件的組合Java程式設計物件
- 實戰Java高併發程式設計模式視訊Java程式設計設計模式
- Java併發程式設計之Java CAS操作Java程式設計
- Java併發程式設計:Java執行緒Java程式設計執行緒
- Python併發程式設計:提高網頁抓取效率實踐指南Python程式設計網頁
- Java執行緒與併發程式設計實踐----額外的執行緒能力Java執行緒程式設計