1. 程式人生 > >執行時多型、編譯時多型和過載、重寫的關係(不區分Java和C#,保證能看懂!)

執行時多型、編譯時多型和過載、重寫的關係(不區分Java和C#,保證能看懂!)

以前在大學學習OOP的時候,知道了過載和重寫的區別,但如果要把他們和多型聯絡起來,我想很多新手朋友和我當初一樣是死記的,可是時間長了,自然而然就忘記了,最近在寫測試的時候,終於“開竅”了。在這裡和大家分享一下。

過載和重寫我就不解釋了,大家都知道,我現在主要是讓大家記住 

                                                        過載是編譯時多型,重寫是執行時多型         這句話。
編譯時可以理解為“編寫”程式碼;執行時也就是程式碼執行。

好了,進入正題:

                public void A15GetSubKeyList()
        {

            /*我們在方法裡面定義了兩個String的變數token和topicvoteid,在定義好後,編譯器會檢查所定義的變數是否 復 合“要 求”,在定義好token後,編譯器檢查=後面的,分號“;”之前的資料引數是否滿足條件,這裡的條件是值,如果定義的是string,那麼他就必須是string型別的(也就是說必須有引號“”),否則就不會通過編譯,比如這裡的 string topicvoteid = ;就會報錯,通不過編譯。

以上階段大家可以粗淺的理解為“編譯時”。等程式碼通過編譯,開始運行了,就是“執行時”了。

*/

            string token = "";
            string topicvoteid = ;


            bool isChild = false;
            string papernums = "1";
            SubKeyList ret = _svr.GetSubKeyList(token, topicvoteid, isChild, papernums);
            Assert.IsNotNull(ret, "執行失敗");
            

        }

回到正題,怎麼把過載、重寫和編譯時、執行時聯絡起來呢?請繼續往下看。

GetSubKeyList(token, topicvoteid, isChild, papernums)這個方法有4個引數,是過載的典型例子(可以再定義一個GetSubKeyList方法,無引數,即構成過載),當在編譯器在編譯時,自動檢查引數型別,不符合的引數就報錯。這樣,我們就把過載和編譯時聯絡起來了(除此之外,還有過載和編譯時還有很多聯絡,這裡只取最簡單來解釋)。

重寫是子類對父類方法的“重新”定義,例如常見的“toString()”方法。編譯時期只檢查引數,不檢查方法內部過程。只有當代碼執行到具體的類別時,才會去呼叫該類“重寫”的方法,所以,重寫是執行時多型。

執行時多型、編譯時多型和過載、重寫的關係經常在面試中問道,但程度都不深,希望大家看了這篇部落格後,結合自己寫程式碼的量,做到真正理解多型。