什么是接口
程序员成长之旅 · 程序员成长之旅/Java学习/笔记 · 1104 字
语法
//声明一个接口
interface KanJia{
void seeHouse();//只声明,不做具体的方法,这有点和抽象类 相似.
void seeBedroom();
}
//调用一个接口
public class KanJiaDog implements KanJia{
//必须实现(重写)接口所实现的方法 这点和抽象类 相似.
public void seeHouse(){
}
public void seeBedroom(){
}
}
接口可以规定被继承子类实现一些功能,你可能会有些疑惑,这描述不就是在说抽象类吗?
其实,接口更适合实现一些扩展功能,也就是某些子类独有的功能,没有广泛性的功能,而抽象类相反,是用来规定子类都应该有的功能.
比如狗和猫继承于Animal,所有的动物都会奔跑和吃饭,但是有的狗会看家 有个狗不会, 有的猫会卖萌 有的猫不会,怎么办?难道把他们都写在Animal或者狗或者猫的子类里面吗
下面演示接口以及抽象类混用示例
public abstract class Animal {//在Animal定义所有继承次类的子类都需要实现run 和 eat
public abstract void run();
public abstract void eat();
}
public class Dog extends Animal{//定义普通的狗
@Override
public void eat() {
}
@Override
public void run() {
}
}
public class Cat extends Animal{//定义普通的狗
@Override
public void run() {
}
@Override
public void eat() {
}
}
这个时候我们的业务升级,需要会看家的狗和会卖萌的猫
这个时候 会看家的狗调用看家 会卖萌的猫调用卖萌即可
interface KanJia{ //定义出看家的接口
void seeHouse();
void seeBedroom();
}
interface MaiMeng{//定义出卖萌的接口
void MiaoMiao();
}
public class KanJiaDog extends Animal implements KanJia { //创建出来新的类 会看家的狗 同时继承Animal
@Override
public void run() {
}
@Override
public void eat() {
}
@Override
public void seeBedroom() {
}
@Override
public void seeHouse() {
}
}
public class MaiMengCat extends Animal implements MaiMeng {//创建出会卖萌的猫 同时继承Animal
@Override
public void eat() {
}
@Override
public void run() {
}
@Override
public void MiaoMiao() {
}
}
做一下测试
public class Test {
public static void main(String[] args){
Animal HaShiQi = new KanJiaDog();//我们需要哈士奇作为看家狗 先定义一个Animal类型 向上转型引用KanJiaDog的HaShiQi
KanJiaDog hashiqi = (KanJiaDog) HaShiQi;//向下转换将hashiqi强制转换为Kanjia狗类型引用KanJiaDog的hashiqi
hashiqi.seeHouse();//调用hashiqi的看家
}
}
附录 接口和抽象类的区别
| 参数 | 抽象类 | 接口 |
|---|---|---|
| 默认的方法实现 | 它可以有默认的方法实现 | 接口完全是抽象的。它根本不存在方法的实现 |
| 实现 | 子类使用extends关键字来继承抽象类。如果子类不是抽象类的话,它需要提供抽象类中所有声明的方法的实现。 | 子类使用关键字implements来实现接口。它需要提供接口中所有声明的方法的实现 |
| 构造器 | 抽象类可以有构造器 | 接口不能有构造器 |
| 与正常Java类的区别 | 除了你不能实例化抽象类之外,它和普通Java类没有任何区别 | 接口是完全不同的类型 |
| 访问修饰符 | 抽象方法可以有public、protected和default这些修饰符 | 接口方法默认修饰符是public。你不可以使用其它修饰符。 |
| main方法 | 抽象方法可以有main方法并且我们可以运行它 | 接口没有main方法,因此我们不能运行它。 |
| 多继承 | 抽象方法可以继承一个类和实现多个接口 | 接口只可以继承一个或多个其它接口 |
| 速度 | 它比接口速度要快 | 接口是稍微有点慢的,因为它需要时间去寻找在类中实现的方法。 |
| 添加新方法 | 如果你往抽象类中添加新的方法,你可以给它提供默认的实现。因此你不需要改变你现在的代码。 | 如果你往接口中添加方法,那么你必须改变实现该接口的类。 |
另外, 如果派生类继承的抽象类中实现了某个接口, 那么对于派生类来说, 就是普通的父类方法, 和普通在父类中的具体方法无异, 因为父类中一旦定义实现了接口, 就必须实现接口的具体方法, 另外的, 子类也无需必须实现父类所实现的接口(因为对子类来说那些就是普通的具体方法).