转载

java核心卷Ⅰ第十版笔记6

  1. 接口可以定义常量,然而接口绝不能含有实例域,在 JavaSE 8 之前,也不能在接口中实现方法。现在已经可以在接口中提供简单方法了,当然,这些方法不能引用实例域,接口没有实例。
  2. 接口可以提供多重继承的大多数好处, 同时还能避免多重继承的复杂性和低效性 。
  3. 在 Java SE 8 中,允许在接口中增加静态方法。理论上讲,没有任何理由认为这是不合法的。只是这有违于将接口作为抽象规范的初衷。目前为止,通常的做法都是将静态方法放在伴随类中。在标准库中,你会看到成对出现的接口和实用工具类,如Collection/Collections或Path/Paths。
  4. 可以为接口方法提供一个默认实现。 必须用default 修饰符标记这样一个方法。
  5. 如果先在一个接口中将一个方法定义为默认方法,然后又在超类或另一个接口中定义了同样的方法,会发生什么情况?Java的相应规则如下:1) 超类优先 :如果超类提供了一个具体方法,同名而且有相同参数类型的默认方法会被忽略。2) 接口冲突 ;如果一个超接口提供了一个默认方法,另一个接口提供了一个同名而且参数类型(不论是否是默认参数)相同的方法 ,必须覆盖这个方法来解决冲突。如果至少有一个接口提供了一个实现 ,编译器就会报告错误 ,而程序员就必须解决这个二义性。当然,如果两个接口都没有为共享方法提供默认实现,那么就与Java SE 8 之前的情况一样, 这里不存在冲突 。实现类可以有两个选择 : 实现这个方法, 或者干脆不实现 。如果是后一种情况, 这个类本身就是抽象的 。另一种情况,一个类扩展了一个超类 ,同时实现了一个接口, 并从超类和接口继承了相同的方法。在这种情况下,只会考虑超类方法 ,接口的所有默认方法都会被忽略。这正是 类优先 规则。 类优先 规则可以确保与 JavaSE 7 的兼容性。如果为一个接口增加默认方法 ,这对于有这个默认方法之前能正常工作的代码不会有任何影响。警告:千万不要让一个默认方法重新定义Object 类中的某个方法。例如,不能为toString或equals定义默认方法,尽管对于 List 之类的接口这可能很有吸引力,由于类优先规则,这样的方法绝对无法超越 Object.toString 或Objects.equals。
  6. 如果希望 copy 的是一个新对象, 它的初始状态与 原对象相同 , 但是之后它们各自会有自己不同的状态 , 这种情况下就可以使用 clone 方法。默认的克隆操作是 “ 浅拷贝 ”, 并没有克隆对象中引用的其他对象 。浅拷贝会有什么影响吗 ? 这要看具体情况。 如果原对象和浅克隆对象共享的子对象是不可变的 , 那么这种共享就是安全的。 如果子对象属于一个不可变的类 ,如 String , 就 是 这 种情况。 或者在对象的生命期中 ,子对象一直包含不变的常量 , 没有更改器方法会改变它 , 也没有方法会生成它的引用, 这种情况下同样是安全的。
  7. 内部类是定义在另一个类中的类。 为什么需要使用内部类呢 ?其主要原因有以下三点 :内部类方法可以访问该类定义所在的作用域中的数据 ,包括私有的数据。内部类可以对同一个包中的其他类隐藏起来。当想要定义一个回调函数且不想编写大量代码时,使用匿名内部类比较便捷。
原文  https://segmentfault.com/a/1190000020261131
正文到此结束
Loading...