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 volatile 的理論實踐Java程式設計
- Java併發程式設計實戰Java程式設計
- Java併發程式設計實踐(Java concurrency in practice)線上示例學習Java程式設計
- 推薦閱讀Java併發性領域程式設計最值得一讀的力作《JAVA併發程式設計實踐》Java程式設計
- Java併發程式設計實戰--FutureTaskJava程式設計
- java 併發程式設計Java程式設計
- Java併發程式設計Java程式設計
- JAVA實現網路程式設計之併發程式設計Java程式設計
- 【Java併發程式設計】併發程式設計大合集-值得收藏Java程式設計
- Java併發程式設計實戰--Amdahl定律Java程式設計
- java-併發程式設計Java程式設計
- Java併發程式設計-CASJava程式設計
- Java併發程式設計:synchronizedJava程式設計synchronized
- Java 併發程式設計解析Java程式設計
- Java併發程式設計:LockJava程式設計
- Java併發程式設計---java規範與模式下的併發程式設計1.1Java程式設計模式
- Java併發程式設計-鎖及併發容器Java程式設計
- Java併發系列—併發程式設計挑戰Java程式設計
- Java併發程式設計實戰總結 (一)Java程式設計
- 《JAVA併發程式設計實戰》顯式鎖Java程式設計
- Java併發程式設計實戰(4)- 死鎖Java程式設計
- Java併發程式設計實戰——讀後感Java程式設計
- Java併發程式設計實戰--筆記三Java程式設計筆記
- Java併發程式設計實戰--筆記四Java程式設計筆記
- Java併發程式設計實戰--筆記二Java程式設計筆記
- Java併發程式設計實戰--this引用逸出Java程式設計
- Java併發程式設計實戰--筆記一Java程式設計筆記
- Java併發程式設計實戰--閉鎖 CountDownLatchJava程式設計CountDownLatch
- Java併發程式設計:Synchronized及其實現原理Java程式設計synchronized
- java併發程式設計系列:java併發程式設計背景知識Java程式設計
- 《java併發程式設計的藝術》併發底層實現原理Java程式設計
- Java併發程式設計實戰--事實不可變物件Java程式設計物件
- Java併發程式設計藝術Java程式設計