接口是什么
首先接口不是类,它本身是无法被实例化的,只有实现类可以被实例化。它更像是一种功能的描述,程序输入什么值,返回什么值,其本身更多是抽象的功能性表达。
修饰符
接口中的方法自动属于public
,如果实现了接口,那么必须覆写其所有的方法定义。
注意,实现类中需要显性声明实现的方法为public
.
在java8中,提供了default
关键字,它允许接口也可以拥有自己的方法体,并且要求其不是必须被实现的,这使得接口也可以具备一定的职能了。具体的例子可以查看java.util.function.Predicate
.
属性
接口可以定义属性,他们被指定为static
和final
.
public interface IBank {
String EXAMPLE = "我是一个例子,说明接口是可以定义属性的";
/**
* 办理信用卡
*/
void applyCreditCard();
}
多实现
java类不支持多继承,但是对于一个类来说,它可以实现多个接口.
- 证券接口
package com.tea.modules.java8.oop.polymorphism;
/**
* com.tea.modules.java8.oop.polymorphism <br>
* 证券接口
* @author jaymin
* @since 2021/8/20
*/
public interface Securities {
/**
* 开通证券账户
*/
void openSecurities();
}
- 银行接口
package com.tea.modules.java8.oop.polymorphism;
/**
* com.tea.modules.java8.oop.polymorphism <br>
* 银行接口
* @author jaymin
* @since 2021/7/1
*/
public interface IBank {
/**
* 办理信用卡
*/
void applyCreditCard();
}
- 实现类实现多接口
package com.tea.modules.java8.oop.polymorphism;
/**
* com.tea.modules.java8.oop.polymorphism <br>
* 中国银行
*
* @author jaymin
* @since 2021/7/1
*/
public class ChineseBank implements IBank,Securities {
@Override
public void applyCreditCard() {
System.out.println("办理信用卡送行李箱");
}
@Override
public void openSecurities() {
System.out.println("开通证券账户");
}
}
可以看到,ChineseBank实现了IBank,Securities接口,在需要用到IBank和Securities的地方,我们就可以注入ChineseBank作为实例进行操作了。
扩展接口
如果定义了很多独立的接口,你希望通过一个新的接口来统一这些接口,那么你可以使用interface
+extends
关键字来完成这件事.
public interface Securities extends IBank {
/**
* 开通证券账户
*/
void openSecurities();
/**
* 提醒散户跑路
*/
static void prompt(){
System.out.println("崩盘了,速度清仓!!!");
}
}
image.png实现了
Securities
的类也必须实现IBank
的方法声明,你可以在JDK的源码中看到很多这样的案例.
静态方法
package com.tea.modules.java8.oop.polymorphism;
/**
* com.tea.modules.java8.oop.polymorphism <br>
* 证券接口
* @author jaymin
* @since 2021/8/20
*/
public interface Securities {
/**
* 开通证券账户
*/
void openSecurities();
/**
* 提醒散户跑路
*/
static void prompt(){
System.out.println("崩盘了,速度清仓!!!");
}
}
通过
Securities.prompt
可以完成静态方法调用.
接口与抽象类
特性 | 接口 | 抽象类 |
---|---|---|
组合 | 新类可以组合多个接口 | 只能继承单一抽象类 |
状态 | 不能包含属性(除了静态属性,不支持对象状态) | 可以包含属性,非抽象方法可能引用这些属性 |
默认方法 和 抽象方法 | 不需要在子类中实现默认方法。默认方法可以引用其他接口的方法 | 必须在子类中实现抽象方法 |
构造器 | 没有构造器 | 可以有构造器 |
可见性 | 隐式 public | 可以是 protected 或友元 |
网友评论