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