目录
1.多态、动态绑定
一个对象变量(例如, 变量 e) 可以指示多种实际类型的现象被称为多态(polymorphism)。 在运行时能够自动地选择调用哪个方法的现象称为动态绑定(dynamic binding)。
2.覆盖
如果在子类中定义了一个与超类签名相同的方 法, 那么子类中的这个方法就覆盖了超类中的这个相同签名的方法。
在覆盖一个方法的时候,子类方法不能低于超类方法的可见性。特别是, 如果超类 方法是 public, 子类方法一定要声明为 public。
3.阻止继承:final 类和方法
有时候,可能希望阻止人们利用某个类定义子类。不允许扩展的类被称为 final 类。
4.抽象类(abstract修饰)
- 抽象方法充当着占位的角色, 它们的具体实现在子类中。扩展抽象类可以有两种选择。 一种是在抽象类中定义部分抽象类方法或不定义抽象类方法,这样就必须将子类也标记为抽 象类;另一种是定义全部的抽象方法,这样一来,子类就不是抽象的了。
- 类即使不含抽象方法,也可以将类声明为抽象类。
- 抽象类不能被实例化。也就是说,如果将一个类声明为 abstract, 就不能创建这个类的对 象。
5. 4 个访问修饰符:
1 ) 仅对本类可见 private。
2 ) 对所有类可见 public.
3 ) 对本包和所有子类可见 protected。
4 ) 对本包可见— —默认(很遗憾), 不需要修饰符。
6.toString()
强烈建议为自定义的每一个类增加 toString 方法。这样做不仅自己受益, 而且所 有使用这个类的程序员也会从这个日志记录支持中受益匪浅。
7.对设计继承关系很有帮助的建议
- 将公共操作和域放在超类
- 不要使用受保护的域
- 使用继承实现“ is-a” 关系
- 除非所有继承的方法都有意义, 否则不要使用继承
- 在覆盖方法时, 不要改变预期的行为
- 使用多态, 而非类型信息:使用多态方法或接口编写的代码比使用对多种类型进行检测的代码更加易于维护和扩展。
- 不要过多地使用反射
8.接口
接口(interface) 技术,这种技术主要用来描述类具有什么功能,而并不 给出每个功能的具体实现。一个类可以实现(implement)—个或多个接口,并在需要接口的 地方,随时使用实现了相应接口的对象。 接口不是类,而是对类的一组需求描述,这些类要遵从接口描 述的统一格式进行定义。
- 接口绝不能含 有实例域。
- 提供实例域和方法实现的任务应该由实现接口的那个类来完成。因此, 可以将接口看成 是没有实例域的抽象类,但是这两个概念还是有一定区别的。
9.默认方法
可以为接口方法提供一个默认实现。必须用 default 修饰符标记这样一个方法。
- 默认方法的一个重要用法是 “ ‘ 接口演化” (interface evolution)。(为接口增加方法可以保证“ 二进制兼容”)。
-
解决默认方法冲突
Java 的相应规则要简单得多。规则如下:
1 ) 超类优先。如果超类提供了一个具体方法,同名而且有相同参数类型的默认方法会 被忽略。
2 ) 接口冲突。 如果一个超接口提供了一个默认方法,另一个接口提供了一个同名而且 参数类型(不论是否是默认参数)相同的方法, 必须覆盖这个方法来解决冲突。
......后续更新lambda表达式......