“你好,阿米戈!今天,我们会进行一些探索。今天的主题是,此处应有掌声,接口。

“会。今天真是个好日子,我要回家泡个热水澡。”

接口是抽象与多态的子嗣。接口很像是抽象类,其中的所有方法都是抽象的。它声明的方法和类一样,但是带有关键字interface。下面是一些示例:”

代码 说明和事实
interface Drawable
{
void draw();
}
interface HasValue
{
int getValue();
}
1) 这里不写 class,而是写 interface

2) 它只包含抽象方法(不用额外写 abstract)。

3) 事实上,所有接口上的方法都是 public。

interface Element extends Drawable, HasValue
{
int getX();
int getY();
}
接口只可继承其他接口。

你可以有很多父接口。

class abstract ChessItem implements Drawable, HasValue
{
private int x, y, value;

public int getValue()
{
return value;
}

public int getX()
{
return x;
}

public int getY()
{
return y;
}

}
类可以继承多个接口(但只可以继承一个类)。若要显示这个继承,我们可以使用关键字 implements

ChessItem  类被声明为 abstract:它实现所有继承的方法,除了 draw。

换句话说,ChessItem  包含一个抽象方法: draw()

“真有趣。但为什么需要接口呢?什么时候要使用接口呢?

“与类相比,接口有两大优势:”

1) 区分“方法定义”与方法实现。

之前我们说过,如果你想让其他类可以调用你类里的方法,你可以将它们标为 public。如果你想让自己类中的部分方法被调用,那么你可以将它标为 private。换言之,我们大体上可以将类的方法分为两种类别:“给众人”和“只给自己”。

我们可以使用接口进一步强化这个分法。我们让“给众人的类”继承另一个“只给自己的类”。就像下面这样:

之前
class Student
{
 private String name;

 public Student(String name)
 {
  this.name = name;
 }

 public String getName()
 {
  return this.name;
 }

 private void setName(String name)
 {
  this.name = name;
 }
之后
interface Student
{
 public String getName();
}

class StudentImpl implements Student
{
 private String name;
 public StudentImpl(String name)
 {
  this.name = name;
 }
 public String getName()
 {
  return this.name;
 }
 private void setName(String name)
 {
  this.name = name;
 }
}
之前
public static void main(String[] args)
{
 Student student =
               new Student("Alibaba");
 System.out.println(student.getName());
}
之后
public static void main(String[] args)
{
 Student student =
               new StudentImpl("Ali");
 System.out.println(student.getName());
}

我们把类分为两部分:接口以及实现此接口的类

“那这样做的优点是什么呢?”

“同样的接口可以由不同的类实现(继承)。每个类都可以有自己的行为。就像 ArrayListLinkedList 是 List 接口的两个实现一样。

因此,我们不仅会隐藏不同的实现,还会隐藏包含这些实现的类(我们可以只用代码里的接口)。这会给我们很大的灵活性,就算是程序正在运行的时候,我们也可以灵活地替换部分对象,改变对象的行为,而不让其他使用此对象的全部类所知。

与多态结合使用,接口就更能成为我们的得力帮手。现在,我们一眼看出为何使用接口。如果你遇到一个包含数十个或成百上千的类的程序,你就会认识到接口如何能大大简化你的生活。

2) 多重继承。

Java 里,每个类只可以有一个父类。但在其他编程语言里,类通常可以有多个父类。虽然这个很方便,但也会带来很多问题。

Java 提供了一个折中的方案: 虽然没办法继承多个类,但你可以实现多个接口。接口可以有多个父接口。 类可以实现多个接口,并继承唯一父类。