接口(重点)
基本概念:
接口就是一种比抽象类还要抽象的类,体现为接口中所有的成员方法都是抽象方法
-
定义类的关键字是class
-
定义接口的关键字是interface
-
继承的关键字是extends
-
实现接口的关键字是implements
注意:
接口中不能定义成员变量,只能定义常量
-
接口中只能有被public,static,final关键字共同修饰的常量
接口中的的所有方法都是抽象方法
-
接口中的方法只能被public,abstract,static,default(jdk1.8之后的新特性),和strictfp修饰
类和接口之间的关系
类和类之间的关系:
类和类之间使用extends关键字表示继承的关系—类与类之间只支持单继承
类和接口之间的关系:
类和接口之间使用implements表示实现的关系----类与接口之间支持多实现(也就是一个类之可以同时实现多个接口)
接口和接口之间的关系:
使用extends表示继承的关系----接口之间可以多实现
- 接口是为了解决java中无法进行多继承的问题
eg:假如有三个类: 金属类 货币类 黄金类
这里的黄金即属于金属也属于货币,所以就需要黄金类去同时继承金属类和货币类,但是java却只支持单继承,所以就无法实现
所以我们就提出了接口:
假如有两个接口:金属接口 货币接口 黄金类
这里的黄金类可以同时去实现金属接口和货币接口,也就解决了java中不能多继承的问题,也不违背java只支持单继承的特点
eg:
/*
这里就是建立了一个Money接口(也就是货币接口)
*/
public interface Money{
}
--------------------------------
/*
这里建立了一个Metel接口(也就是金属接口)
*/
public interface Metel{
}
/*
这里创建了一个黄金类即实现了Money接口,也实现了Metel接口
*/
public class Gold implements Money,Metel{
}
- 接口类型的引用指向实现类的对象,也就是形成了多态
eg:
Metel mt=new Gold();//这里的Gold实现了Metel接口,那么Gold也就是Metel接口的实现类
抽象类和接口只能用于多态,只能是使用多态的方式
(因为抽象类和接口都不能创建对象[抽象类都不能创建对象,那么比抽象类更加抽象的接口就更加不能创建对象了],所以只能是声明一个引用去指向以子类或者实现类为模板创建的对象,从而完成多态)
抽象类----子类
接口----实现类
- 一个类实现了某个接口后必须实现该接口定义的所有方法(因为接口中的方法都为抽象方法)(jdk1.8之前)
接口间可以存在继承关系,一个接口可以通过extends关键字继承另外一个接口,子接口继承了父接口中定义的所有方法(这里由于子接口继承了父接口的所有方法,所以当一个类实现了这个子接口时,那么这个类必须实现(重写)这个子接口与父接口中的所有方法(jdk1.8之前)
eg:
/*
这里的Runner为Hunter接口的父接口
*/
interface Runner{
public [abstract] void run();
}
/*
这里的Hunter为Runter接口的父接口
*/
interface Hunter extends Runner{
public [abstract] void hunt();
}
/*
这里的Americancur必须实现Hunter接口中的hunt()方法以及其父类接口Runner中的run方法
*/
public class Americancur implements Hunter{
public void run(){
}
public void hunt(){
}
}
抽象类和接口之间的区别(笔试题)
1.定义抽象类的关键字abstract class,而定义接口的关系是interface
2.继承抽象类的关键字extends,而实现接口的关键字是implements
3.继承抽象类只支持单继承,而实现接口可以多实现
4.抽象类中可以有构造方法,而接口中不可以有构造方法
5.抽象类中可以有成员变量,而接口中只能有常量
6.抽象类中可以有一般方法,而接口中只能有抽象方法(jdk1.8之前)
7.抽象类中增加方法不一定会影响子类,而接口中增加方法通常都会影响子类(抽象类中增加的方法可以是抽象方法,也可以是一般方法,所以不一定需要在子类中实现, 接口中增加的方法只能是抽象方法也就必须在子类中实现)
8.从jdk1.8开始允许接口中出现非抽象方法,但需要使用default关键字修饰
为什么增加第8个这个特性:
原因一:有的接口中假如方法特别多(假如有二百个),而这些方法都是抽象方法的话,如果有一个类需要实现这个接口时就要实现这个接口中的二百个抽象方法,这样的话代码量太大了
原因二:假如我们在写完代码之后,客户改变了需求,要求在接口之中加一个新的方法,如果这个方法按以前jdk1.8之前那样,也就是这个方法如果必须为抽象方法时,我们就需要修改所有实现了这个接口的子类(所以就会造成牵一发而动全身)
所以我们就增加了这个新特性,也就是可以通过default修饰接口中的方法表示默认实现,也就表示这个被default修饰的方法是一般方法,也就是不是抽象方法,子类也就可以实现也可以不实现