Java中的接口
一、Java接口的概述:
Java的接口(interface)是一个由抽象方法和常量值的定义的集合。
接口无法被实例化,实现接口子类必须的重写接口中的所有抽象方法,否则这个类要被声明为抽象类。
接口就是规范,定义的是一组规则,体现了现实世界中“如果你是。。则只能。。”的思想。
接口的本质就是契约,制定好后必须遵守相关的规范。
面向对象的精髓就是对对象的抽象化,而Java中最能体现这一点的就是接口。这也是为什么我们讨论设计模式都只针对具备了抽象能力的语言(C++, Java, C# 等),就是因为设计模式所研究的,实际上就是如何合理的抽象化。
二、接口的声明:
修饰符 interface 接口名称 {
//声明变量
//声明抽象方法
}
示例:
package com.zctou.oop.demo11;
public interface UserService {
//接口演示
//接口关键字 interface
//接口的属性 默认为 public static final,是常量,要赋初值
int age=99 ;
//接口中方法的默认修饰符为 public abstract
//增删改查
void add (String name);
void delete(String name);
void update(String name);
void query(String name);
static void eat(){
System.out.println("UserService接口用static实现方法~");
}
default void shout() {
System.out.println("UserService接口用default实现方法");
}
}
1、接口的声明的关键字是
interface
,所有的接口都是抽象的。2、接口中声明的变量都是常量,必须赋值,默认隐式定义为
public static final
。3、接口中声明的方法都为抽象方法,且不能为实体。默认隐式定义为
public abstract
。4、JDK1.8后,接口中新增了两种情况可以有方法体的定义:
A:带仅static修饰符的方法,如:
static void eat(){ System.out.println("UserService接口用static实现方法~"); }
B: 仅带default修饰符的方法,如:
default void shout() { System.out.println("UserService接口用default实现方法"); }
两种方法都默认是
public
,且都可以带方法体,default
和static
关键字相当于给了接口提供一个默认实现方法的权限,让子类可以不重写这个方法。
三、接口的实现:
实现接口的类不能称之为继承接口,只是用于实现接口中的抽象方法。当一个类要实现接口时,必须重写接口中的所有抽象方法(没被实现的方法),否则这个类要被声明为抽象类。
实现接口的关键字是 implements
,其语法格式如下:
修饰符 class 类名 implements 接口名称{}
如:
public class UserServiceImpl implements UserService{
//具体类的方法及属性
}
implements
放在class和类名后。如果实现接口的类没用实现接口的抽象方法,那么这个类只能声明为抽象类。同理,如果实现接口的类被声明为抽象类,这个类就没必要去实现接口的抽象方法。
类在实现接口的方法时,不能抛出强制性异常,强制性异常只能在接口或继承接口的类中抛出。
四、接口的继承:
和类的继承类似,接口也可以继承接口,使用关键字extends
,子接口继承父接口的方法。
方法格式:
修饰符 interface 子接口名 extends 父接口名 {
//子类抽象方法
}
示例:
public interface PrimaryUserService extends UserService{ //继承父接口 UserService
void primaryUsersAccounts();
}
这样,子接口 PrimaryUserService
就比父接口多了一个方法,加上继承父接口的抽象方法6个,一个类要实现PrimaryUserService
,就要重写7个抽象方法。
五、接口的多继承:
前面多次提到,Java的类只有单继承,没有多继承,Java中类的多继承是不合法的。便接口不一样,接口允许多继承的。利用接口的多继承特点,还可以间接性的实现类的多继承(接口实现类的伪多继承)。
接口多继承的语法:
修饰符 interface 子接口名 extends 接口名[,接口名2,接口名3...] {}
如:
public interface PrimaryUserService extends UserService,Timer{
void primaryUsersAccounts();
}
接口可以多继承,且这些继承之间不必在于关系链(父子关系),接口可以任意继承接口,同时接口也可以被任意接口继承,也就是说继承和被继承的接口都没任何关系要求。
实现类的多继承
语法格式:
修饰符 class 类名 implements 接口1,接口2,接口3... {
}
如:
public class UserServiceImpl implements PrimaryUserService,Timer{
//重写所有接口的方法
}
六、接口、类、抽象类的区别
- 普通类:没有抽象类,只有具体的实现,声明类的关键字: class
- 抽象类:既有具体实现,也有抽象方法(约束),声明抽象类的关键字: abstract class
- 接口:只有规范(约束),JDK1.8后 添加
static
和default
两种可以有方法体的方法。声明接口的关键字:interface 继承与实现:
- 继承:抽象类和接口的关键字都是
extends
; 实现:
- 实现抽象类关键字:
extends
- 实现接口的关键字是:
implements
- 实现抽象类关键字:
- 继承:抽象类和接口的关键字都是