① java中重載和重寫的區別是什麼
在Java編程中,兩個關鍵的特性用於擴展和增強類的功能:重載和重寫。讓我們分別探討它們的區別。
首先,重載(Overloading)是類內部的一種機制,它允許在同一個類中定義多個同名的方法,但這些方法的參數列表必須不同。這意味著參數的數量、類型或順序的任何變化都可以導致方法的重載。即使返回類型或訪問修飾符有所差異,這也是在編譯時進行檢查的。重載主要用於提供多種實現方式,根據傳入的參數類型或數量選擇合適的方法執行。
相比之下,重寫(Overriding)則發生在子類繼承父類的上下文中。當子類擁有與父類相同名稱、參數列表且返回類型(或其子類型)更嚴格的(即不能更寬泛)方法時,就發生了重寫。此外,子類不能拋出比父類方法更大范圍的異常,訪問許可權至少要與父類方法相等,如果父類方法是私有(private),子類則無法覆蓋它。重寫的主要目的是為了實現多態,讓子類能夠以自己的方式實現父類的方法,增強代碼的靈活性和可擴展性。
② 重載和重寫有什麼區別
重載: 發生在同一個類中,方法名必須相同,參數類型不同、個數不同、順序不同,方法返回值和訪問修飾符可以不同,發生在編譯時。
重寫: 發生在父子類中,方法名、參數列表必須相同,返回值范圍小於等於父類,拋出的異常范圍小於等於父類,訪問修飾符范圍大於等於父類;如果父類方法訪問修飾符為 private 則子類就不能重寫該方法。
③ C++多態性。 基類的虛函數和重載函數的區別,是不是一個是在運行時發生,一個是在編譯時發生
是的,函數的重載是在編譯的時候發生,而虛函數是在運行的時候確定。其實有時候稱函數的重載為靜態多態性,而虛函數為動態多態性
④ Java編譯時註解和運行時註解有什麼區別
重寫,重載,泛型,分別是在運行時還是編譯時執行的
1. 方法重載是在編譯時執行的,因為,在編譯的時候,如果調用了一個重載的方法,那麼編譯時必須確定他調用的方法是哪個。如:
當調用evaluate("hello")時候,我們在編譯時就可以確定他調用的method #1.
2.
方法的重寫是在運行時進行的。這個也常被稱為運行時多態的體現。編譯器是沒有辦法知道它調用的到底是那個方法,相反的,只有在jvm執行過程中,才知曉到底是父子類中的哪個方法被調用了當有如下一個介面的時候,我們是無法確定到底是調用父類還是子類的方法
3.
泛型(類型檢測),這個發生在編譯時。編譯器會在編譯時對泛型類型進行檢測,並吧他重寫成實際的對象類型(非泛型代碼),這樣就可以被JVM執行了。這個過程被稱為"類型擦除"。
類型擦除的關鍵在於從泛型類型中清除類型參數的相關信息,並且再必要的時候添加類型檢查和類型轉換的方法。
類型擦除可以簡單的理解為將泛型java代碼轉換為普通java代碼,只不過編譯器更直接點,將泛型java代碼直接轉換成普通java位元組碼。類型擦除的主要過程如下:
1). 將所有的泛型參數用其最左邊界(最頂級的父類型)類型替換。
2). 移除所有的類型參數。
在編譯後變成:
4. 註解。註解即有可能是運行時也有可能是編譯時。
如java中的@Override註解就是典型的編譯時註解,他會在編譯時會檢查一些簡單的如拼寫的錯誤(與父類方法不相同)等
同樣的@Test註解是junit框架的註解,他是一個運行時註解,他可以在運行時動態的配置相關信息如timeout等。
5. 異常。異常即有可能是運行時異常,也有可能是編譯時異常。
RuntimeException是一個用於指示編譯器不需要檢查的異常。RuntimeException
是在jvm運行過程中拋出異常的父類。對於運行時異常是不需要再方法中顯示的捕獲或者處理的。
已檢查的異常是被編譯器在編譯時候已經檢查過的異常,這些異常需要在try/catch塊中處理的異常。
6. AOP. Aspects能夠在編譯時,預編譯時以及運行時使用。
1).
編譯時:當你擁有源碼的時候,AOP編譯器(AspectJ編譯器)能夠編譯源碼並生成編織後的class。這些編織進入的額外功能是在編譯時放進去的。
2). 預編譯時:織入過程有時候也叫二進制織入,它是用來織入到哪些已經存在的class文件或者jar中的。
3). 運行時:當被織入的對象已經被載入如jvm中後,可以動態的織入到這些類中一些信息。
7. 繼承:繼承是編譯時執行的,它是靜態的。這個過程編譯後就已經確定
8. 代理(delegate):也稱動態代理,是在運行時執行。