重写
方法
-
当子类重写超类的方法时,子类该方法的被访问权限不能低于超类方法。如果超类方法为 public,则子类被重写的方法也要为 public。即子类重写方法的访问权限不能缩小。
-
当子类重写超类的方法时,可以不抛出异常,如果抛出异常,则子类该方法中声明的检查型异常不能比超类方法中声明的更通用。即子类重写方法抛出的异常可以是超类方法的子类,也可以不抛出异常。
-
当子类的方法签名与超类相同,子类该方法的返回值也要与超类返回值相同或为其子类。即重写最多只能令返回值更特殊。
字段
- 在 Java 中,字段不会被重写。这一点跟该字段有没有被声明为 final、protected 无关。
反射
-
方法 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,它的第一个是形参是期望值,第二个形参才是实际值。