重寫,重載,泛型,分別是在運行時還是編譯時執行的
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):也稱動態代理,是在運行時執行。
B. java 實體類 註解 繼承問題!
你這屬於繼承映射,不能簡單的在實體類中配置@Entity,你應該使用Hibernate Annotation中的《映射繼承關系》具體怎麼配置,自己去HibernateAnnotation文檔查下
2.2.4.2. 每個類層次結構一張表(第一種,一共三種)
整個繼承層次結構中的父類和子類的所有屬性都映射到同一個表中, 他們的實例通過一個辨別符(discriminator)列來區分.:
//父類
@Entity
//繼承類型使用的是一張表,繼承映射分為3個類型,具體自己查
//繼承映射成一張表的表結構是 父類欄位+子類欄位+一個鑒別欄位(因為可以有多個子類繼承父類,這個鑒別欄位用於分別一條數據記錄是屬於那個子類的)
@Inheritance(strategy=InheritanceType.SINGLE_TABLE)
//鑒別欄位 name="鑒別欄位名稱" discriminatorType 鑒別欄位數據類型
@DiscriminatorColumn(
name="planetype",
discriminatorType=DiscriminatorType.STRING
)
//鑒別欄位值=Plane ,在保存Plane時,默認表中鑒別欄位的值為Plane
//鑒別值不必非與實體類同名,隨意起,別與其他重復就行
@DiscriminatorValue("Plane")
public class Plane { ... }
//子類
@Entity
//鑒別欄位值=A320,在保存A320時,默認表中鑒別欄位的值為A320
Plane@DiscriminatorValue("A320")
public class A320 extends Plane { ... }
C. 在java中實現組合註解原理分析(註解繼承)
在 Java 中實現組合註解時,常需繼承已有的註解以實現功能集成,如 Spring 中的註解@Component。實際上,Java 並不直接支持獲取類上直接繼承的註解,例如使用註解 A 標記註解 B 後,無法通過反射獲取類是否被註解 A 標記。但藉助於註解繼承,這一問題得以解決。
首先,通過創建一個 Maven 工程,定義基礎註解@Component,為後續實現組合註解奠定基礎。接著,定義 @MyService 註解,繼承自@Component,實現註解集成的效果。
構建好上述註解後,設計測試類並應用@MyService 註解,通過編寫 main 方法進行測試。程序輸出顯示了註解應用的結果,證實了組合註解功能的成功實現。
通過這種方式,自定義註解時可將具有公共屬性的註解提取,利用註解繼承完成組合註解的實現。操作簡便,功能強大,使得代碼編寫更加高效、清晰。
D. java 註解可以繼承註解嗎
這個是沒有實現的。
解釋:注釋本身具有針對性,也就是注釋是自定義的,根據實際需要可以修改,此類內容並沒有固定的內容規范,所以是沒辦法進行注釋繼承的,只能繼承方法,不能繼承注釋的。
整個繼承層次結構中的父類和子類的所有屬性都映射到同一個表中, 他們的實例通過一個辨別符(discriminator)列來區分.:
//父類
@Entity
//繼承映射成一張表的表結構是 父類欄位+子類欄位+一個鑒別欄位(因為可以有多個子類繼承父類,這個鑒別欄位用於分別一條數據記錄是屬於那個子類的)
@Inheritance(strategy=InheritanceType.SINGLE_TABLE)
//鑒別欄位 name="鑒別欄位名稱" discriminatorType 鑒別欄位數據類型
@DiscriminatorColumn(
name="planetype",
discriminatorType=DiscriminatorType.STRING
(4)java註解繼承註解擴展閱讀:
Annotation(註解)是JDK1.5及以後版本引入的。它可以用於創建文檔,跟蹤代碼中的依賴性,甚至執行基本編譯時檢查。註解是以『@註解名』在代碼中存在的,根據註解參數的個數,可以將註解分為:標記註解、單值註解、完整註解三類。
都不會直接影響到程序的語義,只是作為註解(標識)存在,可以通過反射機制編程實現對這些元數據(用來描述數據的數據)的訪問。另外,可以在編譯時選擇代碼里的註解是否只存在於源代碼級,或者它也能在class文件、或者運行時中出現(SOURCE/CLASS/RUNTIME)。