1. 程式人生 > >知識點劃重點-向上轉型問題

知識點劃重點-向上轉型問題

分析 父類引用 first 當當 執行 開源 操作 構造 運行

問題的起因:今天在敲代碼的時候用到了linkedlist,眾所周知,linkedlist實現了list接口,於是我就這樣聲明了一個變量:List<Integer> linklist=new LinkedList<>();

然後在代碼中我需要獲取list的第一個值,我清清楚楚明明白白記得linkedlist中有一個getFirst方法,於是乎我信誓旦旦的寫下linklist.getFirst();

當當當當、、編譯器猝不及防的就給了我一個紅叉叉,說找不到這個方法,我,恩?WTF? 恩?我開始陷入自我懷疑,難道linkedlist裏邊沒有這個方法?點開源碼、這個方法不是安安靜靜的躺在那裏等著調用的嘛、為什麽我用!不!了!?

好吧,冷靜如我,當然要來分析原因了,憑著我紮實的基本功(唔、有基本功估計就不會犯這個錯誤了、、)我敏銳的感覺到,大概是類型轉化的問題、

一路看下來發現之前竟然沒有註意過這個問題,又有一種Java白學了的趕腳、好吧,亡羊補牢,為時不晚、看看這個問題吧,首先看一段代碼,該代碼摘自https://blog.csdn.net/gh2391292/article/details/74421308

 1 class Fu {
 2     public int num = 100;
 3  
 4     public void show() {
 5         System.out.println("show Fu");
6 } 7 8 public static void function() { 9 System.out.println("function Fu"); 10 } 11 } 12 13 class Zi extends Fu { 14 public int num = 1000; 15 public int num2 = 200; 16 17 public void show() { 18 System.out.println("show Zi"); 19 } 20 21 public void
method() { 22 System.out.println("method zi"); 23 } 24 25 public static void function() { 26 System.out.println("function Zi"); 27 } 28 } 29 30 public class DuoTaiDemo { 31 public static void main(String[] args) { 32 // 要有父類引用指向子類對象。 33 // 父 f = new 子(); 34 Fu f = new Zi(); 35 System.out.println(f.num); 36 // 找不到符號 37 // System.out.println(f.num2); 38 39 f.show(); 40 // 找不到符號 41 // f.method(); 42 f.function(); 43 } 44 }

猜一猜這段代碼的結果是什麽咩、對的,就是

100

show Zi

function Fu

說實話,一開始我對運行結果還是持有懷疑的,我本著實踐出真知的目的運行了這段代碼,呵呵,臉生疼,終於認清自己渣的不能再渣的本質、

解釋一下吧,其實敲代碼的時候就會發現,當寫子類的show方法時,只打一個show,編輯器就會給出重寫show方法的提示,也就是說show方法是重寫父類的,由多態的性質可知是在運行時動態指定運行方法的。

但是在子類寫靜態方法function就不會提示是重寫父類的方法。靜態的方法可以被繼承,但是不能重寫。如果父類中有一個靜態的方法,子類也有一個與其方法名,參數類型,參數個數都一樣的方法,並且也有static關鍵字修飾,那麽該子類的方法會把原來繼承過來的父類的方法隱藏,而不是重寫。通俗的講就是父類的方法和子類的方法是兩個沒有關系的方法,具體調用哪一個方法是看是哪個對象的引用;這種父子類方法也不在存在多態的性質。而上述代碼段中調用function的是f,是一個Fu類的引用,所以調用的是Fu類的function方法。

綜上所述:我們可以看到多態中的成員訪問特點:

    • 成員變量和靜態方法
      • 編譯看左邊,運行看左邊
    • 構造方法
      • 子類的構造都會默認訪問父類構造
    • 成員方法
      • 編譯看左邊,運行看右邊

問題一:什麽是多態?

多態就是同一個接口,使用不同的實例而執行不同操作

問題二:多態的優點

  • 1. 消除類型之間的耦合關系
  • 2. 可替換性
  • 3. 可擴充性
  • 4. 接口性
  • 5. 靈活性
  • 6. 簡化性

問題三:多態存在的三個必要條件

  • 繼承
  • 重寫
  • 父類引用指向子類對象

註意:當使用多態方式調用方法時,首先檢查父類中是否有該方法,如果沒有,則編譯錯誤(這就是為什麽前邊調用linkedlist的getFirst方法報錯的原因,因為父接口list中沒有定義該方法。);如果有,再去調用子類的同名方法。

好記性不如爛筆頭,本渣總結到此了,有問題歡迎指正、

知識點劃重點-向上轉型問題