接口
接口现实概念
生活中的实体接口接触最多的莫过于电子设备的的USB接口,手机设备的type-C接口。这些接口的在连接不同设备时会添加不同的功能,连接U盘获得额外存储空间功能扩展,连接音响获得音乐播放功能扩展,连接屏幕设备获得图像显示功能扩展。
如果我们在设计设备之初,为可能的所有外接设备都单独设计一种接口,设备就会臃肿不堪。所以,考虑于此,设置一种公共接口,拥有提供电源和数据读写的基本功能,而后再在软件层面对各种设备实现特异性配置。
Java接口体现
接口(interface),在java中是一种抽象类型,可以理解为抽象方法的集合,接口是对类更高抽象。
可以这样理解,不同的类之间,具有相同的行为方法,因此,把该方法抽象出去,降低代码之间的耦合性;
类的区别:
1,接口只能被实现(继承)为类(只能被声明为变量类型,但不能new它,因此也是作为多态性的一种体现)
2,接口中的属性是全局的静态常量,即public static final。
3,接口中的方法必须是抽象方法(会隐式包含public abstract)。
4,接口可以继承接口(使用关键字extends)
4,接口支持多继承。
接口的特性:
1,抽象类中的方法可以有方法体,但是接口中不能;
2,成员变量可以是各种类型的,但只能是public static void
3,接口中不能含有静态代码块和静态方法,但抽象类中可以有。
4,接口可看做是一种类,因此在程序中调用接口中的方法可以通过编译,而后在使用的时候可以再传入一个 “实现了接口并对抽象方法的做了实现的类的对象,实现具体的功能
注:JDK1.8后, 接口中可以有静态方法和方法体了
JDK1.8后,接口中允许包含具体实现的方法(称之为默认方法)
JDK1.9后,接口可以定义private方法,使得复用代码不会把方法暴露出去
接口实现示例
//登录页面中,不同登录方式,抽象为简单的Login()方法作为接口,对于不同的登录方式,只需要实现该接口中的Login()为一个登录方式类即可,这样在后续的发展中可以很容易的添加新的登录方法。
public interface LoginInterface{
void Login();
}
public class UserIndex{
public void userLogin(LoginInterface lo){
lo.Login();
}
//考虑另外一种写法,将接口变量定义在函数之外,这样的好处就是,如果多次调用登录方法,不需要重新写入对象
public LoginInterface lo;
public void configUserLogin(LoginInterface lo){ //一次定义好该类的登录方式
this.lo=lo; //再要用就不用总传实现类了
}
public void userLogin(){
lo.Login();
}
}
public class EmailLogin implements LoginInterface{
@Override
public void Login(){
System.out.println("邮箱登录成功");
}
}
public class PhoneNumLogin implements LoginInterface{
@Override
public void Login(){
System.out.println("手机登录成功");
}
}
public class Test{
public static void main(String[] args){
UserIndex ui=new UserIndex();
//邮箱登录方法
ui.userLogin(new EmailLogin);
//由于接口中只有一个抽象方,因此可以使用lambda表达式
ui.userLogin(()->System.out.println("邮箱登录成功"));
//手机登录
ui.userLogin(new PhoneNumLogin();
//lambda
ui.userLogin(()->System.out.println("手机登录成功"));
}
}
另:
标记接口:就是啥都没有,充当一个标记的作用
建立一个公共的父接口,用于一个给JVM一个指示作用
向一个类添加数据类型标记
public interface EventListener{}