JAVA學習筆記14 多型 記憶體分析

2021-06-28 09:11:37 字數 2190 閱讀 9703

先來看看多型的具體含義:

多型最直接的表現就是多個子類重寫共有父類的乙個方法,而在呼叫這個方法的時候只傳入父類的型別,通過向上轉型、強制轉型等操作又具體到某個子類重寫的方法的內容,轉而執行那個子類重寫的這個方法,節省了大量的**空間。具體實現見下面的**,都是關於細節部分的一些解釋和總結我在原有**的基礎上進行了補充說明。

**實現例項:

public class animal 

}class cat extends animal

public void catchmouse()

}class dog extends animal

public void seedoor()

}class tiger extends animal

}class pig extends animal

}

public class test 

} /* 如果不採用多型,則下面的**要都寫上才能正常執行本程式。

public static void testanimalvoice(dog c)

public static void testanimalvoice(pig c)*/

public static void main(string args)

}

接下來把上述**部分提取一部分,進行對應的記憶體分析,使我們更好地了解多型:

**部分:

public class blog 

} public static void main(string args)

}

public class animal 

}class cat extends animal

public void catchmouse()

}class dog extends animal

public void seedoor()

}class tiger extends animal

}class pig extends animal

}

對應的記憶體分析圖(圖中的test類是上述**中的blog類~):

關於上述圖的一些內容的解釋:首先是在方法區裡面吧相關的類還有資訊放進去,這個不多做解釋。接下來進行執行階段,首先是物件堆裡面由於繼承的原因,cat物件包含了父類以及父類的父類的全部內容,再加上自己重寫的方法還有特有的方法,出現了這種抽象為巢狀型的形狀,類似的內容可以參考筆記12,父類animal的引用a指向了子類cat,所以指向堆中的首位址,接著強制轉型把啊由animal型轉為cat型再賦給a2,所以a2也指向首位址,接下來呼叫testanimalvoice方法,傳參,把a傳給形參c,c也指向首位址,接下來,c呼叫voice方法,如果c是cat的乙個例項引用(即如果a是指向c的首位址)則把c轉為cat型,在呼叫catchmouse方法。

最後介紹的內容是利用jsp開發裡面乙個很重要的類做乙個多型的小例子:

**如下:

}需要思考的問題是回到父類的service方法的時候裡面涉及了呼叫doget方法,那麼這個doget方法到底用的是誰的方法呢?

先看記憶體圖:

從圖中還有**的解釋部分可以看到呼叫的應該是子類的(最外層類的物件)doget方法而不是父類的。即:輸出結果如下圖:

好了,這篇到此結束,內容很重要哦~

java學習筆記之 多型

父類引用指向子類物件時,注意以下幾點 1 例項化乙個沒有名字的子類物件,然後向上轉型為父類的父類的引用,先去呼叫子類重寫的方法,子類沒有重寫就再去呼叫父類的方法。2 只能呼叫父類中定義過的方法和變數 父類中沒有定義過呼叫的時候要報錯 3 專屬於子類的成員變數,在子類方法中被訪問時,這時候通過父類引用...

JAVA學習筆記之多型

型別轉換分為自動型別轉換和強制型別轉換 1.自動型別轉換 向上型別轉換 父類 小型別 子類 大型別 不存在風險 animal animal new animal dog dog new dog animal dog 自動型別轉換,不存在風險2.強制型別轉換 向下型別轉換 子類 大型別 父類 小型別 ...

java學習筆記44 多型

允許不同類的物件對同一訊息做出響應。即同一訊息可以根據傳送物件的不同而採用多種不同的行為方式。1 乙個物件的實際型別是確定的 例如 new student new person 等 2 可以指向物件的引用的型別有很多 例如 student繼承了person類 student s1 new stude...