接口
1. 基本定义
-
定义:当抽象类中的方法都是抽象方法的时候,建议将该类定义为接口
-
接口特点:耦合性低、规则性强、扩展性强等,接口与接口之间可以多继承,类与接口之间可以多实现
-
存在的意义:主要是用于定义规范/规则。定义的是可能用到的功能,现在不用不代表以后不用
-
关键词:interface(接口)、implements(实现)
注意事项:
- 接口中的方法一定是抽象方法,变量一定是静态的常量
(因为接口不存在对象,所有没有变量,只可以是静态的常量,无需对象可以直接通过类名调用)
- 接口中的常量默认修饰符是public static,方法的默认修饰符是public abstract。可以省略,但是我们推荐把注释和修饰符都写上
2. 接口的多继承和多实现
第一、类与接口之间的多实现
interface Food {
void eat();
void print();
}
interface Drinks {
void drink();
void print();
}
class A {
public void Full() {
};
}
//原则,先继承后实现
class Dinner extends A implements Food, Drinks {// 这个操作是一个继承
@Override
public void eat() {
// TODO Auto-generated method stub
}
@Override
public void drink() {
// TODO Auto-generated method stub
}
public void print() {
}
// 因为没有方法体,不会出现调用不明确的情况,只要调用成功即可,从A中还是B中调用show方法没有区别,所以接口才能实现多实现A,B
}
}
第二,接口之间形成继承体系
// 酒
interface Liquor {
// 让人喝醉
void inebriation();
}
// 金酒
interface Gin extends Liquor {// 接口间的继承体系
// 可以入药
void medicine();
}
// 哥顿牌的金酒
class Goudon implements Gin {//
public void price() {
}
@Override
public void inebriation() {
}
@Override
public void medicine() {
}
}
第三、接口与接口之间多继承
// 酒
interface Liquor {
// 让人喝醉
void inebriation();
}
// 烈酒
interface Spirit {
// 酒精度
void proof();
}
// 金酒
interface Gin extends Liquor, Spirit { //接口间的多继承关系
// 可以入药
void medicine();
}
// 哥顿牌的金酒
class Goudon implements Gin {//
public void price() {
}
@Override
public void inebriation() {
}
@Override
public void medicine() {
}
@Override
public void proof() {
}
}
3. 接口中的默认方法
-
接口是由抽象类延伸过来的,抽象类是由继承延伸过来的,总之就是接口本质也是继承的概念。抽象类中定义的是该类事物的公共的属性及方法,接口中定义的是额外的功能及属性;
-
继承的目的:将公共的属性和方法抽离出来以简化代码,接口也具备该目的
-
接口的目的:可以定义额外的功能,也可以定义公共的功能(在抽象类的基础上,如果你还需要所有的子类有一个共同的功能,就使用默认功能)
-
接口默认方法的作用:当多个类中都是用到了同一个功能的时候,那么该功能相当于就是这一类事物的共有方法,可以直接使用
interface Liquor {
// 额外的共同点
default void alcohol() {
System.out.println("都是酒精饮料");
}
//共同的功能酒精度
void proof();
}
class Gin implements Liquor {
public void origin() {
System.out.println("产自英格兰");
}
@Override
public void proof() {
System.out.println("这是42°的酒");
}
}
class Rum implements Liquor {
public void material() {
System.out.println("使用甘蔗糖蜜酿造");
}
@Override
public void proof() {
System.out.println("这是40°的酒");
}
}
最后的输出结果中物流是在类Gin还是类Rum中的对象都可以调用默认方法alcohol,然后输出为都是酒精饮料
如果一个类继承的两个接口中有同样的默认方法,使用哪个是可选的,但是必须进行选择和重写
interface Liquor {
// 额外的共同点
default void alcohol() {
System.out.println("都是酒精饮料");
}
//共同的功能酒精度
void proof();
}
interface Liquor2 {
default void alcohol() {
System.out.println("第二接口的默认方法");
}
void proof();
}
在使用的时候
class Rum implements Liquor,Liquor2 {
@Override
public void alcohol() {
Liquor.super.alcohol();
//如果你将Liquor改为Liquor2,输出就是"第二接口的默认方法"
//此处的super就是指代子类对象,因为没有对象方法体没法实现
}
}
总结(抽象类和接口之间的区别):
1、接口中都是抽象方法,抽象类中还可以有普通方法
2、抽象类中可以有构造器,接口中没有
3、抽象类中定义的是公共的功能,接口中定义的额外的功能
4、不同于抽象类,接口可以实现接口之间的多继承