- 在类的外部可以访问的方法和字段的集合,加上它们应具有的行为的描述,通常称为该类的契约。契约是类的设计者对类的行为所做的承诺。
- 如果扩展类构造器的第一条可执行语句既不是调用超类构造器的语句,也不是调用扩展类的某个其他构造器的语句,那么在子类构造器的任何语句执行之前,扩展类的构造方法都会自动调用超类的无引元构造器。也就是说,扩展类构造器的第一条语句被认为是如下这条语句:super();如果超类没有无引元的构造器,就必须显式地调用另一个构造器;
- 在覆盖方法时,其签名必须与超类中的签名相同,如果不同,那么这就是重载,而不是覆盖。覆盖方法的返回类型如果是基本类型,则必须一致;如果是引用类型,子类方法的返回类型可以是超类方法返回类型的子类;
- 覆盖的方法可以扩大访问权限,但不能缩小;因为子类应该是完全满足超类契约的,即可以向上转型,一旦缩小权限意味着子类的实例不能用来代替超类实例,这就完全违反了java多态的特性;
- 覆盖的方法可以改变其他的修饰符,如synchronized,native,strictfp和注解;因为这些是和实现相关的;
- 覆盖的方法不能与继承而来的静态方法具有相同签名,反之亦然;覆盖方法可以被声明为abstract,即使其超类方法并非是abstract的;
- 不管覆盖方法中的参数是否是final的,子类都可以修改这个参数;参数的final修饰符并不属于方法的签名,它只是实现的细节;
- 覆盖方法的throws中列出的每一种异常类型都必须与超类方法中列出的异常类型相同,或者是其子类型;
- 字段不可以被覆盖而只能被隐藏,即如果子类中定义了同名的字段,那么超类的该字段则必须使用super或者超类类型的另外一个引用来访问它;
- 非final的类有两个接口,其中公有接口是为使用该类的程序员提供的,而受保护接口则是为扩展该类的程序员提供的,不要随意将该类的字段声明为受保护的,因为这两个接口都是真正的契约,因此应该精心设计;
The Java Programming Language4th读书笔记-第三章 类的扩展
最新推荐文章于 2022-10-11 15:29:02 发布