Java核心技术读书笔记6-1 接口、接口与抽象类的区别

1.接口

接口不是类,接口是对一组行为的抽象,他是对类的一组需求描述,这些类要遵从接口描述的统一格式进行定义
1.1 概念解释
首先考虑现实世界中存在的"Human"类与"Dog"类,"Human"类拥有眼睛、嘴巴等域。可以派生出两种不同的Human男人、女人。"Dog"类可以派生出不同种类的狗,狗都有尾巴,爪子等域。不过,考虑对于"奔跑"这个行为,人和狗都具有这个相同的行为,那么"Human"和"Dog"应该谁继承谁呢?这时就应该将这种共有的属性用另一种概念来抽离出来,也就是接口。同时,实现了接口的类就会全部按要求具有了这种行为,例如,现在我想设置一个运动模型,要求只有一个,那就是使用这个模型的对象在模型中能够直接调用他的"奔跑"行为,如何确保传入对象一定有"奔跑"行为呢?如果传入我这个模型的对象都实现了"奔跑"接口(所以只需要确保传入对象所属的类实现了接口就可以,这项检查工作在编译期就能够完成),那是不是我就可以放心的调用模型方法了?

明白了这个就可以搞清楚继承类与实现接口,抽象类与接口的区别了。
继承:代表了上下级的关系,子类拥有父类的全部公有属性,但又拥有自己的特点。因为具有扩展上下级的关系,所以类只能单继承
实现:实现一个接口代表了该类需要遵守接口要求的格式定义,即接口中的方法。这样可以使该类对象传入特定方法中完成相应功能。因为只是抽离出了一组共有的行为,所以类可以多实现

抽象类:一般包含公共属性与方法等待被扩展。
接口:包含一组共有的行为。

其实接口最好的解释就是"接口"这个名字。考虑对于Arrays.sort(type[] array)这个对数组排序的方法,只有当传入的对象所属的类实现了Comparable接口的时候(实现这个接口就要实现CompareTo方法)才可以使用。可以形象的想到,Comparable就是数组对象和排序功能之间的"接口"。
注:对于comparetTo方法,Employee定义了这个方法。若Manager重写了Employee的compareTo方法:

int compareTo(Employee e){
  Manager m = (Manager)e; 
  ...
}

考虑x是一个Employee对象,y是一个Manager对象,当执行 x.compareTo(y);时,y会自动转型成e(Manager->Employee)没有问题。但是执行y.compareTo(x);时 x不能经过(Manager)e进行强转,会报错。这不符合反对称原则。
所以如果比较Employee中统一标准属性的话,就在超类中定义final的CompareTo方法。如果允许比较不同的派生类,就在超类中提供一个rank域,不同的子类有不同的rank,然后就都用这个rank域判断大小。

1.2 接口的特性
·接口中所有方法默认为public修饰的方法。
·接口中可以实现简单的方法,这些方法用default修饰,在实现类中可以不重写这个方法。
·接口可以拥有常量,但不能拥有域。常量将被自动标记为public static final。
·实现接口必须重写所有抽象方法。
·接口不可以实例化,但可以声明接口变量,接口变量只能指向实现了该接口的类的对象。
·接口可以被扩展(使用extends继承)。

1.3 接口多实现带来的默认方法冲突问题
1.若一个类实现的多个接口中含有方法签名相同的默认方法,实现类必须重写这个方法。
2.若一个类和扩展的超类和接口中含有方法签名的含有方法体的方法,遵从类优先原则,调用时会调用父类的方法而忽略接口的默认方法。

posted @ 2021-11-10 19:09  芝芝与梅梅  阅读(86)  评论(0)    收藏  举报