一個讓98%的Java程式員犯難的偏門問題

來源:互聯網
上載者:User
程式|程式員|問題   一個學員曾經問了我一個他在sun公司的論壇上看到的怪問題,因為這個問題一直沒有人解答,加之這個問題所涉及的知識有點偏門,所以,我斷言這個問題至少有98%的Java程式員不會!

  (之所以這麼斷言,是因為我遇到的高手和低手程式員,好像並沒有精力去研究那些瑣碎的細節,並且他們工作中似乎也不需要。如果你看到了這個問題,再去查書和思考,最終找出答案,在這之前也應該算不會,呵呵,另外,100個java程式員中有2個會這個,並不過分,現在已經有2000人看了這篇文章,至少應該有40個人會這個問題,大家不要看下面有幾個會的,就忽略了那些沒有發表意見的看客,我的98%不誇張)。

  如果你不會這個問題,並不代表你的水平比我低呵,因為這個問題只有我等孔乙幾才去擺弄,各位看了,就當消遣。

  問題:

public class Parent
{
 public void test()
 {}

 public Parent()
 {
  test();
 }

 public static void main(String[] args)
 {
  new Child();
 }
}

class Child extends Parent
{
 private int instanceValue = 20;
 public void test()
 {
  System.out.println("instance value is: " + instanceValue);
 }
}


  各位先猜猜列印的結果是多少呢?為什麼呢?

  ----------------------------------------------------------------

  答案:下面是摘自本人編寫的《Java就業培訓教程》中的一段講述,請大家注意第(4)步和第(5)步的講解,調用完父類的構造方法後,接著才進行成員變數的顯式初始化操作,上面代碼中的private int instanceValue = 20;定義應看成兩部分:第一部分是定義變數,第二部分是給變數賦值,變數定義位於父類構造方法之前,變數賦值位於父類構造方法之後。在父類的構造方法執行時,根據多態性,它會去調用子類中定義的test()方法,可是,這時候,子類中的成員變數還沒執行顯式初始化操作, 對於private int instanceValue = 20;定義,instanceValue 的值為預設的初始化值0,所以,這時候在test方法中列印出的值為0。

  4.1.3子類對象的執行個體化過程

  對於許多Java老手來說,子類對象的執行個體化過程也不見得非常清楚,你可能並不需要完全瞭解子類對象的執行個體化過程,但瞭解後還是有好處的。

  對象中的成員變數的初始化是按下述步驟進行的:

  (1)分配成員變數的儲存空間並進行預設的初始化,就是用new關鍵字產生對象後,對類中的成員變數按第三章的表3.1中的對應關係對對象中的成員變數進行初始化賦值。

  (2)綁定構造方法參數,就是new Person(實際參數列表)中所傳遞進的參數賦值給構造方法中的形式參數變數。

  (3)如有this()調用,則調用相應的重載構造方法(被調用的重載構造方法又從步驟2開始執行這些流程),被調用的重載構造方法的執行流程結束後,回到當前構造方法,當前構造方法直接跳轉到步驟(6)執行。(反正要去調用父類的建構函式,如果調用this,那麼this指向的建構函式就會去調用父類的建構函式,我這個建構函式本身就不用再調用父類的建構函式了,如果沒有調用this,那我這個建構函式就必須去調用父類的建構函式)

  (4)如有沒有this()調用,顯式或隱式追溯調用父類的構造方法(一直到Object類為止,Object是所有Java類的最頂層父類,/*在本章後面部分有詳細講解*/),父類的構造方法又從步驟2開始對父類執行這些流程,父類的構造方法的執行流程結束後,回到當前構造方法,當前構造方法繼續往下執行。

  (5)進行成員變數的顯式初始化操作,也就是執行在定義成員變數時就對其進行賦值的語句,如:

public Student extends Person
{
 String school = ”it315”;// 顯式初始化
 ……
}


  將“it315”賦值給school成員變數。

  (6)執行當前構造方法的方法體中的程式碼,如:

public Student extends Person
{
 public Student(String name,int age,String school)
 {
  super(name,age);
  this.school = school;
 }
}



相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.