Java中Interface的使用
首先我们来看Interface的定义
Interface 是一系列方法的声明,是一些方法特征的集合,一个接口里只有方法的特征而没有方法的实现,因此这些方法可以在不同的地方被不同的类实现,而这些实现可以具有不同的行为。
也就是说,接口就好像是一个角色,这个角色有一些特定的属性和操作,然后实现接口的类就好比是扮演角色的演员,一个角色可以有很多个演员来扮演,他们具体的属性和操作各不相同。除了扮演同一个角色之外,这些不同的演员也没有其他的相同之处。
下面举一个具体的Interface,以及实现它的class进行说明。
interface Instack{
void push(int val);
int pop();
int peek();
boolean isEmpty();
void clear();
}
class InstackByArrayList implements Instack{}
在实际编译器中,我们创建的InstackByArrayList是会进行报错的:
 因为我们一旦继承了一个接口,就必须实现该接口的所有方法,如继承了InStack接口,必须实现其中的push/pop/peek/isEmpty/clear等方法。
class InstackByArrayList implements Instack{
@Override
public void push(int val) {
}
@Override
public int pop() {
return 0;
}
@Override
public int peek() {
return 0;
}
@Override
public boolean isEmpty() {
return false;
}
@Override
public void clear() {
}
}
其中Override的意义在于提醒编程者该方法是由于extends父类或者impletement接口所要求实现的。
到了这时,有人可能会问:“InstackByArrayList没有实现InStack接口一样可以正常操作。
那我们为何要使用Interface呢?
当一个类与程序的其他部分发生交互时,而这个程序中又存在一些该类的相似类,并且同样需要进行相同的交互时,选择实现Interface大大减少我们的工作量。
下面举个例子,程序中有:
LinkedList<Integer> linkedList = new LinkedList<>();
ArrayList<Integer> arrayList = new ArrayList<>();
假如我们需要编写一段代码来求得List中的和,不实现List接口的话就需要编写两个极其相似的代码块:
public int getListSum(ArrayList<Integer> list){
int sum = 0;
for(int i = 0; i < list.size(); ++i){
sum += list.get(i);
}
return sum;
}
public int getListSum(LinkedList<Integer> list){
int sum = 0;
for(int i = 0; i < list.size(); ++i){
sum += list.get(i);
}
return sum;
}
细心的同学会发现,这两段代码只有输入的参数类型不同,其他完全相同,那如果存在的List类型更多了呢,我们就需要编写跟类型一样多的getSum,而一旦改动便需要一个一个改动,这是极其重复而没有意义的活动,增加了程序的维护成本。
在这种情况下,我们往往会使用impletement 某一个 Interface来减少我们的工作量,比如在上面的例子中,我们把传入getListSum的参数改为:
public int getListSum(List<Integer> list){
int sum = 0;
for(int i = 0; i < list.size(); ++i){
sum += list.get(i);
}
return sum;
}
这样一来,我们可以发现无论传入ArrayList的参数或者LinkedList都是可以计算的,它并不关心你是什么类型的List,只要是实现List接口的Class即可,但是该方法内部使用的方法必须是List中存在的,如list.get()。
System.out.println(getListSum(arraylist));
System.out.println(getListSum(linkedList));
这是因为List是一个 Interface,而ArrayList和LinkedList实现了这个接口,源代码如下:

 当一个类去实现了一个接口的时候,你可以把这个类的reference去赋值给这个接口的reference,比如当我们去new一个ArrayList的时候,很多时候能看见这样的写法:
List<Integer> arrayList = new ArrayList<>();
但我们希望一个类去遵守很多规则时,我们需要implements 接口而不是extends 别的class,因为java是一个单继承的语言。 (编辑:北几岛)
【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!
|