Overload和Override的區別?


Overload和Override的區別?Overload的方法是否可以改變返回值的類型?

    Overload是重載的意思,Override是覆蓋的意思,也就是重寫。

    重載Overload:在同一個類中,允許存在一個以上的同名函數,只要他們的參數個數或者參數類型不同即可。

    重載的特點:與返回值類型無關,只看參數列表。

    重寫Override表示子類中的方法可以與父類中的某個方法的名稱和參數完全相同,通過子類創建的實例對象調用這個方法時,將調用子類中定義的方法,這相當於把父類中定義的那個完全相同的方法給覆蓋掉了,這也是面向對象編程的多態的一種表現。子類覆蓋父類方法時只能拋出父類的異常或者異常的子類或者父類異常的子集,因為子類可以解決父類的一些問題,但不能比父類有更多的問題。還有,子類方法的訪問權限只能比父類的更大,不能更小。如果父類的方法是private類型,則子類中根本不存在覆蓋,即子類中和父類的private的同名的方法沒有覆蓋的關系,因為private的訪問權限只限於同一類中,而子類就不會訪問到private的方法,所以是子類中增加的一個全新的方法。

    重載overload的特點就是與返回值無關,只看參數列表,所以重載的方法是可以改變返回值類型的。所以,如果兩個方法的參數列表完全一樣,是不能通過讓他們的返回值類型不同來實現重載的。我們可以用反證法來說明這個問題,因為我們有時候調用一個方法時也可以不定義返回結果變量,即不要關心其返回結果,例如,我們調用map.remove(key)方法時,雖然remove方法有返回值,但是我們通常都不會定義接收返回結果的變量,這時候假設該類中有兩個名稱和參數列表完全相同的方法,僅僅是返回類型不同,java就無法確定編程者倒底是想調用哪個方法了,因為它無法通過返回結果類型來判斷。

 

short s1=1; s1=s1+1;有什么錯?

short s1=1;s1+=1;有什么錯?

    對於前者,由於s1+1運算時會自動提升表達式的類型,所以結果是int類型,再賦值給short類型s1時,編譯器會將報告需要強制轉換類型的錯誤。

    對於后者,由於+=是java語言規定的運算符,java編譯器會對它進行特殊處理,因此可以正常編譯。

    補充:當一個java算數表達式中包含多個基本類型的數據時,整個算數表達式的類型將發生自動類型提升。java定義的如下自動提升規則:

            1.所有的byte型、short型和char型將被提升為int型。

            2.整個算數表達式的數據類型自動提升到與表達式中最高等級操作數同樣的類型。操作數的等級排列如下圖所示,位於箭頭右邊類型的等級高於位於箭頭左邊類型的等級。

             注:如果想把結果賦值給較小的類型,就必須使用類型轉換(既然把結果賦給了較小的類型,就可能出現信息丟失)。

 

構造器Construct是否可被Override?

    構造器不能被繼承,因此不能被重寫Override,但可以被重載Override。

    補充:繼承——子父類中的構造函數的特點:

            在子類構造對象時發現,訪問子類構造函數時,父類也運行了。為什么呢?

            原因是:在子類的構造函數第一行有一個默認的隱式語句:super();

                       super();//調用的是父類中的空參數的構造函數。

            子類實例化過程:子類中所有的構造函數默認都會訪問父類中的空參數的構造函數。

            為什么子類實例化的時候要訪問父類中的構造函數呢?

            因為子類繼承父類,獲取了父類中的內容(屬性),所以在使用父類內容之前,要先看父類是如何對自己的內容進行初始化的。所以子類在構造對象時,必須訪問父類中的構造函數。為了完成這個必須的動作,就在子類的構造函數中加入了super()。

            如果父類中沒有定義空參數構造函數,那么子類的構造函數必須用super明確要調用父類中的哪個構造函數。

    注意:super語句必須要定義在子類構造函數的第一行。因為父類的初始化動作要先完成。

            通過super()初始化父類內容時,子類的成員變量並未顯示初始化,等super()父類初始化完畢后,才進行子類成員的顯示初始化。

   

接口是否可繼承接口?抽象類是否可實現(implements)接口?抽象類是否可以繼承具體類?抽象類中是否可有靜態的main方法?

        接口可以繼承接口

        抽象類可以實現接口

        抽象類可以繼承實體類,但和實體類的繼承一樣,也要求父類可繼承,並且擁有子類可以訪問到的構造器。

        抽象類中可以有靜態的main方法。

     其實,抽象類和普通類的唯一區別就是不能創建實例對象和允許有abstract方法。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM