“你好,阿米戈!今天,我们会进行一些探索。今天的主题是,此处应有掌声,接口。”
“会。今天真是个好日子,我要回家泡个热水澡。”
“接口是抽象与多态的子嗣。接口很像是抽象类,其中的所有方法都是抽象的。它声明的方法和类一样,但是带有关键字interface
。下面是一些示例:”
代码 | 说明和事实 |
---|---|
|
1) 这里不写 class ,而是写 interface 。
2) 它只包含抽象方法(不用额外写 abstract)。 3) 事实上,所有接口上的方法都是 public。 |
|
接口只可继承其他接口。
你可以有很多父接口。 |
|
类可以继承多个接口(但只可以继承一个类)。若要显示这个继承,我们可以使用关键字 implements 。
换句话说, |
“真有趣。但为什么需要接口呢?什么时候要使用接口呢?
“与类相比,接口有两大优势:”
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());
}
我们把类分为两部分:接口以及实现此接口的类。
“那这样做的优点是什么呢?”
“同样的接口可以由不同的类实现(继承)。每个类都可以有自己的行为。就像 ArrayList 和 LinkedList 是 List 接口的两个实现一样。”
因此,我们不仅会隐藏不同的实现,还会隐藏包含这些实现的类(我们可以只用代码里的接口)。这会给我们很大的灵活性,就算是程序正在运行的时候,我们也可以灵活地替换部分对象,改变对象的行为,而不让其他使用此对象的全部类所知。
与多态结合使用,接口就更能成为我们的得力帮手。现在,我们一眼看出为何使用接口。如果你遇到一个包含数十个或成百上千的类的程序,你就会认识到接口如何能大大简化你的生活。
2) 多重继承。
Java 里,每个类只可以有一个父类。但在其他编程语言里,类通常可以有多个父类。虽然这个很方便,但也会带来很多问题。
Java 提供了一个折中的方案: 虽然没办法继承多个类,但你可以实现多个接口。接口可以有多个父接口。 类可以实现多个接口,并继承唯一父类。
GO TO FULL VERSION