為什麼super(…)或this(…)呼叫語句只能作為建構函式中的第一句出現?
class A {
A()
{
System.out.println("You call super class non-args constructor!");
}
}
class B extends A {
B()
{
//這裡,編譯器將自動加上 super();
System.out.println("You call subclass constructor!");
}
B(String n)
{
super();
this();
//實際就是呼叫了B(){...},而在B(){...}中編譯器自動加上了
//super();這樣就相當於兩次呼叫了super();也就是說對父類進
//行了兩次初始化。而在例項化一個物件時,一個構造方法只能呼叫一次,這說明this和super不能同時存在一個構造方法中。
//同時因為系統沒有在第一行發現this()或super()呼叫,就會自動加上super(),如果沒有將this()和super()放在第一行就會產生矛盾。
//因為總有一個super()在第二句上。所以該程式不能透過編譯!!! }
結論 也就是說你必須在構造器的第一行放置super或者this構造器,否則編譯器會自動地放一個空引數的super構造器的,其他的構造器也可以呼叫super或者this,呼叫成一個遞迴構造鏈,最後的結果是父類的構造器(可能有多級父類構造器)始終在子類的構造器之前執行,遞迴的呼叫父類構造器。無法執行當前的類的構造器。也就不能例項化任何物件,這個類就成為一個無為類。
從另外一面說,子類是從父類繼承而來,繼承了父類的屬性和方法,如果在子類中先不完成父類的成員的初始化,則子類無法使用,應為在java中不允許呼叫沒初始化的成員。在構造器中是順序執行的,也就是說必須在第一行進行父類的初始化。而super能直接完成這個功能。This()透過呼叫本類中的其他構造器也能完成這個功能。
因此,this()或者super()必須放在第一行。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/30046312/viewspace-2143640/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- javascript return語句只能用於函式中JavaScript函式
- SQL語句為什麼不會共享(中)SQL
- 程式語言中為什麼使用分號作為語句結束符?
- 為什麼Python中沒有Switch/Case語句?Python
- SQL語句為什麼不會共享(上)SQL
- SQL語句為什麼不會共享(下)SQL
- 為什麼 Go 裡值為 nil 可以呼叫函式?Go函式
- SQL Server SQL語句中的函式呼叫與Oracle SQL語句函式呼叫一個有趣的差別SQLServer函式Oracle
- hibhibernate中hql中的語句where語句查詢List出現空
- javascript為什麼語句開頭就有一個分號JavaScript
- 語句開頭或者函式之前的分號(;)的作用是什麼函式
- 獲取物件的構建語句物件
- 執行緒join為什麼在解構函式中執行緒函式
- C++移動建構函式以及move語句簡單介紹C++函式
- Python中break語句和continue語句有什麼區別?Python
- 為什麼使用縮排來分組語句?15個為什麼,幫助你更好的理解Python!Python
- [譯] 為什麼我更喜歡物件而不是switch語句物件
- 在函式中執行DDL語句失敗函式
- javascript:建構函式模式(為什麼這種方式也可以建立物件)JavaScript函式模式物件
- Java 可以採用什麼語句跳出迴圈語句Java
- 行變列構建sql語句SQL
- 為什麼值型別不允許顯式定義無參建構函式型別函式
- 為什麼不建議函式有太多引數?函式
- [Mysql 查詢語句]——集合函式MySql函式
- sql語句之分組,聚合函式SQL函式
- Python中將函式作為另一個函式的引數傳入並呼叫Python函式
- 為什麼C語言的strcpy函式有漏洞(轉)C語言函式
- 建構函式之間的呼叫函式
- 建庫語句
- c# tcbs之建構函式呼叫建構函式示例C#函式
- SQL SERVER 中構建執行動態SQL語句SQLServer
- java switch語句是什麼?Java
- JavaScript的流程控制語句以及函式JavaScript函式
- Oracle:SYS_REFCURSOR作為函式中的輸出引數Oracle函式
- 為什麼 SQL 語句使用了索引,但卻還是慢查詢?SQL索引
- C++之類解構函式為什麼是虛擬函式C++函式
- Java的預設建構函式呼叫Java函式
- ASP中巧用Split()函式生成SQL查詢語句 (轉)函式SQL