1)利用多態(tài)實現(xiàn)向上轉(zhuǎn)型upcase中的方法和域問題
這是最簡單,最常見的多態(tài)的一種情形,方法是用public修飾的。導出類的方法覆蓋了基類的方法,當導出類向上轉(zhuǎn)型的后(sub-->super),sup2在加載類方法的時候,會檢查導出類是否有覆蓋該方法,如果有就調(diào)用導出類的方法,因此這里sup2.display(),sup2.sayHello()結(jié)果都是Sub的。在這種情況下最好是使用javase5的@Override注解.但如果基類的方法是private(也就是final),那又會出現(xiàn)什么情況呢?
在這個例子中,主要是想體現(xiàn)出如果基類的方法是private的,導出類就不能繼承這個方法。在向上轉(zhuǎn)型中調(diào)用這個方法,能且僅能調(diào)用基類的private方法(當然要求main()在基類中調(diào)用,否則在基類以外的地方不能調(diào)用基類的private方法,這個列子正是如此)下面再看如果方法是static的呢
由這個例子可以知道在多態(tài)是不適用于static的方法的。也就是說在加載類的時候,編譯器調(diào)用static方法不會去檢查導出類是否對基類的static方法是否覆蓋,而是直接裝載基類的static方法。2)多態(tài)中的域
域在多態(tài)中是不會被覆蓋的,F(xiàn)ielddSuper.field和FieldSub.field被分配了兩個不同的存儲空間,同時在向上轉(zhuǎn)型的時候,編譯器也不會向下去找導出類是否覆蓋類的域,因此sup.field()返回了FieldSuper的field而不是FieldSub的field。對于想在導出類中獲得基類的域,就得像例子那樣通過super方法來獲取總結(jié):對于利用多態(tài)的向上轉(zhuǎn)型,編譯器先從向上轉(zhuǎn)型后的基類出發(fā),找出要調(diào)用的元素。根據(jù)不同元素采取不同的策略,如果是域,static以及private的方法,則不會去檢查導出類是否覆蓋這些方法(其實是不能覆蓋的)而直接調(diào)用基類的;如果是public的方法則檢查導出類是否覆蓋,覆蓋了就會調(diào)用導出類的,否則調(diào)用基類的
Powered by: BlogJava Copyright © Eric-1001c