1.什么是接口
接口从语法角度来说像是一种特殊的抽象类,两者都可以包含抽象方法且不能创建对象。接口是一种标准,通常用来约束其子类(实现类)应具备的功能。
优点:
- 程序的耦合度降低
- 更自然的使用多态
- 设计与实现完全分离
- 更容易搭建程序框架
- 更容易更换具体实现
2.接口的定义
使用interface 关键字定义接口
语法:interface 接口名{ }
//1.接口中的属性都是公开静态常量,隐式使用public static final 修饰。
//2.接口中的方法都是公开抽象方法,隐式使用public abstract修饰
interface MyInterface{
public static final int NUM = 3;//常量全英文大写
int AGE = 18;//默认被public static final修饰
public abstract void test();
void test2();//默认被public abstract修饰
}
JDK1.8以前接口中只能有公有静态常量和公有抽象方法(如上代码)
JDK1.8以后接口中可以定义公有静态方法和被default修饰的默认方法(代码如下)
//1.接口中的属性都是公开静态常量,隐式使用public static final 修饰。
//2.接口中的方法都是公开抽象方法,隐式使用public abstract修饰
interface MyInterface{
public static final int NUM = 3;//常量全英文大写
int AGE = 18;//默认被public static final修饰
public abstract void test();
void test2();//默认被public abstract修饰
//JDK1.8之后可以定义公有静态方法和默认方法
public static void prt(){//可通过 “接口名.方法名”调用
System.out.println("这是一个静态方法");
}
default void prt2(){//需要通过此接口的实现类对象调用
System.out.println("这是接口中定义的默认方法");
}
}
3.接口与抽象类的区别
相同点:
- 可编译成字节码文件。
- 不能创建对象。
- 可以作为引用类型。
- 具备0bject类中所定义的方法。
不同点:
- 所有属性都是公开静态常量,隐式使用public static final修饰。
- 所有方法都是公开抽象方法,隐式使用public abstract修饰。
- 没有构造方法、动态代码块、静态代码块。
4.接口的规范
任何类在实现接口时,必须实现接口中所有的抽象方法,否则此类为抽象类
实现接口中的抽象方法时,访问修饰符必须是public。
5.接口引用
同父类一样,接口也可声明为引用,并指向实现类对象。
注意:
- 仅可调用接口中所声明的方法,不可调用实现类中独有的方法。
- 可强转回实现类本身类型,进行独有方法调用。
6.接口的多态
声明一个接口,实例化他的实现类
MyInterface myInterface = new MyInterfaceImpl();
但是不同引用类型,仅可调用自身类型中声明的方法。
对于称呼的纠正;
- 某个类实现了某个接口; 实现类 -> 父接口;
- 某个类继承了一个类; 子类(基类) -> 父类(超类)
7.常见关系
类/接口:
-
类与类之间的关系:
1. 可以是继承关系, extends来描述继承关系; 单继承 -
类与接口之间的关系:
1. 是一个实现的关系,implements 某个类实现了多个接口; 多实现
2. 语法: A implements IB1,IB2,IB3…{} -
接口与接口之间的关系:
1. 接口继承接口; 多继承
2. extends关键字来描述;
3. 语法:A extends IB1,IB2,IB3…{},
4. 接口与接口之间继承会将我们所有的属性,抽象方法全部继承过来
接口继承多接口问题:
属性名相同:
一个接口继承多个接口的时候,如果多个接口里面常量名字一样;不会继承
多个接口默认方法名字都相同:
不允许的;如果有必须要在子类接口里面进行重写;
8.接口回调与核心
先有使用者,再有实现者,称之为回调
接口核心点: 先存在接口[指定一个接口]; 实现者 使用者 都遵从接口开发;
//充钱的接口
public interface Charge {
//充钱的方法
public boolean pay(int money);
}
//充钱接口的使用者
public class Tecent {
//谁要使用服务,谁就来真正的充钱
public void service(Charge cg) {
System.out.println("想要服务,请先充值");
boolean bl = cg.pay(200); //服务的使用者
if(bl) {
System.out.println("收到钱了,马上办事");
}
}
}
//充钱接口的实现者
public class MyGame implements Charge{
//你的这个游戏,引导别人去充钱;
public boolean pay(int money) {
//玩家点击按钮,然后调用我游戏里面的充值服务;
System.out.println("请充钱"); //服务的提供者
return true;
}
}