一、概述
- 接口,是Java语言中一种引用类型,是方法的集合,如果说类的内部封装了成员变量、构造方法和成员方法,那么接口的内部主要就是封装了方法,包含抽象方法(JDK
7及以前),默认方法和静态方法(JDK 8),私有方法(JDK 9)。 - 接口的定义,它与定义类方式相似,但是使用 interface 关键字。它也会被编译成.class文件,但一定要明确它并
不是类,而是另外一种引用数据类型
引用数据类型:数组,类,接口。
定义格式
public interface 接口名{
//默认方法 public default
//静态方法 public static
//私有方法 private
//抽象方法 public abstract
}
1.1 默认方法 default
- 接口的默认方法 可以通过通过实现类对象调用
- 接口的默认方法,可以覆盖重写
public default 返回值类型 方法名称(参数){
方法体
}
1.2 静态方法 static
- 接口的默认方法,通过接口名直接访问
public static 返回值类型 方法名称(参数){
方法体
}
1.3 私有方法 private
- 接口的私有方法,只能在接口内访问
1. 普通私有方法
解决多个默认方法(同一个接口)之间代码重复问题
private 返回值类型 方法名(){
方法体
}
2. 静态私有方法
解决多个静态方法(同一个接口)之间代码重复问题
private static 返回值类型 方法名(){
方法体
}
1.4 抽象方法
- 接口的抽象方法,必须在实现类中覆盖重写
修饰符必须为 public abstract(可以省略不写)
public abstract 返回值类型 方法名();
1.5 接口的“常量”
public static final 数据类型 常量名 = 数据值
//必须使用 public static final 修饰
public interface MyInterfaceConst {
//一旦赋值 无法改变
//必须赋值
//大写 下划线
public static final int NUM_OF = 10;
}
1.6 实现类格式 implements
public class 类名 implements 接口名 {
// 重写接口中抽象方法【必须】
// 重写接口中默认方法【可选】
}
1.7 接口的多实现
- 在继承体系中,一个类只能继承一个父类。而对于接口而言,一个类是可以实现多个接口的,这叫做接口的多实现。并且,一个类能继承一个父类,同时实现多个接口。
public class 类名 [extends 父类名] implements 接口名1,接口名2,接口名3... {
// 重写接口中抽象方法【必须】
// 重写接口中默认方法【不重名时可选】
}
多实现中 静态方法重名
- 接口中,存在同名的静态方法并不会冲突,原因是只能通过各自接口名访问静态方法。
多实现中 默认方法重名
- 必须在实现类中重写一次
多实现中 抽象方法重名
- 必须在实现类中重写一次
多实现中 优先级问题
- 当一个类,既继承一个父类,又实现若干个接口时,父类中的成员方法与接口中的默认方法重名,子类就近选择执 行父类的成员方法。
1.8 接口的多继承
-
子接口继承(extends)父接口的方法。如果父接口中的默认方法有重名的,那么子接口需要重写一次。
-
子接口重写默认方法时,default关键字可以保留。
-
子类重写默认方法时,default关键字不可以保留
注意事项
- 接口没有静态代码块和构造方法 (不能创建对象)
二 、补充
接口作为成员变量
public interface Skill {
//释放技能的抽象方法
public abstract void use();
}
public class Hero {
private String name;
private Skill skill;
public Hero() {
}
public Hero(String name, Skill skill) {
this.name = name;
this.skill = skill;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Skill getSkill() {
return skill;
}
public void setSkill(Skill skill) {
this.skill = skill;
}
}
public class Demo04Main {
public static void main(String[] args) {
Hero hero = new Hero();
hero.setName("杨戬");
//使用匿名内部类创建Skill类型的变量
//也可以用接口的实现类
Skill skill = new Skill() {
@Override
public void use() {
System.out.println("biu~biu~biu~");
}
};
hero.setSkill(skill);
System.out.print(hero.getName());
//hero.getSkill()获取的是Skill对象的引用(地址)
hero.getSkill().use();
}
}