Java接口---巩固强化

1.接口的概念

在Java程序设计语言中,接口不是类,而是对希望符合这个接口的类的一组需求。提供实例字段和方法实现的任务应该由实现接口的那个类来完成。因此,可以将接口看成是没有实例字段的抽象类。但是这两个概念还是有一定区别的,稍后将给出详细的解释。
为了让类实现一个接口,通常需要完成下面两个步骤:

  1. 将类声明为实现给定的接口。
  2. 对接口中的所有方法提供定义。
    要将类声明为实现某个接口,需要使用关键字implements;
class Employee implements Comparable

当然,这里的Employee类需要提供compareTo方法。假设希望根据员工的薪水进行比较。以下是compareTo方法的实现

public int compareTo(Object otherObject)
{
  Employee other=(Employee)otherObject;
  return Double.compare(salary,other.salary);
}

:在接口声明中,没有将compareTo方法声明为public,这是因为在接口中的所有方法都自动是public。不过,在实现接口时,必须把方法声明为public;否则,编译器就会报错,指出你试图提供更严格的访问权限。、

2.接口的属性

接口不是类。具体来说,不能使用new运算符实例化一个接口:

x=new Comparable(...);//ERROR

不过,尽管不能构造接口的对象,却能声明接口的变量:

Comparable x;//OK

接口变量必须引用实现了这个接口的类对象:

x=new Employee(...);//OK

虽然在接口中不能包含实例字段,但是可以包含常量。与接口中的方法都自动被设置为public一样,接口中的字段总是public static final。
尽管每个类只能有一个超类,但却可以实现多个接口。这就为定义类的行为提供了极大的灵活性。例如,Java程序设计语言有一个非常重要的内置接口,名为Cloneable。如果某个类实现了这个Cloneable接口,Object类中的clone方法就可以创建你的类对象的一个准确副本。如果希望自己设计的类拥有克隆和比较的能力,只要实现这两个接口就可以了。可以使用逗号将想要实现的各个接口分隔开。

3.接口与抽象类

这里也许会有疑问:为什么Java程序设计语言的设计者要那么玛法地引入接口概念呢?为什么不将Compare直接设计成一个抽象类呢?如下所示:

abstract class Comparable//why not?
{
  public abstract int compareTo(Object other);
}

这样一来,Employee类只需要扩展这个抽象类,并提供compareTo方法的实现:

class Employee extends Comparable//why not?
{
  public int compareTo(Object other){...}
}

非常遗憾,使用抽象类表示通用属性存在一个严重的问题。每个类只能扩展一个类。假设Employee类已经扩展了另一个类,例如Person,它就不能再扩展第二个类了。

class Employee extends Person,Comparable//ERROR

但每个类可以实现多个接口,如下所示:

class Employee extends Person implements Comparable//OK

Java设计者选择了不支持多重继承,其主要原因是多重继承会让语言变得非常复杂,或者效率会降低。实际上,接口可以提供多重继承的大多数好处,同时还能避免多重继承的复杂性和低效性。

猜你喜欢

转载自blog.csdn.net/Achenming1314/article/details/105756212