在 Java OOP 编程中的注意事项
在 Java OOP 編程中的注意事項
- 重寫
- 方法
- 字段
- 反射
- static
- 接口
- abstract
- Maven
- JUnit
重寫
方法
當子類重寫超類的方法時,子類該方法的被訪問權限不能低于超類方法。如果超類方法為 public,則子類被重寫的方法也要為 public。即子類重寫方法的訪問權限不能縮小。
當子類重寫超類的方法時,可以不拋出異常,如果拋出異常,則子類該方法中聲明的檢查型異常不能比超類方法中聲明的更通用。即子類重寫方法拋出的異常可以是超類方法的子類,也可以不拋出異常。
當子類的方法簽名與超類相同,子類該方法的返回值也要與超類返回值相同或為其子類。即重寫最多只能令返回值更特殊。
字段
反射
方法 getMethod 只能獲得目標類的所有能用所有的公共方法。
而方法 getDeclaredMethod 只能獲得類自身聲明的所有方法,這不包括繼承自超類的方法,但包括實現接口的方法。
如果反射調用的方法本身可以拋出異常,則當其拋出異常時,此異常會被反射“吞掉”,封裝成 InvocationTargetException 異常重新拋出。可以使用該封裝異常的方法 getTargetException 或 getCause 來獲取被吞掉的異常。
基本類型對應的 class 對象是通過直接在其后加后綴 .class 來獲得,而不是對應的包裝類的 class 對象。
反射會影響代碼的可讀性,同時具有一定的危險性。又因為它的危險性,所以需要編寫額外的代碼去減弱這種危險,這又會帶來一定的復雜度。因此,建議在如下情況時才考慮反射:
編寫的是一種框架代碼,組內已統一對反射的編寫規范。
用于對自己的外界不可訪問的方法的單元測試。
自己依賴的類在設計上不合理,但自己無法對其重構。此時可在必要時酌情使用來擁有訪問該類內部數據的權限。如清除封裝在 String 中的密碼等等。
【廢棄】要調用的方法有很多重載,而這些重載方法的形參之間又有繼承關系。這里需要調用形參與實參真實類型相同的一個重載方法,但此時不知道實參的真實類型,因此不能使用強制轉換。此時可以使用反射來獲得實參的真實類型,從而調用正確的重載方法。【廢棄。如果遇到這種情況,優先選擇重構而不是反射。這種情形下使用反射容易調用自己忘記編寫的不存在的方法,從而引發反射異常】
static
static 方法不會被重寫(但是,可以通過關鍵字 final 來阻止子類定義同簽名的方法。)。超類引用不能調用子類 static 方法。
因此,每個子類都有的同簽名方法不要定義為 static。
對于子類與超類同簽名的方法,有沒有使用 static 要保持一致。如果超類方法使用了 static,則子類同簽名方法也要使用 static。且 static 不能與 abstract 同時使用。
接口
public 是接口的默認訪問控制,且接口中只能聲明 public 方法。
接口中的方法可以通過關鍵字 default 來提供實現。
abstract
標記為 abstract 的方法不能在這個類中提供實現。
可以將抽象類的構造器聲明成 protected,但其非抽象子類的必須聲明為 public,否則其它的普通類將無法創建該子類的對象。
Maven
Maven 不允許模塊之間的循環依賴。如果原來有這種需求,需要將它們都依賴的類抽取出來作為一個新模塊,以供其它模塊依賴。
Maven 的測試插件 maven-surefire-plugin 默認只會測試如下的類方法:
-
類的訪問權限為 public,且類名含 test
-
類的默認構造器的訪問權限為 public
-
方法的訪問權限為 public,且方法名的前綴為 test
JUnit 注解對 Maven 默認是無效的。在默認情況下,使用 JUnit 注解不能改變 Maven 的測試行為。
JUnit
JUnit 注解對 Maven 默認是無效的。在默認情況下,使用 JUnit 注解不能改變 Maven 的測試行為。
JUnit 中的測試類的測試方法可以聲明為 default,連構造器也可以。
如果被測試的方法為繼承自 Object 的方法,則測試方法的方法名必須加前綴或后綴(如 test)來使之不同。
對于方法 assertEquals,它的第一個是形參是期望值,第二個形參才是實際值。
總結
以上是生活随笔為你收集整理的在 Java OOP 编程中的注意事项的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Java 中的线程安全的类
- 下一篇: java美元兑换,(Java实现) 美元