1. 接口概述
(1) Java提供了一个关键字 interface,用这个关键字可以定义接口;
(2)格式: public interface 接口名{
//成员变量(常量)
//成员方法(抽象方法)
}
public interface A {
//成员变量(接口默认为常量-public static final)
String NAME = "卡莎";
//成员方法(接口默认为抽象方法-public abstract)
void show();
}
2. 接口实现
(1) 接口不能创建对象;接口是用来实现的(implements),实现接口的类被称为实现类
(2)格式:修饰符 class 实现类名 implements 接口1, 接口2...{
........
}
(3) 一个类可以实现多个接口,实现类实现多个接口,必须重写完全部接口的全部抽象方法,否则实现类需要定义成抽象类
//接口B
public interface B {
void method();
void method2();
}
//接口C
public interface C {
void m1();
void m2();
}
//实现类D 实现接口B C 则必须实现全部的抽象方法
public class D implements C,B{
@Override
public void method() {
}
@Override
public void method2() {
}
@Override
public void m1() {
}
@Override
public void m2() {
}
}
public static void main(String[] args) {
D d = new D();
d.m1();
d.m2();
d.method();
d.method2();
}
3. 使用接口的好处
(1) 弥补了类单继承的不足,一个类可以同时实现多个接口。
(2) 让程序可以面向接口编程,灵活方便的实现业务
4. 接口中新增的三种方法
JDK8开始,接口中新增的三种方法:增强接口的能力,便于项目的扩展和维护
//接口A
public interface A {
/*
* 第一种方法:默认方法-必须使用default修饰,默认会被public修饰
* 有方法体,实例方法:对象的方法,必须使用对象来访问
* */
default void show(){
System.out.println("默认方法");
//访问私有方法
show2();
}
/*
* 第二种方法:私有方法:必须使用private修饰(JDK9开始)
* 有方法体,实例方法:对象的方法,可以在本类中的的其他默认方法或私有方法中访问
* */
private void show2(){
System.out.println("私有方法");
}
/*
* 第三种方法:静态方法:必须使用static修饰,默认会被public修饰
* 有方法体,可以使用接口名.静态方法 来调用 如 A.show3()
* */
static void show3(){
System.out.println("静态方法");
}
}
//类B实现接口A
public class B implements A {
}
public class Test {
public static void main(String[] args) {
// 1.默认方法
B b = new B();
b.show();
//3.调用静态方法
A.show3();
}
}
5. 接口的多继承
一个接口可以同时继承多个接口:便于实现类实现
格式: public interface C extends B,A{.....}
public interface A {
void method();
}
public interface B {
void method2();
}
public interface C {
void method3();
}
public interface D extends A,B,C{
}
public class E implements D{
//重写接口A中的抽象方法
@Override
public void method() {
}
//重写接口B中的抽象方法
@Override
public void method2() {
}
//重写接口C中的抽象方法
@Override
public void method3() {
}
}
6. 接口使用的注意事项
(1) 一个接口继承多个接口,如果多个接口中存在方法名冲突,则此时不支持多继承
(2) 一个类实现多个接口,如果多个接口中存在方法名冲突,此时不支持多实现
(3) 一个类继承了父类,又同时实现了接口,父类中和接口中用同名的默认方法,实现会优先使用父类的
(4) 一个类实现类多个接口,多个接口中存在同名的默认方法,可以不冲突,这个类重写该方法即可