回覆列表
  • 1 # 使用者3554711509254

    1.從物件的記憶體角度來理解.

    假設現在有一個父類Father,它裡面的變數需要佔用1M記憶體.有一個它的子類Son,裡面的變數需要佔用0.5M記憶體.

    現在透過程式碼來看看記憶體的分配情況:

    2.f = new Father();//系統將分配1M記憶體.

    Son s = new Son();//系統將分配1.5M記憶體!因為子類中有一個隱藏的引用super會指向父類例項,所以在例項化子類之前會先例項化一個父類,也就是說會先執行父類的建構函式.由於s中包含了父類的例項,所以s可以呼叫父類的方法.

    3.Son s1 = s;//s1指向那1.5M的記憶體.

    Father f1 = (Father)s;//這時f1會指向那1.5M記憶體中的1M記憶體,即是說,f1只是指向了s中例項的父類例項物件,所以f1只能呼叫父類的方法(儲存在1M記憶體中),而不能呼叫子類的方法(儲存在0.5M記憶體中).

    Son s2 = (Son)f;//這句程式碼執行時會報ClassCastException.因為f中只有1M記憶體,而子類的引用都必須要有1.5M的記憶體,所以無法轉換.

    Son s3 = (Son)f1;//這句可以透過執行,這時s3指向那1.5M的記憶體.由於f1是由s轉換過來的,所以它是有1.5M的記憶體的,只是它指向的只有1M記憶體.

    4.static 顧名思義,就是靜態的,他是方法的,他屬於這個類,由於是類的方法,他可以直接引用類名來引用方法,也可以透過類的物件來引用這個方法,他既不能被子類覆蓋,也不能被子類繼承。簡單的說,他是在編譯的時候就和類幫定在一起了,不能被執行時動態載入。

  • 中秋節和大豐收的關聯?
  • 蛋撻吃多了好嗎吃多了有什麼壞處?